Mybatis
教程
参考:
Provider的使用
1.一定要注意type的类名.class 和 method方法名,还要注意形参也得是一样的
2.Provider的方法,大概就三个方法sql.SELECT,sql.WHERE,sql.FROM
3.SQL 对象里的方法名跟别的不一样,小写的不行,idea也识别不到,要用大写,比如SLELECT
4.Provider里返回的是String
注解 一对多查询(多个参数)
注解 一对多查询(多个参数)
1 |
|
1 | public class QueryFloors implements Serializable { |
注解 一对多查询(一个参数)
标签
mybatis的xml的常用标签:
include和sql标签
1 | <sql id="query_column"> |
where标签
1 | <select id="test"> |
如果userName= null,则sql语句就变成
1 | select * from user_info where and password = #{password} |
where
标签可以去除where语句中的第一个and 或 or。
1 | <select id="test"> |
set标签
1 | <update id="myupdate"> |
trim标签
where
标签只能去除第一个and或or,不够灵活,trim标签功能更加强大。
trim标签的属性如下:
- prefix 在trim标签内容前面加上前缀
- suffix 在trim标签内容后面加上后缀
- prefixOverrides 移除前缀内容。即 属性会忽略通过管道分隔的文本序列,多个忽略序列用 “|” 隔开。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除。
- suffixOverrides 移除前缀内容。
1 | <trim prefix="where" prefixOverrides="and"> |
foreach标签
foreach元素的属性主要有item,index,collection,open,separator,close.
- collection 要做foreach的对象,作为入参时,List对象默认用”list”代替作为键,数组对象有”array”代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param(“keyName”)来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = “ids”.如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = “ids.id“,必填
- item 合中元素迭代时的别名,必选
- index 在list和数组中,index是元素的序号,在map中,index是元素的key,可选
- open foreach代码的开始符号,一般是(和close=”)”合用。常用在in(),values()时。可选
- separator 元素之间的分隔符,例如在in()的时候,separator=”,”会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样,可选。
- close foreach代码的关闭符号,一般是)和open=”(“合用。常用在in(),values()时。可选
choose,when,otherwise标签
功能有点类似于Java中的 swicth - case - default
1 | <select id="getUser" resultType="com.cat.pojo.User"> |
if标签
1 | <!-- 判断字符串--> |
存过/函数
存过
1 | <select id="pNextSupperUsers" parameterType="map" statementType="CALLABLE" resultType="vo.UserAgentVO"> |
1 | List<UserAgentVO> pNextSupperUsers(Map<String, Object> param); |
函数
1 | SELECT |
源码
参考
架构设计
启动测试方法
1 | # 第一种调用方法 |
下面的代码,大概意思就是能加载的配置文件的信息,解释
InputStream inputStream = Resources.getResourceAsStream(resource);
这行代码的作用
读取mybatis的配置文件
1 | // org.apache.ibatis.io.Resources#getResourceAsStream(java.lang.String) |
下面的代码,解释SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
,用来解析全局配置文件和解析mapper文件
下面是解析全局配置文件
解析全局配置文件
1 | // org.apache.ibatis.session.SqlSessionFactoryBuilder#build(java.io.InputStream) |
解释下environment作用,就是<environment id="development">
这里的,不同的环境不同的配置
1 | <configuration> |
用法:如下代码
1 | SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development"); |
下面是解析mapper文件,配置的属性,参考:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
解析mapper配置文件
1 | // 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>) |
到这里,配置文件就解析完成了,下面是创建SqlSessionFactory对象
SqlSession
1 | // org.apache.ibatis.session.SqlSessionFactoryBuilder#build(org.apache.ibatis.session.Configuration) |
下面是mybatis创建sql的流程
1 | // /Users/anthony/.m2/repository/org/mybatis/mybatis/3.5.2/mybatis-3.5.2-sources.jar!/org/apache/ibatis/builder/xml/XMLStatementBuilder.java:96 |
全部就解析完成了,接下来
看看session = sqlSessionFactory.openSession();
- 创建事务对象
- 创建了执行器对象CasheingExecutor
- 创建DefaultSqlSession对象
1 | // org.apache.ibatis.session.defaults.DefaultSqlSessionFactory#openSession() |
调用具体的API进行查询
用启动类
中的方法,对比可以发现两段代码不同之处为:
1 | Map map = sqlSession.selectOne("com.analyze.mybatis.mapper.UserMapper.getUA"); |
在查看DefaultSqlSession
中的selectOne
方法,会执行以下的调用链
1 | // org.apache.ibatis.session.defaults.DefaultSqlSession#selectOne(java.lang.String, java.lang.Object) |
解析结果
1 | // org.apache.ibatis.executor.resultset.DefaultResultSetHandler#handleResultSets |
缓存
1 | // org.apache.ibatis.executor.CachingExecutor#createCacheKey |