最近重新看了一下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语句中的任何地方