MyBatis从入门到精通笔记(3)注解方式的用法

一 说明

我觉得MyBatis最佳实践方式仍是配合xml。当然注解也有使用场景,我们简单了解下。

二 @Select注解

注解中的值可以传字符串或字符串数组

我更喜欢数组方式,因为换行。代码更容易阅读

    @Select({"select id,role_name roleName, enabled, create_by createBy, create_time createTime",
            "from sys_role",
            "where id = #{id}"})
    SysRole selectById(Long id);

2.1 结果映射问题

在xml中我们可以使用resultMap或者默认的自动映射(查询的字段改成别名

使用mapUnderscoreToCamelCase 配置

在全局配置文件中开启,笔记2中提到过

使用ResultMap方式

直接写在方法上,注意:@ResultS在3.3.1之前不能复用,即没有id属性

    @Results(id = "roleResultMap", value = {
            @Result(property = "id", column = "id", id = true),//注意id=true,表示xml中的id标签
            @Result(property = "roleName", column = "role_name"),
            @Result(property = "enabled", column = "enabled"),
            @Result(property = "createBy", column = "create_by"),
            @Result(property = "createTime", column = "create_time")
    })
    @Select("select id,role_name, enabled, create_by, create_time from sys_role where id = #{id}")
    SysRole selectById2(Long id);


    @ResultMap("roleResultMap")//引用了上面的@Results的内容
    @Select("select * from sys_role")
    List<SysRole> selectAll();

三 @Insert注解

3.1 不需要返回主键时

    /**
     * 最普通的插入,这里id时数据自增的。但插入后,后端获取不到具体的值
     * @param sysRole
     * @return
     */
    @Insert({"insert into sys_role(id, role_name, enabled, create_by, create_time)",
            "values(#{id}, #{roleName}, #{enabled}, #{createBy}, #{createTime, jdbcType=TIMESTAMP})"})
    int insert(SysRole sysRole);

3.2 需要返回自增主键时

使用jdbc

    /**
     * 使用useGeneratedKeys
     * @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")//keyProperty声明把id设置到哪个bean的字段,具体查看文章2
    int insert2(SysRole sysRole);

通过selectKey查询

    /**
     * 这里是mysql,所以before=false
     * @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)
    int insert3(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}"
		})
	int updateById(SysRole sysRole);
	
	@Delete("delete from sys_role where id = #{id}")
	int deleteById(Long id);

五 Provider 注解

MyBatis 还提供了4 种Provider 注解,我的理解就是写接口的具体实现。简单的示例

mapper接口的方法

	  /**
     * type指定实现类,method指定方法名
     * @param id
     * @return
     */
    @SelectProvider(type = RoleMapperProvider.class,method = "selectById")
    @ResultMap("roleResultMap")//引用了上面的@Results的内容
    SysRole selectById3(Long id);
public class RoleMapperProvider {

    public String selectById(final Long id){
        return new SQL(){
            {
                SELECT("id,role_name, enabled, create_by, create_time");
                FROM("sys_role");
                WHERE("id = #{id}");
            }
        }.toString();
    }

}

这个没什么特别的,和@select、@insert的用法基本一致

参考

  1. 《MyBatis 从入门到精通》
  2. 源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值