MyBatis 注解方式的基本用法
My ti 注解方式就是将 SQL 语句直接写在接口上。这种方式的优点是 对于需求比较简单的系统,效率较高。缺点是 SQL 有变化时都需要重新编译代码, 般情况下不建议使用注解方式 此, 本章会介绍如 使用注解方式,为大家提供全面的示例 但不会进行深入讲解MyBatis 注解 SQL 中,最基本的就是@ Select 、@ Insert 、@ Update 和@ Delete下面以 RoleMapper 为例,对这几个注解的用法进行讲解
1、@Select 注解
#接口
@Select({"select id, role_name roleName, enabled, create_by createBy, create_time createTime from sys_role where id = #{id} "})
SysRole selectByid(Long id);
使用注解就是在接口方法基础上添加需要的注解,并写上相应的 SQL 语句 Sel ect @Insert 、@ Update 和@ Delete 个基本注解的参数可以是字符串数组类型,也可以是字 符串类型。 使用注解方式同样需要考虑表字段和 Ja 属性字段映射的问题,在第 中己经讲过 XML 方式是如何实现宇段映射的,接下来看 下注解方式是如何实现的 种是通过 SQL 语句 用别名来实现,上面的例子中已经使用过 除此之外还有另外两种方式分别是使用 mapUnderscoreToCamelCase 配置以及使用 resultMap 方式,下面详细说明
2、使用 mapUnderscoreToCamelCase 配置
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
#mapUnderscoreToCamelCase 配置方式参考之前
使用这种配置方式不需要手动指定别名 MyBatis 字段按照 “下画线转驼峰”的方式 自动
映射,@Select 注解中的 SQL 可以写成如下两种方式。
select * from sys role where id = #{id)
或者
select role_name , enabled, create_by, create_time from sys_role
where id = #{id)
3、使用resultMap 方式
泊位中的 resultMap 元素有 个对应的 Java 注解@ Results ,使用这个注解来实现属性
映射,新增 selectByid2 方法,代码如下
@Results({
@Result(property = ” i d ”, 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 ”)
@Selec t (”s elect id,role name , enabled, create by , create time
from sys_role where id = #{id )”)
SysRole selectByid2(Long id);
这里的@ Result 注解对应着 ML 文件中的<result >元素 ,而参数中写上 id = true
时就对应<id >元素。
使用@ Results 注解的时候,大家可能会担心, 是不是要在每一个方法上都这么写。在
MyBatis 3.3.0 及以前版本中,注解定义的@ Results 不能共用,使用很不方便,确实是要在每
个方法上都写 遍。但从 MyBatis 3.3. 版本开始,@ Re sults 注解增加了 id 属性,设
置了 id 属性后,就可以通过 id 属性引用同一个@Results 配置了 ,示例代码如下
@Results (id = ” roleResultMap”, value = {
} )
@Result(property = ” id”, column = ” id”, id = true),
//其他...
如何引用这个@ Results 呢?新增一个 selectAll 方法,代码如下。
@ResultMap (”roleResultMap”)
使用@ ResultMap 注解引用即可,注解的参数值就是上面代码中设置的 id 的值, 当配合 着使用 XML 方式的时候,还可以是 XML resultMap >元素的 id 属性值。
4、@Insert
@Insert 注解本身是简单的,但如果需要返回主键的值,情况会变得稍微复杂
1、不需要返回主键
这个方法和 XML 中的 SQL 完全-样,这里不做特别介绍,代码如下。
@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);
2、返回自增主键
新增 insert2 方法,代码如下。
@Insert ({”insert into sys_role (role_name, enabled, create_by, create_ time )”,
” values(#{roleName}, #{enabled}, #{createBy },”,
”#{ createTime, jdbcType=TIMESTAMP })”})
@Options(useGeneratedKeys =true, keyProperty =”id”)
int insert2(SysRole sysRole);
和上面的 insert 方法相比, insert2 方法中的 SQL 中少了 id 列,注解多了
@Options ,我们在这个注解中设置了 useGeneratedKeys keyProperty 属性,用法和
XML 相同, 当需要配置多个列时,这个注解也提供了 ke yColumn 属性,可以像 ML 那样
配置使用。
3、返回非自增主键
新增 insert3 方法,代码如下。
@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);
使用@ SelectKey 注解,以下代码是前面 XML 中配置的 selectKeyo
<selectKey keyColumn=”id” resultType=”long” keyProperty=”id” order=”AFTER”>
SELECT LAST INSERT ID {)
</selectKey>
来对比 下,配置属性基本上都是相同的,其中 before false 时功能等同于
order=" AFTER ”, before true 时功能等同于 order BEFORE
在不同的数据库中, order 的配置不同,大家可以参考前面 XML 中的内容,自行编写测试
5、@Update注解和@Delete 注解
@Update 注解和@ Delete 注解的用法可以用以下示例来进行说明。
RoleMapper 中新增 updateByid deleteByid 方法,代码如下
@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);
大家可以参考 UserMapperTest 中的例子自行写出相应的测试代码,此处不做详细说明
6、Provider 注解
除了上面 种注解可以使用简单的 SQL 外, MyBatis 还提供了 Provider 注解,分别@SelectProvider 、@ InsertProvider 、@Update Provider 和@DeleteProvider他们同样可以实现查询、插入、更新、删除操作。
下面通过@ SelectProvider 用法来了解 Provider 注解方式的基本用法
创建 PrivilegeMapper 接口,添加 selectByid 方法,代码如下
@SelectProvider(type = PrivilegeProvider.class , method = ” s electBy id”)
SysPrivilege selectByid(Long id);
其中 PrivilegeProvider 类代码如下。
public class PrivilegeProv der {
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 配置的是 个包含 meth od
属性指定方法的类,这个类必须有空的构造方法,这个方法的值就是要执行的 SQL 语句, 并且
method 属性指定的方法的返回值必须是 Stri 类型 注意观察上面的代码,拼接 SQL 语句
时使用了口ew SQL () { ... }方法
还可以直接返回 SQL 字符串,代码如下。
public String selectByid(final Long id) {
return ” select id, privilege name, privilege url ”+
” from sys_privilege where id = #{id }”;
对于以上两种写法,大家可以根据自己的需求来选择其中的任意 种, SQL 较长或需要
接时推荐使用 new SQL ()的方式 以下是 selectByid 方法的测试代码
最常用的注解基本介绍完毕,由于 MyBatis 的注解方式不是主流,因此不做过多讲解。如
果大家有需要 可以参考 MyBatis 官方项目中的测试用例( 具体参考 1.4 节),通过这些测试
用例可以学习注解的基本用法,至于更复杂更高级 的用法就需要大家自己去摸索验证了。
3.5 本章小结
在这 章中,我们学习了几个 MyBatis 注解,使用注解可以帮助我们实现 些简单的 SQL
操作 由于注解方式需要手动拼接字符串,需要编写代码重新编译,不方便维护,因此除非在
程序简单且数据库表基本不变的情况下 ,否则都不建议使用 。本章讲解注解的目的 方面是希
望为有需要的人提供一个基础的入 门,更重要的是希望通过和 XML 方式的对比帮助大家更深
入地理解 MyBatis 的用法
|