SpringBoot整合mybatis使⽤注解实现动态Sql、参数传递
等常⽤操作(实现⽅法)
前⾯介绍了Spring Boot 整合mybatis 使⽤注解的⽅式实现数据库操作,介绍了如何⾃动⽣成注解版的mapper 和pojo类。接下来介绍使⽤mybatis 常⽤注解以及如何传参数等数据库操作中的常⽤操作。
其实,mybatis 注解⽅式和 XML配置⽅式两者的使⽤基本上相同,只有在构建 SQL 脚本有所区别,所以这⾥重点介绍两者之间的差异,以及增删改查,参数传递等注解的常⽤操作。
注解介绍
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 转换。
springboot原理pdf
以上就是项⽬中常⽤的增、删、改、查的操作,其实这些在基本的⽅法不需要⼿动写,⽤前⾯讲过的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 = ListByNameAndSex(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 (CompanyId() != null) {
SET("company_id = #{companyId,jdbcType=VARCHAR}");
}
if (Username() != null) {
SET("username = #{username,jdbcType=VARCHAR}");
}
if (Password() != null) {
SET("password = #{password,jdbcType=VARCHAR}");
}
if (Nickname() != null) {
SET("nickname = #{nickname,jdbcType=VARCHAR}");
}
if (Age() != null) {
SET("age = #{age,jdbcType=INTEGER}");
}
if (Sex() != null) {
SET("sex = #{sex,jdbcType=INTEGER}");
}
if (Job() != null) {
SET("job = #{job,jdbcType=INTEGER}");
}
if (FaceImage() != null) {
SET("face_image = #{faceImage,jdbcType=VARCHAR}");
}
if (Province() != null) {
SET("province = #{province,jdbcType=VARCHAR}");
}
if (City() != null) {
SET("city = #{city,jdbcType=VARCHAR}");
}
if (District() != null) {
SET("district = #{district,jdbcType=VARCHAR}");
}
if (Address() != null) {
SET("address = #{address,jdbcType=VARCHAR}");
}
if (AuthSalt() != null) {
SET("auth_salt = #{authSalt,jdbcType=VARCHAR}");
}
if (LastLoginIp() != null) {
SET("last_login_ip = #{lastLoginIp,jdbcType=VARCHAR}");
}
if (LastLoginTime() != null) {
SET("last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}");  }
if (IsDelete() != null) {
SET("is_delete = #{isDelete,jdbcType=INTEGER}");
}
if (RegistTime() != 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内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。