zoukankan      html  css  js  c++  java
  • 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 查询,其他的也是这样

  • 相关阅读:
    SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?
    SpringBoot整合原生OpenFegin的坑(非SpringCloud)
    Git入门教程,详解Git文件的四大状态
    全世界最强的算法平台codeforces究竟有什么魅力?
    设计模式第二篇,链式方法模式
    matplotlib设置颜色、标记、线条,让你的图像更加丰富
    20行代码实现,使用Tarjan算法求解强连通分量
    深入理解SVM,详解SMO算法
    手把手教你配置git和git仓库
    设计模式 | Catalog设计模式,抵御业务方需求变动
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/13855449.html
Copyright © 2011-2022 走看看