首先Mybatis最重要的几个类和接口
class Resources(加载配置文件的类)
class SqlSessionFactoryBuilder(创建SqlSessionFactory工厂类)
interface SqlSessionFactory(创建SqlSession 工厂)
interface SqlSession extends Closeable(SqlSession 内部封装了大量的执行sql语句的方法)
第一步:搭建环境 导入依赖
目录结构
<dependencies>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--解析xml-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!--Jaxen是一个Java编写的开源的XPath库-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
</dependencies>
第二步:编写主配置文件mybatis-config.xml
第三步:编写实体类和接口(getter,setter略)
public class User implements Serializable {
?
private Integer id;
private String name;
private String email;
private String phone;
private Integer gender;
private String password;
private Integer age;
private Date create_time;
private Date update_time;
public interface UserMapper {
?
//查询方法
List<User> findAll() throws Exception;
?
User findById(Integer id) throws Exception;
?
//模糊查询
List<User> findUserLike(String value) throws Exception;
?
//增加方法
void addUser(User user) throws Exception;
?
//增加方法
void addUser2(Map<String,Object> map) throws Exception;
?
//删除方法
void deleteUser(Integer id) throws Exception;
?
//修改方法
Integer updateUser(User user)throws Exception;
}
第四步:编写接口对应的配置文件
第五步:编写测试类
package com.xuan.mapper;
?
import com.xuan.mybatis.io.Resources;
import com.xuan.mybatis.sqlsession.SqlSession;
import com.xuan.mybatis.sqlsession.SqlSessionFactory;
import com.xuan.mybatis.sqlsession.SqlSessionFactoryBuilder;
import com.xuan.pojo.User;
?
import org.junit.Test;
?
import java.io.InputStream;
import java.util.List;
?
/**
* xuan
* 2020/7/12
* 1870136088@qq.com
**/
public class UserMapperTest {
?
下面的都是关键 按照爆红一步步排错
第六步:编写Resources类
package com.xuan.mybatis.io;
?
import java.io.InputStream;
?
public class Resources {
?
//根据传入参数获取一个字节输入流
public static InputStream getResourceAsStream(String filePath){
//通过该类的字节码文件获取到类加载器再获取到该类的流关联到文件
return Resources.class.getClassLoader().getResourceAsStream(filePath);
}
}
编写SqlSessionFactoryBuilder类 并通过其build方法获取到SqlSession对象
package com.xuan.mybatis.sqlsession;
?
import com.xuan.mybatis.config.Configuration;
import com.xuan.mybatis.sqlsession.Default.DefaultSqlSessionFactory;
import com.xuan.utils.XMLConfigBuilder;
?
import java.io.InputStream;
import java.sql.Connection;
?
public class SqlSessionFactoryBuilder {
?
/**
* 创建一个build方法 传入字节输入流获取一个SqlSessionFactory工厂对象
* 根据参数的字节输入流构建一个SqlSessionFactory工厂
* 涉及到要解析xml
* @param config
* @return
*/
public SqlSessionFactory build(InputStream config){
Configuration cfg = XMLConfigBuilder.loadConfiguration(config);
return new DefaultSqlSessionFactory(cfg);
}
}
第八步:编写SqlSessionFactory接口以及其实现类
package com.xuan.mybatis.sqlsession;
?
/**
* xuan
* 2020/7/14
* 1870136088@qq.com
**/
public interface SqlSessionFactory {
?
/**
* 用于创建SqlSession对象
* @return
*/
SqlSession openSession();
}
package com.xuan.mybatis.sqlsession.Default;
?
import com.xuan.mybatis.config.Configuration;
import com.xuan.mybatis.sqlsession.SqlSession;
import com.xuan.mybatis.sqlsession.SqlSessionFactory;
?
/**
* xuan
* 2020/7/14
* 1870136088@qq.com
**/
public class DefaultSqlSessionFactory implements SqlSessionFactory {
?
?
private Configuration cfg;
public DefaultSqlSessionFactory(Configuration config){
this.cfg=config;
}
?
第九步:编写SqlSession以及实现类(这个类的核心是创建mapper接口的代理对象)
package com.xuan.mybatis.sqlsession;
?
/**
* xuan
* 2020/7/14
* 1870136088@qq.com
**/
//mybatis的核心类 可以创建mapper接口的代理对象
public interface SqlSession {
?
/**
* 根据参数创建一个代理对象
* @param mapperInterfaceClass
* @param <T>
* @return
*/
<T> T getMapper(Class<T> mapperInterfaceClass);
?
/**
* 释放资源
*/
void close();
}
package com.xuan.mybatis.sqlsession.Default;
?
import com.xuan.mybatis.config.Configuration;
import com.xuan.mybatis.config.Mapper;
import com.xuan.mybatis.sqlsession.SqlSession;
import com.xuan.utils.DataSourceUtil;
import com.xuan.utils.Executor;
?
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
?
/**
* xuan
* 2020/7/14
* 1870136088@qq.com
**/
public class DefautSqlSession implements SqlSession {
private Configuration cfg;
private Connection connection;
public DefautSqlSession(Configuration cfg) {
this.cfg=cfg;
this.connection= DataSourceUtil.getConnection(cfg);
}
?
/**
* 创建代理对象
* 代理对象第一个参数是类加载器(你代理谁就用谁的类加载器)
* 第二个参数是接口数组 由于代理的对象本身就是一个数据所以直接写就行
* 第三个参数就是InvocationHandler 里面写如何代理
* @param mapperInterfaceClass
* @param <T>
* @return
*/