天天看点

MyBatis学习笔记(三)——注解方式的基本使用前言@Select注解@Insert注解@Update注解和@Delete注解Provider注解总结:

前言

上一篇博客总结了mybatis基于XML配置的用法,传送门。这篇博客总结一下mybatis基于注解的用法。在mybatis的注解中基本就是@Select、@Insert、@Update、@Delete四种注解的使用。本篇博客将会以sys_role表格为实例进行操作。

@Select注解

resultMap方式

在xml使用方式中,resultMap标签对应完成了类型的映射,如下所示:

<resultMap id="BaseResultMap" type="com.learn.chapterfour.domain.SysUser">
        <result column="id" jdbcType="INTEGER" property="id"/>
        <result column="user_name" jdbcType="VARCHAR" property="userName"/>
        <result column="user_password" jdbcType="VARCHAR" property="userPassword"/>
        <result column="user_email" jdbcType="VARCHAR" property="userEmail"/>
        <result column="user_info" jdbcType="VARCHAR" property="userInfo"/>
        <result column="head_img" jdbcType="BLOB" property="headImg"/>
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
    </resultMap>
           

对应的注解实现方式:

@Results(id = "roleResultMap", value = {
            @Result(property = "id", column = "id", id = true),
            @Result(property = "roleName", column = "role_name"),
            @Result(property = "enabled", column = "enabled"),
            @Result(property = "createBy", column = "create_by"),
            @Result(property = "createTime", column = "create_time")
    })
           

后面要引用这个映射结果,就直接使用@ResultMap注解就可以了。

@Select的使用

@ResultMap("roleResultMap")
    @Select({"select id,role_name,enabled,create_by,create_time", "from sys_role ", "where id = #{id}"})
    public SysRole selectById2(Long id);
           

@Insert注解

其实该注解的使用本身很简单,但是设计到主键的返回,就变得有点复杂

@Insert({"insert into sys_role(id,role_name,enabled,create_by,create_time)", "values(#{id},#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"})
    public int insertSysRoleWithOutId(SysRole sysRole);
           

@insert注解返回自增主键

/**
     * 自动返回主键,这里不用设置主键,会自动生成主键
     *
     * @param sysRole
     * @return
     */
    @Insert({"insert into sys_role(role_name,enabled,create_by,create_time)", "values(#{roleName},#{enabled},#{createBy},", "#{createTime,jdbcType=TIMESTAMP})"})
    @Options(useGeneratedKeys = true, keyProperty = "id")
    public int insertSysRoleWithAutoIncreament(SysRole sysRole);
           

和上面的insert方法相比,这个方法中的注解就少了id一列,注解多了一个@Options,其中的两个属性的作用和xml中的作用一致。

@insert注解返回非自增主键

/**
     * 自动返回主键,但是非自增
     *
     * @param sysRole
     * @return
     */
    @Insert({"insert into sys_role(role_name,enabled,create_by,create_time)", "values(#{roleName},#{enabled},#{createBy},", "#{createTime,jdbcType=TIMESTAMP})"})
    @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", resultType = Long.class, before = false)
    public int insertSysRoleWithIdNotAutoIncreament(SysRole sysRole);
           

返回非自增主键指的是针对没有自增主键的数据库进行操作。

@Update注解和@Delete注解

@Update({"update sys_role set ", "role_name = #{roleName},enabled=#{enabled},create_by = #{createBy},create_time = #{createTime,jdbcType=TIMESTAMP}", " where id = #{id}"})
    public int updateById(SysRole sysRole);

    @Delete("delete from sys_role where id = #{id}")
    public int deleteById(Long id);
           

Provider注解

MyBatis同时提供了@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider注解,这几个注解也能实现相关的CRUD。

实例:

@SelectProvider(type=PrivilegeProvider.class,method = "selectById")
SysPrivilege selectById(Long id)


public class PrivilegeProvider{
    public String selectById(final long id){
        return new SQL(){
            {
                SELECT("id,privilege_name,privilege_url");
                FROM("sys_privilege");
                WHERE("id=#{id}");
            }
        }.toString
    }
}
           

Provider的注解中,有两个必填的属性,type,method。type指定的是一个包含method指定的方法的类。这个类必须有空的构造方法。这个方法的返回的值就是需要执行的SQL语句。

总结:

其实熟悉了XML的用法,对于注解的用法还是比较好了解的,总体来看MyBatis的注解使用分为两大类,不同的CRUD注解和Provider注解,可以根据自己的需要选择使用的方式,但是个人觉得Provider注解似乎较好的与业务进行了分离。

完整代码实例移步github(chapter03):https://github.com/liman657/mybatislearn

继续阅读