MyBatis 注解方式的基本用法

什么是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 注解有两个属性,分别是idvalue。其中id属性对应的是XML配置中resultMap标签的id属性,这样只要在接口中写一次就可以公用一个resultMap了。而value属性对应的是XML配置中resultMap标签下的标签,标签用id=true属性来确定。

    • @Result 注解

      @Result 注解常用属性idcolumnpropertyid属性是用来确定是否是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 = truekeyProperty = "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的注解中提供了两个必填的属性typemethodtype配置的是一个包含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 从入门到精通 作者:刘增辉

你可能感兴趣的:(MyBatis 注解方式的基本用法)