目录)
一 说明
我觉得MyBatis最佳实践方式仍是配合xml。当然注解也有使用场景,我们简单了解下。
二 @Select注解
注解中的值可以传字符串或字符串数组
我更喜欢数组方式,因为换行。代码更容易阅读
@Select({"select id,role_name roleName, enabled, create_by createBy, create_time createTime",
"from sys_role",
"where id = #{id}"})
SysRole selectById(Long id);
2.1 结果映射问题
在xml中我们可以使用resultMap或者默认的自动映射(查询的字段改成别名
)
使用mapUnderscoreToCamelCase 配置
在全局配置文件中开启,笔记2中提到过
使用ResultMap方式
直接写在方法上,注意:@ResultS在3.3.1之前不能复用,即没有id属性
@Results(id = "roleResultMap", value = {
@Result(property = "id", column = "id", id = true),//注意id=true,表示xml中的id标签
@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")//引用了上面的@Results的内容
@Select("select * from sys_role")
List<SysRole> selectAll();
三 @Insert注解
3.1 不需要返回主键时
/**
* 最普通的插入,这里id时数据自增的。但插入后,后端获取不到具体的值
* @param sysRole
* @return
*/
@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);
3.2 需要返回自增主键时
使用jdbc
/**
* 使用useGeneratedKeys
* @param sysRole
* @return
*/
@Insert({"insert into sys_role(role_name, enabled, create_by, create_time)",
"values(#{roleName}, #{enabled}, #{createBy}, #{createTime, jdbcType=TIMESTAMP})"})
@Options(useGeneratedKeys = true, keyProperty = "id")//keyProperty声明把id设置到哪个bean的字段,具体查看文章2
int insert2(SysRole sysRole);
通过selectKey查询
/**
* 这里是mysql,所以before=false
* @param sysRole
* @return
*/
@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);
四 @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);
五 Provider 注解
MyBatis 还提供了4 种Provider 注解
,我的理解就是写接口的具体实现。简单的示例
mapper接口的方法
/**
* type指定实现类,method指定方法名
* @param id
* @return
*/
@SelectProvider(type = RoleMapperProvider.class,method = "selectById")
@ResultMap("roleResultMap")//引用了上面的@Results的内容
SysRole selectById3(Long id);
public class RoleMapperProvider {
public String selectById(final Long id){
return new SQL(){
{
SELECT("id,role_name, enabled, create_by, create_time");
FROM("sys_role");
WHERE("id = #{id}");
}
}.toString();
}
}
这个没什么特别的,和@select、@insert的用法基本一致