Mybatis 标签的骚操作用法,你都知道哪些?|Java 开发实战

简介: 有时候新增一条数据,需要这条新增数据的主键,以便使用,如果采用先插入再查询的方式明显不符合要求,效率也变低了。这时候,可以使用<selectKey>标签,将insert的数据的主键返回,直接拿到新增数据的主键,以便后续使用。

开篇

有时候新增一条数据,需要这条新增数据的主键,以便使用,如果采用先插入再查询的方式明显不符合要求,效率也变低了。

这时候,可以使用<selectKey>标签,将insert的数据的主键返回,直接拿到新增数据的主键,以便后续使用。

插入时返回数据主键

表的主键有两种,一种自增主键,一般为int/long类型,一种为非自增的主键,例如用uuid等。

  • 自增类型的主键。
<!--selectKey  会将 SELECT LAST_INSERT_ID()的结果放入到传入的model的主键里面,  
        keyProperty 对应的model中的主键的属性名,这里是 AccountModifyLogDo 中的id,因为它跟数据库的主键对应, 
        order: AFTER 表示 SELECT LAST_INSERT_ID() 在insert执行之后执行,多用与自增主键,  
              BEFORE 表示 SELECT LAST_INSERT_ID() 在insert执行之前执行,这样的话就拿不到主键了,这种适合那种主键不是自增的类型  
        resultType 主键类型 -->  
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
  LAST_INSERT_ID()
</selectKey>
复制代码
  • 非自增的主键
<!-- 跟自增主键方式相比,这里的不同之处只有两点  
    1  insert语句需要写id字段了,并且 values里面也不能省略  
    2 selectKey 的order属性需要写成BEFORE 因为这样才能将生成的uuid主键放入到model中,  
    这样后面的insert的values语句里面的id才不会获取为空  
跟自增主键相比就这点区别,当然了这里的获取主键id的方式为 select uuid()  也可以另外生成函数。-->
<selectKey keyProperty="id" order="BEFORE" resultType="String">  
    select uuid()  
</selectKey>
复制代码

示例

<insert id="insertSelective" parameterType="com.account.dao.model.account.AccountModifyLogDo">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
      SELECT 0
    </selectKey>
    insert into t_account_modify_log
    <!-- <trim>标签
    prefix:在trim标签内sql语句加上前缀。
    suffix:在trim标签内sql语句加上后缀。
    prefixOverrides:指定去除多余的前缀内容
    suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
    -->
    <trim prefix="(" suffix=")" prefixOverrides="" suffixOverrides=",">
      <if test="customerId != null">
        customer_id,
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="customerId != null">
        #{customerId,jdbcType=BIGINT},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
</mapper>
复制代码

返回数据对比的结果

通过设置resultTypeBoolean类型来实现某些简单的逻辑校验

<select id="existPhone" resultType="java.lang.Boolean">
        SELECT COUNT(*) > 0 FROM t_customer
        WHERE phone = #{phone} AND is_del = 0
    </select>
复制代码

注解中使用动态sql

要在带注解的映射器Mapper接口类中使用动态 SQL,可以使用

@Update({"<script>",
"update Author",
"  <set>",
"    <if test='username != null'>username=#{username},</if>",
"    <if test='password != null'>password=#{password},</if>",
"    <if test='email != null'>email=#{email},</if>",
"    <if test='bio != null'>bio=#{bio}</if>",
"  </set>",
"where id=#{id}",
"</script>"})
void updateAuthorValues(Author author);
复制代码

动态sql中使用变量赋值替换

元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文。比如:

<select id="selectArticleLike" resultType="ArticleDO">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM Article
  WHERE title LIKE #{pattern}
</select>
复制代码

多数据库动态sql支持

如果配置了databaseIdProvider,就可以在动态代码中使用名为 _databaseId 的变量来为不同的数据库源构建特定的语句。比如下面的例子:

<insert id="insert">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    <if test="_databaseId == 'oracle'">
      insert into users values (#{name})
    </if>
    <if test="_databaseId == 'sqlserver'">
      select id from user order by id desc limit 1;
    </if>
  </selectKey>
  insert into users values (#{id}, #{name})
</insert>


目录
相关文章
|
4天前
|
SQL Java 数据库连接
Java MyBatis 面试题
Java MyBatis相关基础面试题
|
18天前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
48 13
|
3月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
171 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
3月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
47 6
|
4月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
3月前
|
SQL XML Java
Mybatis的<where>,<if>等标签用法
这篇文章详细解释了Mybatis中<where>和<if>等标签的用法,展示了如何在SQL动态构建中有效地过滤条件和处理逻辑分支。
311 1
|
3月前
|
SQL Java 数据库连接
Mybatis入门(select标签)
这篇文章介绍了Mybatis中`select`标签的基本用法及其相关属性,并通过示例展示了如何配置和执行SQL查询语句。
68 0
Mybatis入门(select标签)
|
3月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
93 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
3月前
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
223 0
|
3月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
105 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块