MyBatis中注解方式的基本用法

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();
     }
  }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值