MyBatis 笔记(万字长文)
发布日期:2021-05-12 03:45:49 浏览次数:39 分类:精选文章

本文共 2991 字,大约阅读时间需要 9 分钟。

Mybatis 笔记

判断字符串相等

在Mybatis映射文件中,使用if标签判断字符串相等的两种方式:因为Mybatis映射文件是使用Ognl表达式,所以在判断字符串sex变量是否是字符串y的时候使用。

可以使用以下两种方式:

/test="sex=='y'.toString()">
或者
/test="sex='y'">

将自己的SQL改为:

AND COMPANY_ID = `#{companyId,jdbcType=VARCHAR}`
AND COMPANY_ID != `#{companyId,jdbcType=VARCHAR}`

再次调用SQL,则条件正常可用了。

Mybatis 批量插入

在使用list时,需要先判断是否为空,否则会报错。

可以使用以下SQL:

AND purchase_id IN (229, 159)

接下来进行批量插入操作:

insert into redeem_code
(
bach_id, code, type, facevalue, create_user, create_time
)
values
(`#{reddemCode.batchId}, #{reddemCode.code}`, `#{reddemCode.type}`, `#{reddemCode.facevalue}`, `#{reddemCode.createUser}`, `#{reddemCode.createTime}`)

where 条件

where标签可以用来处理条件判断,Mybatis会自动移除第一个AND连接词。

where标签的使用注意事项:

  • 第一个AND不需要写,但即使写也不会报错。
  • 第二个及之后的AND必须写。
  • 如果条件不存在,where标签对结果没有影响。
  • 如果条件不存在,返回所有条目。
  • 类似于where 1=1后加条件。
  • 如果没有一个条件符合,返回所有条目。

循环获取 Map 中的 key 和 value

有时候需要将Map中的所有键值获取出来并拼接到SQL语句中。可以使用foreach标签遍历entrySet

INSERT INTO table_name(hot_word, cnt)
VALUES
(`#{key}, #{value}`)
ON DUPLICATE KEY UPDATE
cnt = VALUES(cnt)

Mybatis property 列

通过<id><result>标签建立映射关系,指定实体类属性和数据表的列名。

XML 中使用特殊符号

在XML中使用特殊符号需要注意以下几点:

  • &lt;表示小于号
  • &gt;表示大于号
  • &amp;表示与
  • &apos;表示双引号
  • &quot;表示双引号

如果需要使用CDATA区,可以用<![CDATA[...]]>包裹。

以下是常见特殊字符的替代符号:

  • & 替代为 &amp;
  • < 替代为 &lt;
  • > 替代为 &gt;
  • " 替代为 &quot;
  • ' 替代为 &apos;

插入并更新

在MySQL中可以使用ON DUPLICATE KEY UPDATE来处理插入冲突。

insert into user(userName, password, comment)
values (`#{userName}, #{password}, #{comment}`)

MyBatis+MySQL 返回插入的主键ID

可以使用usegeneratedkeys属性来获取插入的主键ID。

insert into user(userName, password, comment)
values (`#{userName}, #{password}, #{comment}`)

MybatisPlus问题:XXXMapper 未找到Bean

如果你遇到了xxxMapper 未找到Bean的问题,可能是因为以下原因:

  • 缺少依赖
  • 依赖版本不符
  • Mapper接口没有定义
  • 建议检查pom.xml文件,确保以下依赖存在:

    com.baomidou
    mybatis-plus-core
    ${mybatis-plus.version}
    com.baomidou
    mybatis-plus-boot-starter
    ${mybatis-plus.version}

    IndexOutOfBoundsException 解决方案

    如果遇到IndexOutOfBoundsException,可以通过在实体类中添加全参构造方法来解决。

    @Entity
    public class User {
    @AllArgsConstructor@NoArgsConstructor
    public User(...) {
    // 初始化代码
    }
    }

    Mybatis 中的 foreach 优化

    and EXISTS (select 1 from (SELECT regexp_split_to_table(#{devIds},',') AS dev_id) AS vir where cast(vir.dev_id as BIGINT) = sd.id)

    Mybatis 传入多个 Map 参数

    如果需要传入多个 Map 参数,可以将它们合并到一个大 Map 中。

    sql语句
    sql语句

    MyBatis 嵌套循环 Map

    如果 Map 参数结构是Map<String, HashSet<String>>,可以使用以下方式:

    (id = `#{key}` AND name in (#{value}))

    MyBatis 嵌套循环 Map 高级用法

    如果参数类型是Map<String, HashSet<String>>,可以写成:

    (id = `#{key}` AND name in (#{value}))

    最终,通过以上方法可以灵活地处理 Map 参数,并嵌套使用。

    上一篇:小白入门能看懂的 AngularJS 中括号的作用
    下一篇:Spring Security 错误解决记录

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2025年04月18日 12时29分02秒