Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类。 接下来介绍使用mybatis 常用注解以及如何传参数等数据库操作中的常用操作。

其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,以及增删改查,参数传递等注解的常用操作。

详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)已经介绍过了,不清楚的朋友可以看看之前的文章:https://www.jb51.net/article/127473.htm

注解介绍

mybatis 注解方式的最大特点就是取消了Mapper的XML配置,具体的 SQL 脚本直接写在 Mapper 类或是 SQLProvider 中的方法动态生成。
mybatis 提供的常用注解有:@Insert 、@Update 、@Select、 @Delete等标签,这些注解其实就是 MyBatis 提供的来取代其 XML配置文件的。

1、@Select 注解

@Select,主要在查询的时候使用,查询类的注解,一般简单的查询可以使用这个注解。

@Select({
 "select",
 "id, company_id, username, password, nickname, age, sex, job, face_image, province, ",
 "city, district, address, auth_salt, last_login_ip, last_login_time, is_delete, ",
 "regist_time",
 "from sys_user",
 "where id = #{id,jdbcType=VARCHAR}"
})
@Results({
 @Result(column="id", property="id", jdbcType=JdbcType.VARCHAR, id=true),
 @Result(column="company_id", property="companyId", jdbcType=JdbcType.VARCHAR),
 @Result(column="face_image", property="faceImage", jdbcType=JdbcType.VARCHAR),
 @Result(column="auth_salt", property="authSalt", jdbcType=JdbcType.VARCHAR),
 @Result(column="last_login_ip", property="lastLoginIp", jdbcType=JdbcType.VARCHAR),
 @Result(column="last_login_time", property="lastLoginTime", jdbcType=JdbcType.TIMESTAMP),
 @Result(column="is_delete", property="isDelete", jdbcType=JdbcType.INTEGER),
 @Result(column="regist_time", property="registTime", jdbcType=JdbcType.TIMESTAMP)
})
User selectByPrimaryKey(String id);

注意:如果是多个参数,需要将 #后面的参数和传入的变量名保持一致。

2、@Insert 注解

@Insert,插入数据时使用,直接传入数据实体类,mybatis 会属性自动解析到对应的参数。所以需要将 #后面的参数和实体类属性保持一致。

 @Insert({
  "insert into sys_user (id, company_id, ",
  "username, password, ",
  "nickname, age, sex, ",
  "job, face_image, ",
  "province, city, ",
  "district, address, ",
  "auth_salt, last_login_ip, ",
  "last_login_time, is_delete, ",
  "regist_time)",
  "values (#{id,jdbcType=VARCHAR}, #{companyId,jdbcType=VARCHAR}, ",
  "#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, ",
  "#{nickname,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{sex,jdbcType=INTEGER}, ",
  "#{job,jdbcType=INTEGER}, #{faceImage,jdbcType=VARCHAR}, ",
  "#{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, ",
  "#{district,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR}, ",
  "#{authSalt,jdbcType=VARCHAR}, #{lastLoginIp,jdbcType=VARCHAR}, ",
  "#{lastLoginTime,jdbcType=TIMESTAMP}, #{isDelete,jdbcType=INTEGER}, ",
  "#{registTime,jdbcType=TIMESTAMP})"
 })
 int insert(User record);

注意:需要将 #后面的参数和实体类属性保持一致。

3、@Update 注解

@Update,一般数据更新操作可以使用 @Update注解实现。

@Update({
  "update sys_user",
  "set company_id = #{companyId,jdbcType=VARCHAR},",
   "username = #{username,jdbcType=VARCHAR},",
   "password = #{password,jdbcType=VARCHAR},",
   "nickname = #{nickname,jdbcType=VARCHAR},",
   "age = #{age,jdbcType=INTEGER},",
   "sex = #{sex,jdbcType=INTEGER},",
   "job = #{job,jdbcType=INTEGER},",
   "face_image = #{faceImage,jdbcType=VARCHAR},",
   "province = #{province,jdbcType=VARCHAR},",
   "city = #{city,jdbcType=VARCHAR},",
   "district = #{district,jdbcType=VARCHAR},",
   "address = #{address,jdbcType=VARCHAR},",
   "auth_salt = #{authSalt,jdbcType=VARCHAR},",
   "last_login_ip = #{lastLoginIp,jdbcType=VARCHAR},",
   "last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},",
   "is_delete = #{isDelete,jdbcType=INTEGER},",
   "regist_time = #{registTime,jdbcType=TIMESTAMP}",
  "where id = #{id,jdbcType=VARCHAR}"
 })
 int updateByPrimaryKey(User record);

4、@Delete 注解
@Delete 数据删除的注解

 @Delete({
  "delete from sys_user",
  "where id = #{id,jdbcType=VARCHAR}"
 })
 int deleteByPrimaryKey(String id);

5、@Results和@Result注解

@Results 和 @Result 主要作用是,当有一些特殊的场景需要处理,查询的返回结果与期望的数据格式不一致时,可以将将数据库中查询到的数值自动转化为具体的属性或类型,,修饰返回的结果集。比如查询的对象返回值属性名和字段名不一致,或者对象的属性中使用了枚举等。如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。

@Select({
 "select",
 "id, company_id, username, password, nickname, age, sex, job, face_image, province, ",
 "city, district, address, auth_salt, last_login_ip, last_login_time, is_delete, ",
 "regist_time",
 "from sys_user",
 "where id = #{id,jdbcType=VARCHAR}"
})
@Results({
 @Result(column="id", property="id", jdbcType=JdbcType.VARCHAR, id=true),
 @Result(column="company_id", property="companyId", jdbcType=JdbcType.VARCHAR),
 @Result(column="face_image", property="faceImage", jdbcType=JdbcType.VARCHAR),
 @Result(column="auth_salt", property="authSalt", jdbcType=JdbcType.VARCHAR),
 @Result(column="last_login_ip", property="lastLoginIp", jdbcType=JdbcType.VARCHAR),
 @Result(column="last_login_time", property="lastLoginTime", jdbcType=JdbcType.TIMESTAMP),
 @Result(column="is_delete", property="isDelete", jdbcType=JdbcType.INTEGER),
 @Result(column="regist_time", property="registTime", jdbcType=JdbcType.TIMESTAMP)
})
User selectByPrimaryKey(String id);

上面的例子可以看到,数据库中的company_id 字段和实体类中定义的 companyId 属性的名称不一致,需要Result 转换。

以上就是项目中常用的增、删、改、查的操作, 其实这些在基本的方法不需要手动写,用前面讲过的mybatis generator 自动生成即可。讲这些主要是熟悉这些常用的注解。

传参方式

上面介绍了mybatis 常用的注解,如何实现增删改查的操作,相信很多人会有疑问了: mybatis 是如何将参数传递到 SQL 中的呢,都有哪几种传参方式呢? 下面就来一一介绍mybatis 注解版的传参方式。

1、直接传参

对于单个参数的方法,可直接使用 #{id} 的方式接收同名的变量参数。

@Delete("delete from sys_user where id = #{id,jdbcType=VARCHAR}")
int deleteByPrimaryKey(String id);

2、使用@Param 注解

@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 。如果你的方法有多个参数,@Param注解 会在方法的参数上就能为它们取自定义名字,参数则先以 "param" 作前缀,再加上它们的参数位置作为参数别名。例如, #{param1}、 #{param2},这个是默认值。如果注解是 @Param("person"),那么参数就会被命名为 #{person}。

@Select("SELECT * FROM sys_user WHERE username = #{username} and password = #{password}")
List<User> getListByUserSex(@Param("username") String userName, @Param("password") String password);

// 不自定义param 时,默认使用 param + 参数序号 或者 0,1,值就是参数的值。
@Select("SELECT * FROM sys_user WHERE username = #{param1} and password = #{param2}")
List<User> getListByUserSex(String userName, String password);

3、Map 传值
需要传送多个参数时,也可以考虑使用Map的形式。

@Select("SELECT * FROM sys_user WHERE username=#{username} AND password = #{password}")
List<User> getListByNameAndSex(Map<String, Object> map);

调用时将参数依次加入到 Map 中即可。

Map param= new HashMap();
param.put("username","admin");
param.put("password","123456");
List<User> users = userMapper.getListByNameAndSex(param)

4、使用pojo对象
使用pojo对象传参是比较常用的传参方式。像上面的insert、update 等方法。都是直接传入user对象。

@Update({
 "update sys_user",
 "set company_id = #{companyId,jdbcType=VARCHAR},",
  "username = #{username,jdbcType=VARCHAR},",
  "password = #{password,jdbcType=VARCHAR},",
  "nickname = #{nickname,jdbcType=VARCHAR},",
  "age = #{age,jdbcType=INTEGER},",
  "sex = #{sex,jdbcType=INTEGER},",
  "job = #{job,jdbcType=INTEGER},",
  "face_image = #{faceImage,jdbcType=VARCHAR},",
  "province = #{province,jdbcType=VARCHAR},",
  "city = #{city,jdbcType=VARCHAR},",
  "district = #{district,jdbcType=VARCHAR},",
  "address = #{address,jdbcType=VARCHAR},",
  "auth_salt = #{authSalt,jdbcType=VARCHAR},",
  "last_login_ip = #{lastLoginIp,jdbcType=VARCHAR},",
  "last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP},",
  "is_delete = #{isDelete,jdbcType=INTEGER},",
  "regist_time = #{registTime,jdbcType=TIMESTAMP}",
 "where id = #{id,jdbcType=VARCHAR}"
})
int updateByPrimaryKey(User record);

以上,就是Mybatis 传参的四种方式。根据方法的参数选择合适的传值方式。

动态 SQL

实际项目中,除了使用一些常用的增删改查的方法之外,有些复杂的需求,可能还需要执行一些自定义的动态sql。mybatis 除了提供了@Insert、@Delete 这些常用的注解,还提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,用来建立动态sql 和让 mybatis 执行这些sql 的注解。下面就来实现按字段更新的功能。

1、首先在 UserSqlProvider 中创建 拼接sql的方法。

public String updateByPrimaryKeySelective(User record) {
  BEGIN();
  UPDATE("sys_user");

  if (record.getCompanyId() != null) {
   SET("company_id = #{companyId,jdbcType=VARCHAR}");
  }

  if (record.getUsername() != null) {
   SET("username = #{username,jdbcType=VARCHAR}");
  }

  if (record.getPassword() != null) {
   SET("password = #{password,jdbcType=VARCHAR}");
  }

  if (record.getNickname() != null) {
   SET("nickname = #{nickname,jdbcType=VARCHAR}");
  }

  if (record.getAge() != null) {
   SET("age = #{age,jdbcType=INTEGER}");
  }

  if (record.getSex() != null) {
   SET("sex = #{sex,jdbcType=INTEGER}");
  }

  if (record.getJob() != null) {
   SET("job = #{job,jdbcType=INTEGER}");
  }

  if (record.getFaceImage() != null) {
   SET("face_image = #{faceImage,jdbcType=VARCHAR}");
  }

  if (record.getProvince() != null) {
   SET("province = #{province,jdbcType=VARCHAR}");
  }

  if (record.getCity() != null) {
   SET("city = #{city,jdbcType=VARCHAR}");
  }

  if (record.getDistrict() != null) {
   SET("district = #{district,jdbcType=VARCHAR}");
  }

  if (record.getAddress() != null) {
   SET("address = #{address,jdbcType=VARCHAR}");
  }

  if (record.getAuthSalt() != null) {
   SET("auth_salt = #{authSalt,jdbcType=VARCHAR}");
  }

  if (record.getLastLoginIp() != null) {
   SET("last_login_ip = #{lastLoginIp,jdbcType=VARCHAR}");
  }

  if (record.getLastLoginTime() != null) {
   SET("last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}");
  }

  if (record.getIsDelete() != null) {
   SET("is_delete = #{isDelete,jdbcType=INTEGER}");
  }

  if (record.getRegistTime() != null) {
   SET("regist_time = #{registTime,jdbcType=TIMESTAMP}");
  }

  WHERE("id = #{id,jdbcType=VARCHAR}");

  return SQL();
 }

2、Mapper 中引入updateByPrimaryKeySelective方法

 @UpdateProvider(type=UserSqlProvider.class, method="updateByPrimaryKeySelective")
 int updateByPrimaryKeySelective(User record);

说明:

  type:动态⽣成 SQL 的类

  method:类中具体的方法名

以上,就是使用sqlprovider 动态创建sql,除了示例中的@UpdateProvider ,,还有 @InsertProvider、 @SelectProvider、@DeleteProvider 提供给插入、查询、删除的时使用。

最后

上面,介绍了使用mybatis 常用注解实现增、删、改、查。以及mybatis 常用的四种参数传递方式。

到此这篇关于Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)的文章就介绍到这了,更多相关Spring Boot整合mybatis内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot集成mybatisplus实例详解

    集成mybatisplus后,简单的CRUD就不用写了,如果没有特别的sql,就可以不用mapper的xml文件的. 目录 pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta

  • springboot集成mybatis-plus遇到的问题及解决方法

    在使用spring boot集成mybatis-plus的过程中遇到的问题 如图, 首先我放xml的包的是没问题的,而是引入的架包和配置问题,问题配置如下 解决方法:请将mybatis-plus改成mybatis,mybatis,mybtis,重要的说三遍,必要的架包如下 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring- boot-start

  • SpringBoot整合MyBatis实现乐观锁和悲观锁的示例

    本文以转账操作为例,实现并测试乐观锁和悲观锁. 全部代码:https://github.com/imcloudfloating/Lock_Demo GitHub Page:https://cloudli.top 死锁问题 当 A, B 两个账户同时向对方转账时,会出现如下情况: 时刻 事务 1 (A 向 B 转账) 事务 2 (B 向 A 转账) T1 Lock A Lock B T2 Lock B (由于事务 2 已经 Lock A,等待) Lock A (由于事务 1 已经 Lock B,等

  • SpringBoot 使用Mybatis分页插件实现详解

    这篇文章主要介绍了SpringBoot 使用Mybatis分页插件实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导入分页插件包和jpa包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </depende

  • Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库操作中的常用操作. 其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,以及增删改查,参数传递等注解的常用操作. 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)已经介绍过了,不清楚的朋友可

  • Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例

    前言 距离第一篇 Spring Boot 系列的博文 3 个月了.虽然 XML 形式是我比较推荐的,但是注解形式也是方便的.尤其一些小系统,快速的 CRUD 轻量级的系统. 这里感谢晓春 http://xchunzhao.tk/ 的 Pull Request,提供了 springboot-mybatis-annotation 的实现. 一.运行 springboot-mybatis-annotation 工程 然后Application 应用启动类的 main 函数,然后在浏览器访问: http

  • Spring Boot整合MyBatis操作过程

    1.加入mybatis-spring-boot-stater的Maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency> 2.配置数据源 在src/main/re

  • Spring Boot 整合mybatis 与 swagger2

    之前使用springMVC+spring+mybatis,总是被一些繁琐的xml配置,有时候如果配置出错,还要检查各种xml配置,偶然接触到了spring boot 后发现搭建一个web项目真的是1分钟的事情,再也不用去管那么多xml配置,简直神清气爽,不用看那么多一坨xml,下面是我把以前的一些ssm项目改成了spring boot + mybatis,相对于来说优点太明显了 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自

  • Spring Boot整合mybatis并自动生成mapper和实体实例解析

    最近一直都在学习Java,发现目前Java招聘中,mybatis出现的频率挺高的,可能是目前Java开发中使用比较多的数据库ORM框架.于是我准备研究下Spring Boot和mybatis的整合. 1.在pom.xml文件中添加下面的配置 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-

  • Spring Boot 整合mybatis 使用多数据源的实现方法

    前言 本篇教程偏向实战,程序猿直接copy代码加入到自己的项目中做简单的修修改改便可使用,而对于springboot以及mybatis不在此进行展开介绍,如有读者希望了解可以给我留言,并持续关注,我后续会慢慢更新.(黑色区域代码部分,安卓手机可手动向左滑动,来查看全部代码) 整合 其实整合很简单,如果是用gradle的话,在build.gradle文件里加入 compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')

  • Spring Boot整合MyBatis连接Oracle数据库的步骤全纪录

    前言 本文主要分享了Spring Boot整合MyBatis连接Oracle数据库的相关内容,下面话不多说了,直接来详细的步骤吧. 步骤如下: 1.Spring Boot项目添加MyBatis依赖和Oracle驱动: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <ver

  • Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    前言 在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Mybatis并完成CRUD操作,这是本文操作的基础.本文先准备一个测试的数据库,然后使用MyBatis Generator进行部分代码自动生成,再以一个例子来展示稍微高级点的操作:使用Mybatis完成级联一对多的CRUD操作. 数据库准备 数据库用到三张表:user表,role表,user_ro

  • Spring Boot整合Mybatis并完成CRUD操作的实现示例

    MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官方一点: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordina

  • 解决Spring boot整合mybatis,xml资源文件放置及路径配置问题

    网上各种解决方案,我试了好久,整合了几篇文章才凑出来,在这里分享一下,实在不想网友们在这里面绕圈子,毕竟,写代码的时间是愉快的,解决bug也是愉快的,但也是一直在bug里面绕圈子就不爽了. 亲自试验: 1) 我的mapper和xml是这样子放置的 2) 在.xml中namespace是这样的: 3) application.properties中mybatis.mapper-locations得这么配置到xml 4) 最后呢,你只要在pom.xml中build下这样配置 5) 按照我这种位置防止

随机推荐