转载自:https://blog.csdn.net/ma15732625261/article/details/81123349
spring全局配置文件mybatis-config.xml:
1、开发工具引入本地的全局配置文件:dtd约束,自动提示
1.1、properties引入外部properties配置文件,resource引入类路线下资源,url引网络连接或磁盘路径下资源
<properties url=""/> 从配置文件中读取值<property name="" value="${值}"/>
1.2settings设置项
1.3typeAliase别名(不区分大小写),java Bean 起别名,type全类名,默认类名小写,alias别名;package为包下类起别名、默认类小写,此情况下还可以在类上使用@Alias注解
1.4environments环境,可多种具体环境信息;
id标识,transactionManager事务管理器,type类型;dataSource数据源,type类型
1.5databaseIdProvider:多数据库支持
type数据库厂商标识获取数据库执行不同sql,配置文件中
<property name = "MYSQL" value="mysql"/>起value别名标识
mapper.xml文件的select等标签内利用databaseId标识别名、执行
1.6mapper将映射注册到全局配置中,resource=“类路径下的映射文件”,url同上
class引用注册接口,=接口全类名:
1、有sql映射文件,映射文件名需要与接口同名且同一目录
2、无映射文件,sql利用注解写在接口上@Select
package批量注解,name=包全路径,mapper和xml都放里面
映射文件
1、参数处理
#{}预编译形式,参数设置到sql中,PreparedStatement防止sql注入,原生jdbc不支持;${}直接拼接
2、select
返回map<String,Object>,resultType=“map”;返回Map<String,*Model>,resultType="*Model',接口方法添加@MapKey("id")标识哪个属性作为map的key
3、关联查询、嵌套结果集
result标签的collection或association(另 利用property select column分步查询)
4、延迟加载:lazyLoadingEnabled(true)、aggressiveLazyLoading(false),显示指定配置值,即使是默认的,防止版本更新
5、鉴别器:使用discriminator判断某列的值,根据该值改变封装行为、返回值
动态sql:if choose trim foreach
1、if
test表达式、OGNL:特殊符号写转移字符
where
2、choose:<where>标签中,when、otherwise
3、trim:整个,prefix、prefixOverrides前缀覆盖、suffix、suffixOverrides
4、foreach:collection、item、separator、open、close、index (遍历list时index是索引,item是当前值;遍历map时index是map的key,item是map的值)
set标签
内置参数:
bind:将表达式绑定到变量
<bind name="_lastName" value=" ‘%’+lastName+‘%’ "/>
……like #{_lastName}
sql片段:抽取可重用的片段,include引用(自定义参数${},要对应上)
缓存机制:
一级缓存:本地缓存,与数据库同一次会话期间查询到的数据,sqlSession级别,一直开启
失效:SQLSession不同,sqlSession同参数不同或两次查询间执行了增删改,清缓存
二级缓存:全局缓存,基于namespace
一个会话(查询)数据保存当前会话一级缓存,会话关闭数据保存到二级缓存
全局配置开启cacheEnabled:true,xml添加<cache />下面是元素,不写即默认
eviction:回收策略 LRU FIFO SOFT WEAK ;flushInterval、readOnly:true从缓存中去数据都是只读,false序列化反序列化克隆一份新数据;size放多少元素、type全类名,实现Cache接口即可
每个select标签有useCache,false不使用二级缓存,一级依然使用
每个增删改标签都有flushCache,true执行完清除缓存(都)
ehcache:引入jar或坐标,添加配置文件,xml文件中cache的type指向org.mybatis.caches.ehcache.EhcacheCache
与spring整合:
逆向生成工具:
context targetRuntime:生成一套什么样的模板
jdbcConnection如何连接到目标数据库;javaTypeResolver:类型解析器;javaModelGenerator:javaBean生成策略;sqlMapGenerator:sql映射生成策略;javaClientGenerator:指定mapper接口所在位置;table:指定要逆向分析哪些表
原理:
总流程:
1.根据配置文件(全局、sql映射)初始化configuration对象
2.创建一个defaultSqlSession对象
包含Configuration及Executor(根据全局配置文件中defaultExecutorType创建对应的Executor)
3.DefaultSqlSession.getMapper拿到Mapper接口对应的MapperProxy
4.MapperProxy里有DefaultSqlSession
5.执行增删改查
1、调用DefaultSqlSession增删改查
2、创建StatementHandler
(同时创建ParameterHandler,ResultSetHandler)
3、调用StatementHandler预编译参数以及设置参数值
使用ParameterHandler给sql设置参数
4、调用StatementHandler增删改查
5、ResultSetHandler封装结果
四大对象:
executor、parameterHandler、ResultSetHandler、StatementHandler
细化
1、获取sqlsessionFactory
解析文件的信息保存到Configuration中,返回Configuraation的DefaultSqlSession对象;【mappedStatement】代表一个增删改查的详细信息
2、获取sqlSession
3、获取接口代理对象MapperProxy
4、执行增删改查
插件开发:
原理:
四大对象创建时:
1、每个 创建出来的对象不是直接返回
而是interceptorChain.pluginAll(parameterHandler)
2、获取到所有Interceptor(拦截器、插件需要实现接口)
调用interceptor.plugin(target)返回target包装后的对象
3、插件机制,使用插件为目标对象创建代理对象:AOP
插件为四大对象创建出代理对象、代理对象拦截对象的每一个执行
编写:实现Interceptor,添加@Intercepts完成插件签名,注册到全局配置文件
1、intercept拦截目标对象的目标方法的执行
2、plugin包装目标对象:为对象创建代理对象并返回
3、setProperties将插件注册时的property设计进来,插件配置信息
注解:type要拦截哪个对象,method哪个方法,args当前方法的参数列表
多个插件会产生多层代理,安装插件配置顺序创建层层代理对象,执行目标方法后,按照逆向顺序执行
常见的插件:
PageHelper插件、批量操作、存储过程、typeHandler处理枚举等
批量:预编译sql一次,设置参数*次,执行1次;非批量:预编译一次设置一次执行一次;ExecutorType.BATCH;
与spring整合
使用,service实现类中引入SqlSession,调用sqlSession.getMapper方法
存储过程:
oracle分页实例:不全
先建存储过程
mybatis配置:
-
<!--
-
1、使用select标签定义存储过程
-
2、statementType=“CALLABLE”:要调用的存储过程
-
3、in输入,out输出,cursor游标,resultSet结果集,resultMap如何封装结果集
-
-->
-
<select id="getPageByProcedure" statementType="CALLABLE" databaseId="oracle">
-
{call hello_test(
-
#{start,mode=IN,jdbcType=INTEGER},
-
#{end,mode=IN,jdbcType=INTEGER},
-
#{count,mode=OUT,jdbcType=INTEGER},
-
#{emps,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=javaModel}
-
)}
-
</select>
-
<resultMap type="**.**.**.bean.JavaModel" id="javaModel">
-
<id column="EMPLOYEE_ID" property="id"/>
-
<resul column="LAST_NAME" property="email"/>
-
<resul column="EMAIL" property="emial"/>
-
</resultMap>
版权声明:微博:在下洋小葱 https://weibo.com/3908358323/profile?topnav=1&wvr=6&is_all=1 https://blog.csdn.net/ma15732625261/article/details/81123349