mybatis 标签 和注解 ( 动态 sql的 用法)

1. 动态 sql

 

mybatis  select 元素

总结:一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。

注意:

(1)当为select语句时:

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。

useCache默认为true,表示会将本条语句的结果进行二级缓存。

(2)当为insert、update、delete语句时:

flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

useCache属性在该情况下没有。

当为select语句的时候,如果没有去配置flushCache、useCache,那么默认是启用缓存的,所以,如果有必要,那么就需要人工修改配置

3.对应的pojo实现序列化(implements Serializable)

4.mybatis自身实现二级缓存弊端在于只能作用于数据库,此时需要我们引用第三方库作为缓存库,这样缓存更具有扩展性。。。(待

mybatis中还可以配置userCache和flushCache等配置项,userCache是用来设置是否禁用二级缓存的,useCache=false禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

flushCache=”true”,默认情况下为true,即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

注意:开启缓存的弊端是数据没有实时性,当数据库中的数据一旦修改,查询的数据还是缓存中的数据没有实时性,对于某些需要实时性显示数据的接口我们可以设置useCache="false",设置该属性后,该接口每次查询出来都是去执行sql查询出实时性数据。

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

官方文档赏析:

https://mybatis.org/mybatis-3/zh/java-api.html

如何获取最后一次插入的 ID

useGenerateKeys 只支持 mysql , sql server 这种

如果 用 mysql ,order 要设置 为 after , 而 Oracle 则是 设置 为 before ,因为 Oracle 是先拿到 id ,再插入到数据, mysql 则是插入后 自动生成的。

mybatis 动态 sql 用法

如果所有 的 if 都不成功, 不会加 where

如果只有一个 if 成功,就删除 where 后面的 那一个 and

mybatis 动态 sql 部分更新

但是 以上写法有问题, 最后一个 if 没有成功,前面 if 成功了, 会 加个 逗号,于是就出问题了

set 标签 会把最后一个 if 的逗号 去掉,这样 sql 更新就不会出问题了。。。

上面 的 where  ,set 分别解决 查询 和 更新问题, 还有一个 插入问题,也是用来解决多一个逗号的标签, trim

insert  只能用 trim 实现动态 sql

foreach 标签 用于解决 数组参数遍历问题

mybatis 使用批量操作的实现:

1. 使用 foreach 标签 批量执行

2. jdbc标准: jdbc本来就支持批量操作: 【mybatis 也可以使用 jdbc的批量操作】

之后 executeBatch() 返回数组,即 每条 sql 影响的 行数

Choose 和 when 的基本使用:

这个 是 最重要的: ddd ,最后 最重要的 

为什么要配合 choose when 来使用:

不知道 有没有经历过这种处境:

1. 一张表,有多个  属性可以推导出 表中的某一行

比如:

1. 我使用自增主键 可以推到 那一行的数据

2. 比如我可以使用  学校 Id  + 个人学号 ID   推导出 那一行数据

3. 我可以使用 微信的 unionId  唯一确定 表中的那个数据

4. 我可以使用 微信 的 openID 唯一确定表中的那一行数据

5. 我还可以使用 身份证 唯一确定表中的那行数据

6. 我可以使用 email 账号 + password 的方式 唯一确定表中的那行数据

现在问题来了: 这么多属性,都可以唯一确定 表中的那行数据,我需不需要 把 6种场景 都写一条 sql ,还是 使用动态 sql 的方法?

答案是配合 where + choose 来实现多条件的选择,类似 switch 语句

这里就有个 优先级别判断了,比如 一张表的主键不为 null, 那么 优先使用主键查询

如果 unionID 不为null,再使用 unionID 查询,其他的也是这样

原文地址:https://www.cnblogs.com/lyr-2000/p/13855449.html