Mybatis原理

转载自: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.  
  2. <!--

  3. 1、使用select标签定义存储过程

  4. 2、statementType=“CALLABLE”:要调用的存储过程

  5. 3、in输入,out输出,cursor游标,resultSet结果集,resultMap如何封装结果集

  6. -->

  7. <select id="getPageByProcedure" statementType="CALLABLE" databaseId="oracle">

  8. {call hello_test(

  9. #{start,mode=IN,jdbcType=INTEGER},

  10. #{end,mode=IN,jdbcType=INTEGER},

  11. #{count,mode=OUT,jdbcType=INTEGER},

  12. #{emps,mode=OUT,jdbcType=CURSOR,javaType=ResultSet,resultMap=javaModel}

  13. )}

  14. </select>

  15.  
  16. <resultMap type="**.**.**.bean.JavaModel" id="javaModel">

  17. <id column="EMPLOYEE_ID" property="id"/>

  18. <resul column="LAST_NAME" property="email"/>

  19. <resul column="EMAIL" property="emial"/>

  20. </resultMap>

 

版权声明:微博:在下洋小葱 https://weibo.com/3908358323/profile?topnav=1&wvr=6&is_all=1 https://blog.csdn.net/ma15732625261/article/details/81123349

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值