一、动态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


username=#{username},

password=#{password},
email=#{email},

bio=#{bio}


where id=#{id}

(5)自定义trim

1)应用场景

偶尔where标签可能失效,此时就可以自定义trim标签来定制where元素的功能;

2)标签属性

①prefix

在子句动态生成后,在句首添加指定的前缀;

②prefixOverrides

在子句动态生成后,去掉句首指定的前缀;

③suffix

在子句动态生成后,在句尾添加指定的后缀;

④suffixOverrides

在子句动态生成后,去掉句尾指定的后缀;

3)sql语句示例

和where等价的自定义trim标签如下:


(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(比如List users)放进PageInfo包装;
pageInfo中包含了页面渲染分页信息的所有数据,分别如下:
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:查询到的数据总数。