前提文件:对应项目为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&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>
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&serverTimezone=GMT%2B8&useUnicode=true&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.