目录
1、概述
国内数据库访问层从之前火爆的Hibernate到现在绝大部分公司都用Mybatis,倒也不是说Mybatis比Hibernate优秀,看看现在Spring Data JPA底层的支持还是Hibernate,只是国内大小厂都投入到Mybatis的怀抱中,导致国内现在的Hibernate用的越来越少。所以很有必要深入了解一下Mybatis的源码,这样我们开发起来才会更加的得心应手。Mybatis的使用博主也用了三年多的时间,相比于Hibernate,Mybatis确实更容易上手,使用起来也更加的灵活。下面就从项目的搭建到源码分析一步一步深入了解Mybatis。
2、项目搭建
项目的搭建我们可以参照官方文档,中文文档地址:官方文档。本次基于mybatis-3.5.6.jar版本搭建分析,不加入Spring的整合。参考官方文档,我们只需要创建mybatis-config.xml和mapper.xml文件以及对应的mapper接口。为了方便大家阅读,搭建源码如下:
1、mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/mapper/WxUserMapper.xml"/>
</mappers>
</configuration>
2、WxUserMapper.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="mapper.WxUserMapper">
<resultMap id="wxUser" type="pojo.WxUser">
<result column="user_id" property="userId" jdbcType="INTEGER" javaType="Integer"/>
<result column="user_account" property="userAccount" jdbcType="VARCHAR" javaType="String"/>
<result column="user_createtime" property="userCreatetime" jdbcType="TIMESTAMP"
javaType="java.time.LocalDateTime"/>
</resultMap>
<sql id="userColumn">
user_id,
user_account,
user_createtime
</sql>
<select id="getWxUserById" parameterType="java.lang.String" resultMap="wxUser">
SELECT
<include refid="userColumn"/>
FROM `wx_user`
where
user_id = #{userId}
</select>
</mapper>
3、WxUserMapper
public interface WxUserMapper {
WxUser getWxUserById(String userId);
}
4、MybatisTest
public class MybatisTest {
public static void main(String[] args) {
try {
String resource = "mybatis-config.xml";
// 通过classLoader获取到配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 把配置文件和mapper文件封装到Configuration实体类
SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 动态代理方式
WxUserMapper mapper = sqlSession.getMapper(WxUserMapper.class);
WxUser user = mapper.getWxUserById("8");
System.out.println("通过动态代理返回结果" + user.getUserAccount());
// 不用动态代理的方式直接statement获取查询
WxUser u2 = sqlSession.selectOne("mapper.WxUserMapper.getWxUserById", "8");
System.out.println("通过statement返回结果" + u2.getUserAccount());
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、源码分析
3.1 SqlSessionFactory的构建
由于SqlSessionFactory初始化需要的参数比较多,所以Mybatis这里采用了构造者模式通过xml的方式实例化一个SqlSessionFactory对象。具体的属性和配置可以查看官方文档。通过查看SqlSessionFactoryBuilder的build方法分析源码,主要逻辑看代码注释(最好结合源码对