什么是MyBatis的注解方式
MyBatis的注解方式就是将SQL语句直接写在接口上。在MyBatis注解SQL中,最基本的就是@Select、@Insert、@Update和@Delete四种。
MyBatis注解方式的优缺点
-
优点
对于需求比较简单的系统,效率高。
-
缺点
当SQL有变化时都需要重新编译代码,一般情况下不建议使用注解方式
基本注解
@Select 注解
@Results(id = "BaseResultMap", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "nickname", column = "nickname"),
@Result(property = "phone", column = "phone"),
@Result(property = "email", column = "email")
})
@Select({"select id, username, password, nickname, phone, email from `db_user` where id = #{key}"})
User selectUserByPrimaryKey(Long key);
-
@Select 注解
查询相关的SQL写在@Select注解中,花括号里面的内容可以是字符串也可以是字符串数组。
-
@Results、@Result 注解
@Results和@Result注解是结合起来用的,@Result注解包含在@Results注解的
value
属性中。-
@Results 注解
@Results 注解有两个属性,分别是
id
和value
。其中id
属性对应的是XML配置中resultMap标签的id
属性,这样只要在接口中写一次就可以公用一个resultMap了。而value
属性对应的是XML配置中resultMap标签下的
和
标签,
标签用id=true
属性来确定。 -
@Result 注解
@Result 注解常用属性
id
、column
和property
。id
属性是用来确定是否是id的,布尔类型。column
属性是对应数据库字段的,字符串类型。property
属性是对应JavaBean对象属性的,字符串类型。
-
@ResultMap("BaseResultMap")
@Select({"select id, username, password, nickname, phone, email from `db_user`"})
List selectAllUser();
-
@ResultMap 注解
@ResultMap 注解就一个作用,使用已经定义好的@Results或XML配置里已经写好的resultMap。里面的
value
属性即是@Results的id
属性值或XML里resultMap的id
属性值。
@Insert 注解
@Insert({"insert into `db_user`(username, password, nickname, phone, email) values (#{username}, #{password}, #{nickname}, #{phone}, #{email})"})
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertUser(User user);
-
@Insert 注解
添加相关的SQL写在@Insert注解中,花括号里面的内容可以是字符串也可以是字符串数组。
-
@Options 注解
当添加操作需要返回自增主键时可以使用@Options注释。添加属性
useGeneratedKeys = true
和keyProperty = "id"
即可在数据添加后获取添加数据的ID值。
@Delete 注解
@Delete({"delete from `db_user` where id = #{key}"})
int deleteUserByPrimaryKey(Long key);
删除相关的SQL写在@Delete注解中,花括号里面的内容可以是字符串也可以是字符串数组。
@Update 注解
@Update({"update `db_user` set nickname = #{nickname} where id = #{id}"})
int updateUserByPrimaryKey(User user);
修改相关的SQL写在@Update注解中,花括号里面的内容可以是字符串也可以是字符串数组。
Provider 注解
首先创建UserMapper接口,定义接口方法。然后创建UserProvider类,在UserProvider类中定义与接口中方法对应的返回SQL语句的方法。
Provider的注解中提供了两个必填的属性type
和method
。type
配置的是一个包含method
属性指定方法的类,这个类必须有空的构造方法,这个方法的值就是要执行的SQL语句,并且method
属性指定的方法的返回值必须是String类型。
@InsertProvider
- UserProvider类中的方法
public String insertUser(User user) {
return new SQL(){
{
INSERT_INTO("`db_user`");
INTO_COLUMNS("username, password, nickname, phone, email");
INTO_VALUES("#{username}, #{password}, #{nickname}, #{phone}, #{email}");
}
}.toString();
}
- UserMapper接口中的方法
@InsertProvider(type = UserProvider.class, method = "insertUser")
@Options(useGeneratedKeys = true)
int insertUser(User user);
@DeleteProvider
- UserProvider类中的方法
public String deleteUserByPrimaryKey(Long key) {
return new SQL(){
{
DELETE_FROM("`db_user`");
WHERE("id = #{key}");
}
}.toString();
}
- UserMapper接口中的方法
@DeleteProvider(type = UserProvider.class, method = "deleteUserByPrimaryKey")
int deleteUserByPrimaryKey(Long key);
@UpdateProvider
- UserProvider类中的方法
public String updateUserByPrimaryKey(User user) {
return new SQL(){
{
UPDATE("`db_user`");
SET("nickname = #{nickname}","username = #{username}","password = #{password}");
WHERE("id = #{id}");
}
}.toString();
}
- UserMapper接口中的方法
@UpdateProvider(type = UserProvider.class, method = "updateUserByPrimaryKey")
int updateUserByPrimaryKey(User user);
@SelectProvider
- UserProvider类中的方法(这里顺带展示了2中返回SQL的方法)
public String selectUserByPrimaryKey(Long key) {
return new SQL(){
{
SELECT("id, username, password, nickname, phone, email");
FROM("`db_user`");
WHERE("id = #{key}");
}
}.toString();
}
public String selectAllUser() {
return "select id, username, password, nickname, phone, email from `db_user`";
}
- UserMapper接口中的方法
@Results(id = "BaseResultMap", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "username", column = "username"),
@Result(property = "password", column = "password"),
@Result(property = "nickname", column = "nickname"),
@Result(property = "phone", column = "phone"),
@Result(property = "email", column = "email")
})
@SelectProvider(type = UserProvider.class, method = "selectUserByPrimaryKey")
User selectUserByPrimaryKey(Long key);
@SelectProvider(type = UserProvider.class, method = "selectAllUser")
@ResultMap("BaseResultMap")
List selectAllUser();
参考资料:MyBatis 从入门到精通 作者:刘增辉