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 关键字方法,如有兴趣可自行查看,这里不做过多介绍。