MyBatis注解方法就是将SQL语句直接写在接口上,这种方法相对于比较简单的系统则效率较高,但当SQL有变化时就需要重新编译代码。最基本的有@Select、@Insert、@Update、@Delete,下面在RoleMapper中对几个方法进行演示
使用@Select注解的一个例子
在RoleMapper中添加如下注解方法:
@Select ({"select id ,role_name, roleName,enabled,create_by createBy ,create_time createTime from sys_role where id =#{id} " } ) **这里用到取别名的方法**
SysRole selectById(Long id); **对应的方法**
以上例子是通过取别名来实现方法selectById的映射,跟之前的通过xml注解不同,下面还有两种注解方式,分别是mapUnderscoreToCamelCase(设置自动下划线转驼峰转换)配置以及使用resultMap方式
- mapUnderscoreToCamelCase配置方法:
@Select注解中SQL可以写成如下两种方式:
select * from sys_role where id = #{id}
/ select id ,role_name,enabled,create_by,create_time from sys_role where id =#{id}
使用resultMap方式进行注解
以下例子新增了selectById2方法
@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")
} )
@Select ("select id ,role_name,enabled,create_by ,create_time from sys_role where id =#{id}")
SysRole selectById2(Long id);
这里的@Result注解增加了一个id属性,可以通过id属性引用同一个@Result配置
下面这个例子通过引用新建一个selectAll方法,引用了selectById2的属性,代码如下
@ResultMap ("roleResultMap")
@Select ("select * from sys_role")
List <SysRole > selectAll();
接着,在测试类中测试配置,代码如下:
@Test
public void testSelectById ()
{
SqlSession sqlSession =getSqlSession();
try {
//获取RoleMapper接口
RoleMapper roleMapper =sqlSession.getMapper (RoleMapper.class);
SysRole role =roleMapper.selectById(1l);
//role不为空
Assert.assertNotNull(role);
//将roleName设置为管理员
Assert.assertEquals(“管理员”,role.getRoleName());
}finally (
sqlSession.close();
}
}
*上述方法用到了取别名的方法,但下面的代码没有取别名,用到的是@Result的映射*
@Test
public void testSelectById2(){
SqlSession sqlSession = getSqlSession();
try {
RoleMapper roleMapper = sqlSession.getMapper (roleMapper.class);
//调用selectById2方法,查询id=1的角色
SysRole role = roleMapper.selectById2(1l);
//role不为空
Assert.assertNotNull(role);
//roleName=管理员
Assert.assertEquals("管理员",role.getRoleName());
}finally {
sqlSession.close();
}
}
@Insert注解
- 不需要返回主键
与xml中的SQL完全一样,代码如下:
@Insert ({ "insert into sys_role (id ,role_name, enabled ,create_by ,create_time )",
"values {#{id} ,#{roleName},#{enabled} ,#{createBy} ,","#{createTime,idbcType =TIMESTAMP})"{)
int insert (SysRole sysRole);
- 返回自增主键
@Insert ({ "insert into sys_role (id ,role_name, enabled ,create_by ,create_time )",
"values {#{id} ,#{roleName},#{enabled} ,#{createBy} ,","#{createTime,idbcType =TIMESTAMP})"{)
@Options (useGeneratedKeys =true ,keyProperty ="id")
int insert2 (SysRole sysRole);
- 返回非自增主键
???
@Update注解和@Delete注解
RoleMapper.class
@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);
上述两个方法的测试类与前面xml中的update和delete测试类写法相同
Provider注解
MyBatis提供@SelectProvider @InsertProvider @UpdateProvider @DeleteProvider 4种注解方式,来实现查询、插入、更新、删除操作
首先,创建PrivilegeMapper接口,添加selectById方法,代码如下:
PrivilegeMapper.class
@SelectProvider(type =PrivilegeProvider.class ,method ="selectById")
SysPrivilege selectById(Long id);
PrivilegeProvider.class
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();**
}
}
以下是测试类代码:
@Test
public void testSelectById() {
SqlSession sqlSession =getSqlSession();
try {
//获取PrivilegeMapper接口
PrivilegeMapper privilegeMapper = sqlSession.getMapper(PrivilegeMapper.class);
//调用selectById方法查询id=1的权限
SysPrivilege privilege =privilegeMapper.selectById(1l);
//privilege不为空
Assert.assertNotNull (privilege);
//privilegeName=用户管理
Assert.assertEquals("用户管理",privilege.getPrivilegeName());
}finally{
sqlSession.close();
}
}