mybatis基础学习(三)

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为方法名,进行匹配。

转载于:https://juejin.im/post/5a0cf905f265da430702d18c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值