mybatis 注解方式
mybatis支持注解的方式来实现减少配置的目的,对于简单的CRUD,可以完全依赖于@Select @Insert @Upadte @Delete
四个注解来实现。优点是对于需求较为简单的系统,开发效率高,但是每当sql语句有变化的时候,都需要修改代码进行重新编译,所以实际开发根据具体情况来使用。
###1、@Select注解
在RoleMapper的接口中添加查询方法和对应注解:
//@Select("select * from sys_role where id=#{id}")
@Select({"select id,role_name roleName,enabled,create_by createBy,create_time createTime",
" from sys_role",
"where id=#{id}"})
public SysRole selectById(Long id);复制代码
对于@Select @Insert @Upadte @Delete
四个注解的参数,可以是字符串数组类型,也可以是字符串类型。
对于字段和Java属性字段的映射问题,在注解方式下也是需要考虑的,有三种方式解决:
#####a、起别名
上面的示例中就是起别名的方式
#####b、mapUnderscoreToCamelCase配置
在配置文件中添加对应配置,在前面的内容里已经讲过该配置了,添加了该配置之后,就可以不使用别名或者直接使用*去查询了。
#####c、resultMap方式
在注解形式下也可以使用resultMap,例:
@Results({
@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);复制代码
在mybatis3.31之后的版本@Results
支持增加id属性,避免每次都重复编写results:
@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);
@ResultMap("roleResultMap")
@Select("select * from sys_role")
List<SysRole> selectAllRoles();复制代码
测试如下:
@Test
public void selectAll(){
SqlSession sqlSession = getSqlSessionFactory();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
List<SysRole> roles = roleMapper.selectAllRoles();
for(SysRole role:roles){
System.out.println(role);
}
}复制代码
###2、@insert注解
@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);
和Xml格式下的sql语句没有什么区别,同样,注解形式下也可获取到insert操作后的主键值,和xml下的实现其实是一致的,只是把配置的形式改为注解的形式:
@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>
标签里增加useGeneratedKeys属性
#
@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);
等同于在<insert>
里新增<selectKey>
标签,before字段等同于标签里的order属性。
###3、@update和@delete
@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);复制代码
###4、@SelectProvider 、@InsertProvider 、@Update Provider 和@DeleteProvider
这里provider的作用是额外调用一个类的方法来获取拼接完的sql语句,避免在接口中拼接大量的sql语句。举例说明如下:
新建一个SqlProvider类:
public class SqlProvider {
public String selectRoleById(Long id){
SQL sql = new SQL(){{
SELECT("id,role_name,enabled,create_by,create_time");
FROM("sys_role");
WHERE("id=#{id}");
}};
return sql.toString();
}
}复制代码
在RoleMapper接口中新增方法:
@ResultMap("roleResultMap")
@SelectProvider(type = SqlProvider.class,method = "selectRoleById")
int selectRoleById(Long id);复制代码
测试:
@Test
public void selectRoleByIdTest(){
SqlSession sqlSession = getSqlSessionFactory();
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
SysRole role = roleMapper.selectRoleById(3L);
System.out.println(role);
sqlSession.close();
}复制代码
这里新建了一个SqlProvider类用来提供sql语句和进行sql注入工作,在接口方法上使用@SelectProvider
注解,指定type
为sql提供类,指定method
为方法名,进行匹配。