MyBatis 入门 (六)

Use MyBatis By Annotation

为方便理解,本章涉及示例代码已上传至 gitee
==>获取示例代码请点击这里。。。
拉取示例代码时,请拉取所有分支,master 分支只是做了示例的初始化

@Select

先上一段示例代码:

public interface SysPrivilegeMapper {

    // other Methods ...
    @Select(value = {"select id, ",
            "privilege_name privilegeName,",
            "privilege_url privilegeUrl",
            "from sys_privilege where id = #{id}"})
    SysPrivilege selectById(Long id);
}

这里 @Select 注解的值为 String[] 类型。

下图为 MyBatis 对通过使用注解形式的接口方法进行解析的过程:在这里插入图片描述
进行接口方法和 SQL 的绑定是在 MyBatis 的初始化环节,可以参考上一节中的 MyBatis 动态代理。

这里需要关注一下返回数据的绑定问题:

返回数据的绑定方式共有三种:

  • @Select 标签中给查询字段设置别名

  • 使用 mapUnderscoreToCamelCase 配置,该方式为 MyBatis 的全局配置,不受 XML 或 Annotation 方式限制,具体使用方法参考前文 Use Select 章节的 MyBatis 别名设置部分

  • 使用 resultMap 方式
    以下为 resultMap 的使用示例:

public interface SysPrivilegeMapper {
    // other Methods ....
    
    @Select(value = {"select id, ",
            "privilege_name,",
            "privilege_url",
            "from sys_privilege where id = #{id}"})
    @Results(id = "sysPrivilege",value = {
            @Result(column = "id",property = "id"),
            @Result(column = "privilege_name",property = "privilegeName"),
            @Result(column = "privilege_url", property = "privilegeUrl")
    })
    SysPrivilege selectById(Long id);

    @Select(value = {"select id, ",
            "privilege_name,",
            "privilege_url",
            "from sys_privilege where id = #{id}"})
    @ResultMap(value = "sysPrivilege")
    SysPrivilege selectById2(Long id);
}

这里的 selectById2() 的 @ResultMap 的 value 值为我们在 selectById() 方法上设置的 @Results 的 id 值,表示重复使用 @Results 中字段映射配置;当 XML 与 Annotation 方式同时使用时,@ResultMap 的 value 值可以是 XML 中的 resultMap 的 ID 值, XML 中的 resultMap 的值也可以是 @Results 的 ID 值,但是在 XML 中引用的时候,会报错,容易给不清楚状况的程序员造成错误引导,所以不推荐在 XML 中引用注解方式配置的 results 。


@Insert

@Insert 注解的使用,具体分为三种情况

  • 不返回插入行的主键
  • 返回自增主键
  • 返回非自增主键
    下面依次通过示例代码来看:

不返回插入行的主键

public interface SysUserMapper {
    // other Methods ...
    
    @Insert(value = {
            "insert into sys_user ",
            "(user_name,user_password,user_info,head_img,create_time)",
            "values(",
            "#{userName},#{userPassword},#{userInfo},#{headImg},#{createTime})"
    })
    Integer insertInfo2(SysUser sysUser);
}

返回自增主键

public interface SysUserMapper {
    // other Methods ...

    @Insert(value = {
            "insert into sys_user ",
            "(user_name,user_password,user_info,head_img,create_time)",
            "values(",
            "#{userName},#{userPassword},#{userInfo},#{headImg},#{createTime})"
    })
    @Options(useGeneratedKeys = true,keyColumn = "id",keyProperty = "id")
    Integer insertUseJDBCKeys2(SysUser sysUser);
}

返回非自增主键

public interface SysUserMapper {
    // other Methods ...

    @Insert(value = {
            "insert into sys_user ",
            "(user_name,user_password,user_info,head_img,create_time)",
            "values(",
            "#{userName},#{userPassword},#{userInfo},#{headImg},#{createTime})"
    })
    @SelectKey(
            statement = "select last_insert_id()",
            resultType = Integer.class,
            keyProperty = "id",
            keyColumn = "id",
            before = false
    )
    Integer insertUseSelectKey2(SysUser sysUser);
}

通过观察上述示例的返回自增与非自增的注解使用,可以发现,与在 XML 文件中的使用方式大同小异。需要注意的一点是:@SelectKey 注解中的 before 为 false 时,对应 XML 中的 order = “after”,before 为 true 时,对应 XML 中的 order = “before”,实际开发中请留意该处。


@Update

示例如下:

@Update(value = {
    "update sys_user set",
    "user_name = #{userName},",
    "user_password = #{userPassword},",
    "user_info = #{userPassword},",
    "user_email = #{userEmail},",
    "head_img = #{headImg},",
    "create_time = #{createTime}",
    "where id = #{id}"
})
Integer updateById2(SysUser sysUser);

@Delete

示例如下:

@Delete(value = {
	"delete from sys_user where id = #{id}"
})
Integer deleteById2(Integer id);

@Update 和 @Delete 的用法于 XML 中的用法基本没有什么差异,故此处不做过多记录。


Provider 类型注解的使用

该注解共分为四种类型:@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider,一般情况下很少被使用到,下面仅通过一个对 @SelectProvider 注解的示例来大致了解一下如何使用,以便日后开发中看到时不至于懵逼。

示例如下:

// 首先定义一个 SysPrivilegerProvider.class
public class SysPrivilegerProvider {
    public String selectByOneInfo(Integer id) {
        SQL selectByOneInfo = new SQL();
        selectByOneInfo.SELECT("id,privilege_name,privilege_url");
        selectByOneInfo.FROM("sys_privilege");
        selectByOneInfo.WHERE("id = #{id}");
        return selectByOneInfo.toString();
    }
}
// Mapper 接口的方法注解示例如下
public interface SysPrivilegeMapper {
	// other Methods ...

    @SelectProvider(type = SysPrivilegerProvider.class,method = "selectByOneInfo")
    SysPrivilege selectByOneInfo(Integer id);
}

然后就可以像使用接口中的其他操作数据库的方法一样使用它了。

在接口方法的 @SelectProvider 注解中,type 值为我们上面定义的 SysPrivilegerProvider 类,method 对应的是 SysPrivilegerProvider 类中的 selectByOneInfo() 方法;SysPrivilegerProvider 类中定义的 selectByOneInfo() 方法,创建一个 org.apache.ibatis.jdbc 包下的 SQL 实例,然后通过调用它的 SELECT(…)、FROM(…)、WHERE(…) 方法,分别设置查询的字段,要查询的表名,和条件,该类实现了一个 AbstractSQL 抽象类,其中还定义了其他的 SQL 关键字方法,如有兴趣可自行查看,这里不做过多介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值