0.学习准备
学习资料:
书本:《MyBatis从入门到精通》
视频:某培训班视频
资料:MyBatis官方文档本章重点
- 注解的基本用法
1.注解方式简介
MyBatis注解的方式就是直接将SQL语句写在接口上。
优点是对于需求比较简单的系统,效率较高。
缺点是每次改变需求都需要重新编译代码。
一般情况下不会使用注解方式。
2.@select注解
1)使用方法:
- 别名方式的@select注解:
在Mybatis.simple.mapper.RoleMapper接口下创建selectById()方法:
无需配置Xml,样就能直接进行测试了。//@select注解,根据id查询Role角色信息 @Select({"select id,role_name roleName,enabled,create_by createBy,create_time createTime" + "from role where id=#{id}"}) Role selectById(long id);
- 使用mapUnderscoreToCameCase配置:
就是在核心配置文件中配置,和<select>
标签的配置一样。 - 使用resultMap的方式进行配置:
Mybatis3.3.0版本以前,注解定义的@Result不能共用,使用很不方便。//resultMap方式进行配置 @Results({ @Result(property="id",column="id",id=true), @Result(property="roleName",column="role_name"), @Result(property="createTime",column="create_time"), @Result(property="enabled",column="enabled"), @Result(property="createBy",column="create_by"), }) @Select("select id,role_name,enabled,create_by,create_time" + "from role where id=#{id}") Role selectById2(long id);
Mybatis3.3.1版本开始添加了一个id注解,可以通过同一个id属性引用同一个@Result的配置。
如:
其他的ResultMap只要这样引用就可以了:@Results(id="roleResultMap",value={aaaaaaaaaaa}) @select(....)
@Result("roleResultMap") @select(....)
- 添加测试方法:
selectById测试:
测试结果:@Test public void testSelectById(){ //获取sqlSession SqlSession sqlSession =getSqlSession(); try{ //获取RoleMapper接口 RoleMapper roleMapper =sqlSession.getMapper(RoleMapper.class); //调用selectById方法 Role role=roleMapper.selectById(1L); //断言测试role不为空 Assert.assertNotNull(role); //角色名字是否为管理员 Assert.assertEquals("管理员", role.getRoleName()); }finally{ sqlSession.close(); } }
selectById2测试与测试selectById的方法相同。测试略。
2.@insert注解
- 不需要返回主键值:
和xml中的sql完全一样:
测试类://添加Role对象 @Insert({"insert into role values(#{id},#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"}) int addRole(Role role);
测试结果:@Test public void testAddRole(){ //获取sqlSession SqlSession sqlSession =getSqlSession(); try{ //获取RoleMapper接口 RoleMapper roleMapper =sqlSession.getMapper(RoleMapper.class); //创建角色对象 Role role=new Role(); role.setRoleName("游客"); role.setEnabled(1); role.setCreateBy(1); role.setCreateTime(new Date()); //调用addRole方法 int result =roleMapper.addRole(role); //断言是否添加成功 Assert.assertEquals(1,result); }finally{ sqlSession.rollback(); sqlSession.close(); } }
为了不影响数据库而选择回滚。 - 返回自增主键的值(@option标签):
添加以下接口方法:
测试方法同上,测试结果为:@Insert({"insert into role values(null,#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"}) @Options(useGeneratedKeys=true,keyProperty="id") int addRole2(Role role);
- 返回非自增的主键:
添加接口方法indsert3():
测试方法与上面的相同,就不测试了。//添加Role对象返回非自增主键 @Insert({"insert into role values(null,#{roleName},#{enabled},#{createBy},#{createTime,jdbcType=TIMESTAMP})"}) @SelectKey(statement="SELECT LAST_INSERT_ID()",keyProperty="id",resultType=Long.class,before=false) int addRole3(Role role);
需要注意的是最后的before=false
这句话,效果等同于order=after
。
不同的数据库需要配置的order是不一样的。
3.@Update注解
- 添加接口方法:
//根据Id更新 @Update({"update role set role_name=#{roleName},enabled=#{enabled},create_by=#{createBy},create_time=#{createTime} where id=#{id}"}) int updateById();
- 添加测试类方法:
测试结果:@Test public void testUpdateById(){ //获取sqlSession SqlSession sqlSession =getSqlSession(); try{ //获取RoleMapper接口 RoleMapper roleMapper =sqlSession.getMapper(RoleMapper.class); //创建角色对象 Role role=new Role(); role.setId(5l); role.setRoleName("人力管理"); role.setEnabled(1); role.setCreateBy(1); role.setCreateTime(new Date()); //调用addRole方法 int result = roleMapper.updateById(role); //断言是否添加成功 Assert.assertEquals(1,result); //查询添加后的结果 role = roleMapper.selectById(role.getId()); //断言测试是否添加成功 Assert.assertEquals("人力管理",role.getRoleName()); }finally{ sqlSession.rollback(); sqlSession.close(); } }
4.@Delete注解
- 在接口中添加删方法:
//根据Id删除 @Delete({"delete from role where id = #{id}"}) int deleteById(long id);
- 添加测试方法:
@Test public void testDeleteById(){ //获取sqlSession SqlSession sqlSession =getSqlSession(); try{ //获取RoleMapper接口 RoleMapper roleMapper =sqlSession.getMapper(RoleMapper.class); //调用删除方法 int result = roleMapper.deleteById(5L); //检测是否删除成功 Assert.assertEquals(1,result); }finally{ sqlSession.rollback(); sqlSession.close(); } }
- 测试结果:
5.Provider注解:
- 除了使用简单的注解SQL外,MyBatis还提供了四种Provider注解:
@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider
同样可以实现增删改查的操作。 - 通过@SelectProvider来了解它们的基本用法。
首先在src/main/java下创建一个Mabatis.simple.provider包,并在该包内创建RoleProvider()类:
使用package Mybatis.simple.provider; import org.apache.ibatis.jdbc.SQL; public class RoleProvider { public String selectById(final long id){ return new SQL().SELECT("id,role_name,enabled,create_by,create_tim").FROM("role").WHERE("id=#{id}").toString(); } }
new SQL().SELECT().FROM().WHERE()...
可以组装SQL语句。
RoleProvider()类的方法也可以这样写:public String selectById(final long id){ return "SELECT id,role_name,enabled,create_by,create_tim FROM role WHERE id=#{id}"; }
- 在RoleMapper中添加接口方法:
@Provider注解有两个必的属性://根据Id查询 @SelectProvider(type=RoleProvider.class,method="selectById") Role selectByProviderId(long id);
type属性指定的包含method属性方法的类,该类必须要有一个空的构造方法,
method属性指定的是方法名,且返回值必须要是String - 测试代码:
@Test public void testSelectByProviderId(){ //获取sqlSession SqlSession sqlSession =getSqlSession(); try{ //获取RoleMapper接口 RoleMapper roleMapper =sqlSession.getMapper(RoleMapper.class); //调用selectById方法 Role role=roleMapper.selectByProviderId(1L); //断言测试role不为空 Assert.assertNotNull(role); //角色名字是否为管理员 Assert.assertEquals("管理员", role.getRoleName()); }finally{ sqlSession.close(); } }
- 测试结果:
- 注解模式:
注解模式不是主流,高级的用法以后再学习吧。
最后更新: 2018年05月04日 13:44
原始链接: https://zjxkenshine.github.io/2018/03/24/MyBatis学习笔记(三):注解基本用法/