MyBatis回顾,对流程、原理的一些简单内容做下笔记

最近重新看了一下MyBatis的内容,结合以前的知识和最近视频的学习,对MyBatis的一些内容做下笔记。

 

MyBatis工作原理与工作流程

1.读取mybatis-config.xml为文件流形式

2.解析配置文件,将配置文件中的信息写到Configuration对象中

3.将Configuration当做属性构建SqlSessionFactory工厂对象

SqlSessionFactory 中主要有几个属性:

                               configuration:配置信息

                               dirty:true sql执行成功进行提交;false sql执行失败,进行回滚

                               Executor:执行器对象

4.SqlSessionFactory 创建一个sqlsession接口,提供开发人员对数据库多增删改查

5.执行器执行sql语句

 

 

mybatis需要依靠2种配置文件

1.核心配置文件,即mybatis-config.xml,一些运行的环境配置和sql映射文件位置等信息

2.sql的映射文件

 

配置文件中的每一个标签,实际上都代表着一个接口,专门对标签内的信息进行操作的;

而在mybatis中,也是允许用户自定义这些接口的相关实现类的。

 

那么这些标签及信息是在哪里,如何进行读取和存储的?

在mybatis中,所以核心配置文件信息都是放在一个configration对象中的;

 

读源码最好是带着问题或者目的性地去跟

 

1.将核心配置文件转成一个xml解析对象。

2.通过指定节点名获取各个标签和内容,依次存放到各自的管理对象中。

3.在管理对象中对标签中的内容进行获取,解读,做对应的存储,设置等操作。

 

自定义标签的实现类:

1.新建一个类,实现你要自定义的接口,如类型转换器,则需要实现TypeHandler接口(implement)

2.重写相应的方法,如setParameter(生成sql语句时被调用)和getResult(查询时获取结果,将sql数据行转换封装成java对象)

3.在核心配置文件mybatis-config.xml中,对应标签下写上指定多实现类位置,即包名+类型、触发条件  (有需要的话,这里是全局设置)

4.在sql映射文件中,在需要引用自定义实现类的标签中,写上需要引用自定义实现类的位置  (有需要的话,这里是局部设置)

局部优先级>全局优先级

 

 

代理模式

代理模式的作用:将主要业务与次要业务进行松耦合组装

开发人员需要分清哪些是主要业务,哪些是次要业务。主要业务和次要业务在不同类中完成。

这样做多好处:

1.开发人员只要去关系那些主要逻辑处理即可,而不需要管次要业务

2.便于维护,降低维护多难度,修改一处即可,做到牵一发而动全身

 

代理模式的本质:监控行为特征

例子:如html中一些标签,如button标签就是监控用户群体操作的一种代理,监控用户群体单击按钮,鼠标悬浮等行为,从而做出对应的操作

 

JDK代理模式实现:

1.接口角色:定义所有需要被监听的行为。(只关心有哪些行为,不关心是谁做了这些行为)

2.接口的实现类:实现接口角色的接口,对不同对象做行为进行实现(xx对象怎么做行为1,yy对象怎么做行为1)

3.通知类:1)对次要业务进行具体实现;2)通知JVM,当前被拦截的主要业务方法与次要业务方法应该如何进行绑定执行(主要业务与次要业务执行顺序)

4.监控对象(代理对象): 当发现被监控对象做了被监听行为时,找到通知类,根据通知类中的方法,执行相应多操作。

1)被监控实例对象  2)需要被监控的监控行为  3)具体通知类实例对象

 

ps:通知类需要实现invocationHandle接口,只有实现invocationHandle接口才能被叫做通知类

 

 

 

 

MyBatis代理模式实现

一、JDBC开发步骤如下

1.加载驱动,指明是哪个数据库 [次要业务]

2.建立链接通道 [次要业务]

3.建立PreparedStament(充当快递员身份)[次要业务]

4.输送sql命令到数据库中执行,并带回运行结果 [主要业务]

5.销毁链接通道,PrepraredStament [次要业务]

 

 

MyBatis_Mapper中#和$区别:

#{  } 在拦截方法中会被替换成?形式的占位符,再通过参数形式写入;即采用预编译方式,可以防止sql注入

${  } 在拦截方法中会被替换成具体的参数值;即采用直接赋值的方式,无法阻止sql注入

在大多数情况下,我们都是采用#{ }读取参数内容,但是在一些特殊情况下还是需要使用${}读取参数

如动态表名xx_${year},动态指定排序字段order by ${name }

简单的来说,#{}用于sql语句的参数,${}可以出现在sql语句中的任何地方

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值