一、动态sql语句
1、作用
避免了使用原生jdbc时需根据不同的条件进行sql语句的拼接。标签中的参数值支持通配符。
2、实现动态sql的标签
(1)if
1)应用场景
提供一种可选的查找文本功能。通常是根据条件包含where子句的一部分。
2)sql语句示例
注意:
①state参数可以表示查询条件的其中之一,也可以表示恒成立条件,表示只取if中的条件,如果if中条件不成立,则进行全表查询。
②有两个条件可以if分支,如例子所示。
(2)choose(when,otherwise)
1)应用场景
当查询条件有多个可能,而只需要使用其一时,可使用choose(when,otherwise)动态sql标签,类似于Java中的if-else(switch-case)。
2)sql语句示例
(3)where
1)应用场景
所有的if或者choose-when-otherwise的条件中,没有任何一个可以满足,最终的sql语句就会变成类似于:select * from user where;为解决这种情况,使用where标签,可以动态的根据条件添加或者去除where、and、or关键字;
2)sql语句示例
(4)set
1)应用场景
用于动态的更新语句,用于根据需要更新的字段动态的添加和去除set关键字,以及删除句尾多余的逗号;set也可以同过trim自定义。
2)sql语句示例
update Author
(5)自定义trim
1)应用场景
偶尔where标签可能失效,此时就可以自定义trim标签来定制where元素的功能;
2)标签属性
①prefix
②prefixOverrides
③suffix
④suffixOverrides
3)sql语句示例
(6)foreach
1)应用场景
foreach通常用于对一个集合进行遍历,通常实在构建IN条件集的情况,也可以用于批量更新时,设置set字段值;
foreach元素的功能非常强大,可以允许指定一个集合collection,可以声明一个集合中的每个集合项item,索引index。也可以开头和结尾的字符串,以及迭代结果中的分隔符;
注意:
①当集合为list、set、数组等时,index代表当前迭代地次数;
②当集合为Map对象时,index为键,item为值。
2)sql语句示例
(7)bind
1)应用场景
bind元素可以从OGNL表达式中创建一个变量并将其绑定到上下文。
2)sql语句示例
(8)指定重复部分的sql语句
1)应用场景
多个sql语句重复的部分,可单独声明,在需要引用的地方引用即可,这样可以避免荣誉代码。2)语法
①zaimapper节点下添加sql节点,指定节点id,将重复的sql语句添加在sql节点中;②在需要使用重复sql语句的地方,通过include标签引入,include标签的refid属性指向sql节点的id。
3)sql语句示例
①在mapper节点下添加sql节点:select from user
*②在需要引用的节点下添加include节点:
二、mybatis的缓存
1、什么是缓存
mybatis会在一次会话(一个sqlSession对象)中创建一个本地缓存。对于每次查询,都会现场时根据查询的条件去本地缓存中查找缓存中是否存在;如果存在,就直接从缓存中去除,然后返回给用户;否则,从数据库读取,再将查询结果存入缓存,并返回给用户。2、好处
减少跟数据库的连接,节约时间和资源;3、mybaits的默认缓存
mybatis缓存分类局部缓存(默认开启):又称为session缓存、一级缓存、本地缓存;
全局缓存(默认关闭):又称为二级缓存;
4、一级缓存和二级缓存
(1)一级缓存
1)定义
一级缓存是基于session,又叫座session缓存,相当于每一个session对象内部都维护了一份缓存;2)失效时机
①同一个session查询条件不同;②查询条件相同,session不同;
③session相同,查询条件也相同,但是在两次查询中间,执行了写入操作(增、删、改);
④session相同,但是在两次查询中间执行了手动清空缓存。
注意:
a.mapper映射文件中sql语句节点的flushCache属性值默认为true;
b.将sql语句节点的flushCache属性值设为false[璐1]
(2)二级缓存
1)定义
二级缓存,又称为全局缓存。二级缓存是Mapper级别的,每一个Mapper都分配有一个缓存对象;多个mapper共用一个缓存对象。二级缓存可以多个session共享数据。
2)使用二级缓存的必备条件
二级缓存是默认关闭的,如果需要开启二级缓存,需要到mybatis的全局配置文件,以及mapper.xml的映射配置文件开启;开启二级缓存的必备条件如下:①在mybatis全局配置文件中配置二级缓存(全局配置文件中二级缓存是默认开启的);
settings节点下添加如下配置:
②在sqlMapper.xml映射配置文件中开启二级缓存(mapper.xml映射配置文件中的二级缓存是默认关闭的);
mapper节点下添加如下配置:
< cache>< /cache>
③想要实现二级缓存的java bean需要实现序列化接口:Serializable;
④必须等session手动关闭或提交之后,session中的缓存才会推送到二级缓存中;
注意:缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
查缓存时,是将对象复制一份交给新的线程。
5、缓存相关练习
(1)如果全局配置文件中的cacheEnabled关闭之后,session缓存是否还生效?答:全局配置文件中二级缓存关闭之后session缓存(一级缓存)是生效的;
(2)每个select标签有一个useCache属性,默认是true,如果将该值设为false,关闭的是一级缓存还是二级缓存?
答:每个select标签的useCache属性设为false关闭的是二级缓存。
(3)每个增删改标签,都有一个flushCache属性,该属性刷新的是一级缓存还是二级缓存?
答:增删改标签中flushCache为true时,清空的是一级缓存,该属性对二级缓存无效。
(4)每个select标签也有一个flushCache属性,默认是false,如果将该值设为true,那么刷新的是一级缓存还是二级缓存?
答:select标签的flushCache为true时,刷新的是一级缓存和二级缓存。
(5)sqlSession调用clearCache会清空一级缓存,那么二级缓存会被清空吗?
答:sqlSesion的clearCache只会清空一级缓存,提交到二级缓存不会被清空。
三、restful风格的url
1、定义
restful风格的url:即是不在url路径上体现增删该查的方法,而是通过请求方式限定。post:增加;
delete:删除;
put:修改;
get:查询;
例如:user模块的增删改查,url使用“/user”映射,然后通过请求方式映射具体的handler方法。
2、参数传递
(1)可在url后携带参数
格式:/url/{参数值}(2)通过ajax传递json
四、mybatis分页插件—PageHelper
1、导入jar包
分页组件s核心包:pagehelper;sql解析包;jsqlparser;
2、在mybatis的核心配置文件中配置拦截器插件
<!—使用下面的方式配置参数,后面会有所有的参数介绍—>
3、使用PageHelper插件处理分页
(1)调用PageHelper的静态方法
在service层,mapper实现类调用查询语句之前,调用PageHelper的静态方法:PageHelper.startPage(pageNum,pageSize)。
注意:1)pageNum:表示当前页:由页面传参进来,不传时设置默认值为1;
2)pageSize:表示每页显示的数据的总数,一般通过公用的类设置为静态的常量;
(2)创建PageInfo对象,包装数据
创建PageInfo对象,将查询到的数据的list(比如ListpageInfo中包含了页面渲染分页信息的所有数据,分别如下:
1)endRow:当前页最后一条数据在数据库中的行号;
2)hasNextPage:是否有下一页,true或者false;
3)hasPreviousPage:是否有前一页,true或者false;
4)isFirstPage:是否时第一页,true或者false;
5)isLastPage是否是最后一页,true或者false;
6)list:查询到的数据,list集合;
7)navigateFirstPage:页码导航条的第一页;
8)navigateLastPage:页码导航条的最后一页;
9)navigatePageNums:页码导航条的页码数的集合(1,2,3…);
10)navigatePages:页码导航条的总条数;
11)nextPage:下一页;
12)pageNum:当前页;
13)pages:总页数;
14)pageSize:每页的数据总条数;
15)prePage:前一页;
16)size:当前页的数据数量;
17)startRow:当前页的第一条数据在数据库中的行数;
18)total:查询到的数据总数。