您的位置:首页 > 大数据 > 人工智能

Mybaitis 源码分析

2020-07-24 23:21 232 查看

前提文件:对应项目为mybatis-01
其中配置xml文件为

<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://localhost:3306/mybatis?useSSL=true&amp;serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource></environment>
</environments>
<mappers>
<mapper resource="com/wang/Dao/UserMapper.xml"/>
</mappers></configuration>

Dao接口层Mapper.xml为:

<mapper namespace="com.wang.Dao.UserMapper">
<select id="getUserLike">
select * from mybatis.user where like #{value}
</select>
<select id="getUserList" resultType="com.wang.pojo.User">
select * from mybatis.user;
</select>
<select id="getUserById" resultType="com.wang.pojo.User" parameterType="int">
select * from mybatis.user where id = #{id};
</select>
<select id="getUserById2" resultType="com.wang.pojo.User" parameterType="map">
select * from mybatis.user where id = #{id} and name=#{name};
</select>
<!--    对象中的属性可以截止取出来-->
<insert id="addUser" parameterType="com.wang.pojo.User" >
insert into mybatis.user (id, name ,pwd) values (#{id}, #{name}, #{pwd});
</insert>
<insert id="addUser2" parameterType="map" >
insert into mybatis.user (id, name ,pwd) values (#{userid}, #{username}, #{userpwd});
</insert>
<update id="updateUser" parameterType="com.wang.pojo.User">
update mybatis.user set name=#{name },pwd=#{pwd} where id=#{id};
</update>
<delete id="deleteUser" parameterType="int">
delete from mybatis.user where id=@{id}
</delete>
</mapper>

技术拆解
首先对mybatis进行技术拆解,可分为如下部分:

一、对数据源部分进行分析:该部分整体的解析步骤为:

mybatis是如一步一步何处理数据源的:
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.Reader)
>org.apache.ibatis.builder.xml.XMLConfigBuilder
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
>org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement
>org.apache.ibatis.builder.xml.XMLConfigBuilder.dataSourceElement
>org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory.getDataSource
>org.apache.ibatis.session.Configuration.setEnvironment   #####这里是set
总结:解析xml文件,将文件内容给到Java对象Configuration,通过setEnvironment给到的

第一步:

可以得到如下内容:

<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://localhost:3306/mybatis?useSSL=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments><mappers>
<mapper resource="com/wang/Dao/UserMapper.xml"/>
</mappers></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://localhost:3306/mybatis?useSSL=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>

第三步:得到该内容

<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>

第四步得到该内容:

<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;serverTimezone=GMT%2B8&amp;useUnicode=true&amp;characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>

第五步得到该内容:

这个就和我们的配置文件一一对应的!!!!

二,执行语句

是如何执行sql语句:
org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.Reader)
>org.apache.ibatis.builder.xml.XMLConfigBuilder
>org.apache.ibatis.builder.xml.XMLConfigBuilder.parse
>org.apache.ibatis.builder.xml.XMLConfigBuilder.mapperElement
>org.apache.ibatis.builder.xml.XMLMapperBuilder.XMLMapperBuilder(java.io.InputStream, org.apache.ibatis.session.Configuration, java.lang.String, java.util.Map<java.lang.String,org.apache.ibatis.parsing.XNode>)
>org.apache.ibatis.builder.xml.XMLMapperBuilder.parse
>org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement
>org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(java.util.List<org.apache.ibatis.parsing.XNode>)
>org.apache.ibatis.builder.xml.XMLStatementBuilder.XMLStatementBuilder(org.apache.ibatis.session.Configuration, org.apache.ibatis.builder.MapperBuilderAssistant, org.apache.ibatis.parsing.XNode, java.lang.String)
>org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode
>org.apache.ibatis.session.Configuration.addMappedStatement  ####这里是add

第一步得到该内容:

<mappers>
<mapper resource="com/wang/Dao/UserMapper.xml"/>
</mappers>

补充知识(源码分析得到):
mybatis解析mapper文件有几种方式:4种,以及优先级


第二步得到该内容:

<mapper namespace="com.wang.Dao.UserMapper">
<select id="getUserLike">
select * from mybatis.user where like #{value}
</select>
<select resultType="com.wang.pojo.User" id="getUserList">
select * from mybatis.user;
</select>
<select resultType="com.wang.pojo.User" parameterType="int" id="getUserById">
select * from mybatis.user where id = #{id};
</select>
<select resultType="com.wang.pojo.User" parameterType="map" id="getUserById2">
select * from mybatis.user where id = #{id} and name=#{name};
</select>
<insert parameterType="com.wang.pojo.User" id="addUser">
insert into mybatis.user (id, name ,pwd) values (#{id}, #{name}, #{pwd});
</insert>
<insert parameterType="map" id="addUser2">
insert into mybatis.user (id, name ,pwd) values (#{userid}, #{username}, #{userpwd});
</insert>
<update parameterType="com.wang.pojo.User" id="updateUser">
update mybatis.user set name=#{name },pwd=#{pwd} where id=#{id};
</update>
<delete parameterType="int" id="deleteUser">
delete from mybatis.user where id=@{id}
</delete>
</mapper>

第三步得到该内容:

对应我的Mapper.xml文件中的标签!!
mapper标签中的子标签都在这里!!!


org.apache.ibatis.mapping.MappedStatement中的内容对应mapper.xml中的select内容

补充知识二:

org.apache.ibatis.session.Configuration#newExecutor(org.apache.ibatis.transaction.Transaction, org.apache.ibatis.session.ExecutorType)
mybiatis的核心是执行器,执行器有3种
org.apache.ibatis.session.ExecutorType下有三种SIMPLE, REUSE, BATCH
SIMPLE是默认的执行器
org.apache.ibatis.executor.Executor执行器接口

mybatis一级缓存是否默认开启呢,默认开启。
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
protected boolean cacheEnabled = true;

补充1.
补充2.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: