mybatis源码解析一:入口准备工作
看源码主要是要有一个入口,这里首先去mybatis的官网https://mybatis.org/mybatis-3/index.html可以观看官方文档,源码的github的地址https://github.com/mybatis/mybatis-3,可以下载到本地,写一个demo一步一步debug,看看执行的方法,我就是这么看mybatis的源码,在源代码中写demo可以在源码码上进行注释,我采用的mybatis3.5.6。
demo实例
mybatis-config.xml配置
<?xml version="1.0" encoding="gbK" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true"/> <!--配置自己需要连接的数据库-->
<property name="username" value="root"/>
<property name="password" value="*******"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/apache/ibatis/mytest/dao/UserMapper.xml" />
</mappers>
</configuration>
我在源码中创建了mytest目录:
数据库表:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qjYTNdk9-1607053784261)(C:\study\mybatis源码分析\img\user.PNG)]
userMapper:
public interface UserMapper {
List<User> getUserList(Integer id); // 一个接口,返回User类型的List
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.ibatis.mytest.dao.UserMapper">
<select id="getUserList" resultType="org.apache.ibatis.mytest.pojo.User">
select * from user where id = #{id};
</select>
</mapper>
User:
package org.apache.ibatis.mytest.pojo;
/**
* @author peng
*/
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
}
MybatisUtils:
package org.apache.ibatis.mytest.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @author peng
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 1.获取sqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 创建执行SQL的对象
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
MyTest:
package org.apache.ibatis.mytest.utils;
import org.apache.ibatis.mytest.dao.UserMapper;
import org.apache.ibatis.mytest.pojo.User;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
/**
* @author peng
*/
public class MyTest {
public static void main(String[] args) {
// 获得SqlSession
SqlSession sqlSession = MybatisUtils.getSqlSession();
User u = (User) sqlSession.selectOne("org.apache.ibatis.mytest.dao.UserMapper.getUserList",1);
System.out.println(u);
// getMapper
UserMapper userDao = sqlSession.getMapper(UserMapper.class);
List<User> userList = userDao.getUserList(1);
for (User user:userList) {
System.out.println(user);
}
sqlSession.close();
}
}
运行一下可以跑的通,这样准备工作就做完了,下面可以进行调试看源代码的追踪了。