03-1-注解开发

第五章 mybatis注解开发【掌握】

1、概述

  1. 上述我们已经学习mybatis的**SQL映射文件**可以使用**xml的方式配置**,但是我们发现不同的用户模块接口都对应一个映射文件,并且在映射文件中书写sql语句也比较麻烦。所以Mybatis为用户提供了快速的开发方式,因为有时候大量的XML配置文件的编写时非常繁琐的,因此Mybatis也提供了更加简便的基于注解(Annnotation)的配置方式。<br /> **注解配置的方式在很多情况下能够取代mybatis的映射文件,提高开发效率。**

2、注解实现CRUD

注:创建新工程演示环境:

2.0、CRUD相关注解

【注解】

  1. @Insert:保存
  2. Valuesql语句(和xml的配置方式一模一样)
  3. @Update:更新
  4. Valuesql语句
  5. @Delete: 删除
  6. Valuesql语句
  7. @Select: 查询
  8. Valuesql语句
  9. @Options:可选配置(获取主键)
  10. userGeneratedKeys:开关,值为true表示可以获取主键 相当于select last_insert_id()
  11. keyProperty :对象属性
  12. keyColumn : 列名

【使用方式】
【第一步】将mybatis全局配置文件mybatis-config.xml中的mapper路径改为包扫描或者class路径;
说明:因为没有了映射文件,所以我们这里采用加载接口方式,需要告知mybatis哪个接口的方法上的注解需要被执行。
【第二步】编写接口和注解;
【第三步】测试


2.1、新增_@_Insert

步骤:

  1. 第一步:UserMapper接口中新增用户方法上面编写注解;
  2. 第二步:测试

实现:完成用户添加功能
1)配置核心配置文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!--是mybatis核心配置文件袋额跟标签,所有的配置都放在这个根标签下-->
  6. <configuration>
  7. <!--文件内部定义全局参数-->
  8. <!--<properties>
  9. <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  10. </properties>-->
  11. <!--通过properties引入外部配置文件,使用resource属性 推荐-->
  12. <properties resource="jdbc.properties"/>
  13. <!--开启驼峰映射-->
  14. <settings>
  15. <!--作用:表:user_name 类:userName/username 自动映射-->
  16. <setting name="mapUnderscoreToCamelCase" value="true"/>
  17. </settings>
  18. <!--方式1:取别名,逐个取别名-->
  19. <!--<typeAliases>
  20. <typeAlias type="com.heima.pojo.User" alias="user"/>
  21. </typeAliases>-->
  22. <!--方式2:通过扫包取指定包下的pojo类取别名 (推荐)-->
  23. <typeAliases>
  24. <!--package name指定要取别名的包名-->
  25. <package name="com.day08.pojo"/>
  26. </typeAliases>
  27. <!--environments内部可以配置多个数据源,default指定默认数据源-->
  28. <environments default="dev">
  29. <!--environment配置具体数据源 id表示数据源的唯一表示-->
  30. <environment id="dev">
  31. <!--transactionManager事务管理器,type="jdbc":表示事务交给jdbc取管理-->
  32. <transactionManager type="JDBC"/>
  33. <!--dataSource表示数据源 type="POOLED"表示使用mybatis自带的连接池-->
  34. <dataSource type="POOLED">
  35. <property name="driver" value="${jdbc.driverClass}"/>
  36. <property name="url" value="${jdbc.url}"/>
  37. <property name="username" value="${jdbc.user}"/>
  38. <property name="password" value="${jdbc.password}"/>
  39. </dataSource>
  40. </environment>
  41. <environment id="test">
  42. <transactionManager type="JDBC"/>
  43. <dataSource type="POOLED">
  44. <property name="driver" value="${jdbc.driverClass}"/>
  45. <property name="url" value="${jdbc.url}"/>
  46. <property name="username" value="${jdbc.user}"/>
  47. <property name="password" value="${jdbc.password}"/>
  48. </dataSource>
  49. </environment>
  50. <environment id="online">
  51. <transactionManager type="JDBC"/>
  52. <dataSource type="POOLED">
  53. <property name="driver" value="${jdbc.driverClass}"/>
  54. <property name="url" value="jdbc:mysql:///day06_3"/>
  55. <property name="username" value="${jdbc.user}"/>
  56. <property name="password" value="${jdbc.password}"/>
  57. </dataSource>
  58. </environment>
  59. </environments>
  60. <mappers>
  61. <package name="com.day08.mapper"/>
  62. </mappers>
  63. </configuration>

2)定义接口

  1. public interface UserMapper {
  2. @Insert("insert into tb_user values(null,#{userName},#{password},#{name}," +
  3. "#{age},#{sex})")
  4. Integer addUser(User user);
  5. }

3)测试

  1. @Test
  2. public void test1(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = new User();
  5. user.setAge(18);
  6. user.setName("liuyan");
  7. user.setSex(0);
  8. user.setUserName("柳岩");
  9. user.setPassword("666");
  10. mapper.addUser(user);
  11. MybatisUtil.commit();
  12. MybatisUtil.close();
  13. }

3)效果
03-1-注解开发 - 图1


2.2、删除

目标:使用注解@Delete删除id值为6的数据
步骤:

  1. 第一步:在根据id删除数据的方法上面编写注解@Delete;
  2. 第二步:测试

实现:删除id为1的用户
1)定义接口

  1. @Delete("delete from tb_user where id=#{id}")
  2. Integer deleteByUserId(@Param("id") Integer id);

2)测试

  1. @Test
  2. public void test2(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. Integer count = mapper.deleteByUserId(6);
  5. System.out.println(count);
  6. MybatisUtil.commit();
  7. MybatisUtil.close();
  8. }

3)结果
03-1-注解开发 - 图2


2.3、修改

目标:修改id为1的用户的数据
步骤:

  1. 第一步:在根据id修改用户数据方法上面添加注解@Update,然后在其value属性值中编写具体的SQL
  2. 第二步:测试

实现:
1)接口

  1. @Update("update tb_user set user_name=#{userName},password=#{password}," +
  2. "name=#{name},age=#{age},sex=#{sex} where id=#{id}")
  3. Integer updateUser(User user);

2)测试

  1. @Test
  2. public void test3(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = new User();
  5. user.setPassword("888");
  6. user.setUserName("nezha");
  7. user.setSex(1);
  8. user.setName("哪吒");
  9. user.setAge(8);
  10. user.setId(11L);
  11. Integer count = mapper.updateUser(user);
  12. MybatisUtil.commit();
  13. MybatisUtil.close();
  14. }

3)效果
03-1-注解开发 - 图3


2.4、查询_@_Select

目标:使用注解查询所有的用户数据
步骤:

  1. 第一步:在接口中查询所有的用户数据的方法上面添加注解:@Select,然后设置其value属性值为具体的SQL查询语句;
  2. 第二步:测试

实现:
1)接口

  1. @Select("select * from tb_user")
  2. List<User> findAll();
  3. @Select("select * from tb_user where id=#{id}")
  4. User findById(Long id);

2)测试

  1. @Test
  2. public void test4(){
  3. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  4. List<User> users = userMapper.findAll();
  5. System.out.println(users);
  6. MybatisUtil.close();
  7. }
  8. @Test
  9. public void test5(){
  10. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  11. User user = userMapper.findById(1L);
  12. System.out.println(user);
  13. MybatisUtil.close();
  14. }

3)效果


3、返回新增数据的id(自增主键回填)[了解]

问题:上面注解实现CRUD的测试中,数据新增成功,但是id值没有正常返回.
目标:使用注解完成数据新增,新增成功后返回数据的主键id值
步骤:

  1. 1、在新增数据注解 @Insert下面,添加@Options
  2. 2、在@Options注解中,设置useGeneratedKeys值为truekeyPropertyidkeyColumn id

实现:
1)接口

  1. @Insert("insert into tb_user values(null,#{userName},#{password},#{name}," +
  2. "#{age},#{sex})")
  3. @Options(useGeneratedKeys = true,keyColumn = "id" ,keyProperty = "id")
  4. Integer addUserAndGetFk(User user);

2)测试

  1. @Test
  2. public void test6(){
  3. UserMapper mapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = new User();
  5. user.setAge(18);
  6. user.setName("liuyan2");
  7. user.setSex(0);
  8. user.setUserName("柳岩2");
  9. user.setPassword("666");
  10. mapper.addUserAndGetFk(user);
  11. System.out.println(user.getId());
  12. MybatisUtil.commit();
  13. MybatisUtil.close();
  14. }

3)效果
03-1-注解开发 - 图4


4、注解实现别名映射

根据之前的学习,如果数据表的列名和pojo实体类的属性名不一致,会导致数据表的数据无法封装到实体类属性值中,对此我们又如下解决方案:
使用注解:@Results 实现映射(等价于标签):
@Results注解相当于之前映射文件中的ResultMap,该注解如下:

  1. public @interface Results {
  2. Result[] value() default {};
  3. }

我们发现value属于Result数组类型,而Result属于一个注解,注解的属性如下:

  1. public @interface Result {
  2. //对应数据表的列
  3. String column() default "";
  4. //对应pojo类的属性
  5. String property() default "";
  6. //javaType:返回的对象类型
  7. Class<?> javaType() default void.class;
  8. //one: 一对一配置 相当于xml中association标签
  9. One one() default @One;
  10. //many: 一对多配置 相当于xml中collection标签
  11. Many many() default @Many;
  12. }

目标:使用注解的方式给取别名后的字段,映射到实体类中,并查询所有用户信息
注意:为方便演示效果,可将之前核心配置文件中的开启驼峰自动映射设置为false。
实现:
前提:关闭核心配置文件中的驼峰映射;

  1. <settings>
  2. <!--开启驼峰映射 table :user_name 映射成: pojo userName-->
  3. <setting name="mapUnderscoreToCamelCase" value="false"/>
  4. </settings>

1)接口

  1. @Select("select * from tb_user where id=#{id}")
  2. @Results(id="userMap",
  3. value = {
  4. @Result(column = "id",property = "id",id=true),
  5. @Result(column = "user_name",property = "userName")
  6. })
  7. User findById(Long id);
  8. @Select("select * from tb_user")
  9. @ResultMap("userMap")//引用findById定义的映射规则
  10. List<User> findAll();

2)测试

  1. @Test
  2. public void test5(){
  3. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  4. User user = userMapper.findById(1L);
  5. System.out.println(user);
  6. MybatisUtil.close();
  7. }
  8. @Test
  9. public void test4(){
  10. UserMapper userMapper = MybatisUtil.getMapper(UserMapper.class);
  11. List<User> users = userMapper.findAll();
  12. System.out.println(users);
  13. MybatisUtil.close();
  14. }

3)效果
03-1-注解开发 - 图5