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 查询,其他的也是这样

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/13855449.html
Copyright © 2011-2022 走看看