MyBatis的知识点

Mybatis:前身叫做iBatis;

什么是MyBatis,为什么使用MyBatis?
Mybatis是一个支持SQL,存储过程,高级映射的优秀持久层框架,我们使用MyBatis可以避免所有的JDBC代码,以及手动设置参数,结果集的遍历等问题,而且MyBatis支持动态SQL,多表联查的结果集封装等.
MyBatis可以使用配置,注解,来完成model类与数据库表的关系映射,实现SQL语句与Java代码的误解

传统JDBC开发的问题:
1.数据库的连接频繁创建与销毁
2.SQL实际上就是一个Java代码的字符串,修饰SQL等于修饰Java代码(硬编码)不利于维护
3.使用占位符传参的时候存在硬编码的问题,因为where后面的条件是不固定的(有可能是一个,两个或者…)有多少个查询条件,就需要有多少头条SQL
4.对于结果集的解析存在硬编码,SQL改变了结果集也需要对应的改变,不利于维护

MyBatis配置文件分为两种:
1.总配置文件MyBatisConfig 配置数据库环境,MyBatis的配置,小mapper文件的加载
2.小配置文件xxxxMapper

MyBatisConfig内容如下:
properties:加载属性文件,然后使用${属性文件中的key}来取值
typeAliases:指定类型别名,减少mapper文件中的代码
environments:配置数据库环境
ecvironment:配置数据库环境
transactionMan:指定事务管理器
dataSource:配置数据库连接池
mappers:用来加载mapper文件

userMapper(主要用来配置数据库与model的关联,以及SQL语句的编写)
namespace:用来确定mapper文件的唯一标识符,根据这个值可以定位到这个文件
insert:里面编写插入的SQL
delete:里面编写删除的SQL
update:里面编写修改的SQL
select:里面编写查询的SQL
parameterType:用来指定当前SQL语句中需要使用的参数类型,如果传入的是model在SQL中就可以使用#{属性名}来进行取值的操作,如果传入的是一个字符串或者基本数据类型可以使用#{任意字符}来进行取值,一般情况下我们可以默认省略掉参数类型
resulltType:用来指定查询语句的结果集类型,如果查询出多条记录会自动包装对应的list集合,要求model的属性名数据库的列名一致(同名匹配原则)
resultMap;当数据库列名与model属性名不一致的时候,查询语句可以使用resultMap来定义返回的结果集,在其中指定数据库的列对应于model哪一条属性
statementID:mapper文件的namespace+SQL语句的ID通过statementID就能定位到具体是哪一条SQL
例如:session.insert(“hahaha.add”,user);

使用statementID执行SQL存在的问题:
1.由于statementID使我们自定义的一个字符串,在编译期间如果写错了无法发现,只能等程序运行期间才能发现问题
2.使用statementID来执行SQL的话,如果参数传入错误在编译期间无法发现,只有在程序运行时才能发现问题

使用接口映射方式来解决statementID引出的问题:
使用接口映射方式的时候,当我们将接口的class对象传给MyBatis之后,MyBatis会自动替我们创建一个Proxy对象,然后里面有封装好的JDBC方法我们直接使用即可,我们通过操纵代理类对象来完成对数据库的操作.

注意点:
1.保持接口的全限命名与mapper的namespace一致
2.接口中的方法名与mapper中的ID要保持一致
3.方法中的参数需要与paramterType一致
4.方法中的返回值需要与resultType或resultMap一致

动态SQL标签
if:可以判断传入到SQL中的参数是否有值,返回值为Boolean,如果true则执行if之间的代码,返回false则不执行

where:会自动在SQL中给我们加入where关键字,并且会帮我们去掉where:会自动在SQL中给我们加入where关键字,并且会帮我们去掉where之后紧跟着and和or

set:会自动在SQL中给我们加入switch,里面可以有多个when,当有一个when匹配成功之后,其他的when都不再进行匹配了,如果所有when都没匹配成功则执行otherwise中的代码

trim:功能类似于where和set,但是可以自定义SQL开始需要添加的前缀和后缀,并且可以指定去掉SQL开始或者结束的时候碰到的内容去掉的内容可以是多个,多个内容之间用’|'分割
例如;

include:需要配置SQL标签来使用,如果有一些SQL语句需要被频繁使用,我们就可以将这些语句封装成一个SQL,然后在需要的地方使用include
来引入

bind:可以在value中对传入的参数进行加工,然后重新赋值给name中的变量

foreach:用于循环遍历,一般配合in来使用
collection:如果接口中的参数,没有指定的key的情况下,默认为对应类型,数组为array
item:会将集合中内的元素依次取出然后赋值给item中变量
separator:循环的时候每一个值中间的分隔符
open:在循环刚开始的时候插入的内容(只执行一次)
close:在循环结束的时候插入的内容(只执行一次)
index:循环次数的su索引(从零开始)

MyBatis中的缓存:
一级缓存:
一级缓存的生命周期是session级别,不同的session 不会共享一级缓存
一级缓存的失效的可能性:
1.session被关闭close()只会释放掉缓存
2.session.clearCache();之后会释放掉一级缓存
3.当发生增删改查语句之后,会自动清空掉一级缓存
因为:一级缓存是session级别的,当我们SSM整合的时候sqlsession由 spring进行管理,所以一级缓存是不存在的,以及无法使用的
二级缓存:
MyBatis的二级缓存是mapper级别,默认是不开启的,如果想开启的话我们需要在config中先开启二级缓存<settings><setting name="cachEnabled" value="true"/></settings>然后再到需要使用mapper.xml中使用<cacher/>标签开始缓存,需要注意的是我们如果使用二级缓存的话需要对应的model类来实现Serializable.当使用二级缓存后,mapper中所有的select中语句会被缓存掉,所有的insert,delete,update语句都会清空掉二级缓存如果某条SQL不想使用缓存的话,可以在标签中设置flushCache=“true”,让其每次执行的时候都刷新一下缓存
二级缓存默认会使用LRU(最近很少使用)算法来进行回收
二级缓存默认存储集合或者对象(无论方法返回的是什么)的1024个引用
blocking:如果没有命中缓存的时候,就会一直阻塞,一直到有对应的数据存入缓存中
eviction:缓存的回收策略
LRU:最近时间使用较少的
FIFO:先进先出,按照缓存的时间来进行回收,最先进入缓存的的会最早被回收掉
SOFT:基于Java的垃圾回收机制的软引用规则回收
WEAK:基于Java的垃圾回收机制的弱引用规则回收
size:指缓存中能存放多少个元素
readOnly:是否只读
flushInterval:设置缓存刷新时间(毫秒)
type:当我们需要使用自定义的时候(第三方缓存),在这里指定缓存类的全限命名

@Paraam注解:(用于给参数起名字)
当接口中的方法形参大于一个的时候,我们必须要用@Param注解给参数指定一个key,然后在xml中通过key来取值

#与$的区别:

#:代表执行SQL的时候使用的是预编译的对象preparedStatenent,参数都是使用占位符传参的方式传到SQL中
$:代表执行SQL的时候使用Statement对象,参数都会通过字符拼接的方式来拼接到SQL中.
如果SQL中传递的参数是一个的时候,可以使用#{任意字符}来进行取出参数,但是无法使用${任意字符}取出
想通过$取出我们传递的参数需要配合@Param注解一起使用,使用@Param注解给接口中的形参取一个key,然后在xml中通过${key}来取值
**什么时候用#,什么时候用$?**
一般情况下我们所有的查询都使用#来取值,因为#使用的是预编译对象,可以防止SQL的注入等问题,并且效率很高,但是我们传递的参数是数据库列名的话使用#会在列名前后加上单引号''导致无法查询正确的结果,所以当查询条件为数据库列名的时候(排序,分组)我们需要使用$字符拼接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑要做干饭人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值