SpringBoot整合MyBatis完全使用注解方式定义Mapper

开发 前端
ImportBeanDefinitionRegistrar类的主要功能就是用来动态注册Bean的。很多的第三方库都是通过实现该接口来动态注册Bean,比如EnableFeignClients用来扫描指定包下所有类上带有@FeignClient注解的类。

[[404045]]

环境:springboot2.3.11 + MyBatis3.5.6

依赖

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-web</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.   <groupId>org.mybatis.spring.boot</groupId> 
  7.   <artifactId>mybatis-spring-boot-starter</artifactId> 
  8.   <version>2.1.4</version> 
  9. </dependency> 
  10. <dependency> 
  11.   <groupId>com.github.pagehelper</groupId> 
  12.   <artifactId>pagehelper-spring-boot-starter</artifactId> 
  13.   <version>1.3.0</version> 
  14. </dependency> 

 应用配置

  1. pagehelper: 
  2.   helperDialect: mysql 
  3.   reasonable: true 
  4.   pageSizeZero: true 
  5.   offsetAsPageNum: true 
  6.   rowBoundsWithCount: true 
  7. --- 
  8. mybatis: 
  9.   type-aliases-package: com.pack.domain 
  10.   configuration: 
  11.     lazy-loading-enabled: false 
  12.     aggressive-lazy-loading: false    
  13.     logImpl: org.apache.ibatis.logging.stdout.StdOutImpl 
  14.     mapUnderscoreToCamelCase: true 

 以上配置请查看官方文档说明:

分页配置:

mybatis配置:

启动类添加Mapper扫描

  1. @SpringBootApplication 
  2. @MapperScan({"com.pack.mapper"}) 
  3. public class SpringBootMyBatisApplication { 
  4.  
  5.   public static void main(String[] args) { 
  6.     SpringApplication.run(SpringBootMyBatisApplication.class, args); 
  7.   } 
  8.  

 添加@MapperScan注解后,就不需要在每个Mapper上添加@Mapper注解了。

核心处理类:

MapperScannerRegistrar.java

  1. public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware { 
  2. }   

 ImportBeanDefinitionRegistrar类的主要功能就是用来动态注册Bean的。很多的第三方库都是通过实现该接口来动态注册Bean,比如EnableFeignClients用来扫描指定包下所有类上带有@FeignClient注解的类。

ImportBeanDefinitionRegistrar需要结合ClassPathBeanDefinitionScanner使用ClassPathBeanDefinitionScanner用来扫描那些类需要被动态注册为Bean。比如Mybatis中使用AutoConfiguredMapperScannerRegistrar来动态注册具有@Mapper注解的类。

Mapper接口定义

  1. public interface UsersMapper { 
  2.      
  3.   /** 
  4.    *  <p>查询所有数据</p> 
  5.    *  <p>时间:2021年4月21日-上午9:18:54</p> 
  6.    * @author xg 
  7.    * @return List<Users> 
  8.    */ 
  9.   @Select("SELECT * FROM t_users"
  10.   @Results(id = "users", value = {@Result(property = "name"column = "name", javaType = String.class),  
  11.   @Result(property = "password"column = "password")}) 
  12.   List<Users> findAll() ; 
  13.      
  14.   /** 
  15.    *  <p>根据主键ID查询</p> 
  16.    *  <p>时间:2021年4月21日-上午9:19:34</p> 
  17.    * @author xg 
  18.    * @param id 主键ID 
  19.    * @return Users 
  20.    */ 
  21.   @Select("SELECT * FROM t_users WHERE id = #{id}"
  22.   @ResultMap("users"
  23.   Users findById(String id) ; 
  24.      
  25.   /** 
  26.    *  <p>保存数据</p> 
  27.    *  <p>时间:2021年4月21日-上午9:21:14</p> 
  28.    * @author xg 
  29.    * @param users 
  30.    * @return int 影响行数 
  31.    */ 
  32.   @Insert("insert into t_users values(#{id}, #{password}, #{username})"
  33.   int saveUsers(Users users) ; 
  34.      
  35.   /** 
  36.    *  <p>更新数据</p> 
  37.    *  <p>时间:2021年4月21日-上午9:22:19</p> 
  38.    * @author xg 
  39.    * @param users 
  40.    * @return int 影响行数 
  41.    */ 
  42.   @Update("UPDATE t_users SET username = #{username}, password = #{password} WHERE id = #{id}"
  43.   int updateUsers(Users users) ; 
  44.      
  45.   /** 
  46.    *  <p>根据主键ID删除</p> 
  47.    *  <p>时间:2021年4月21日-上午9:23:36</p> 
  48.    * @author xg 
  49.    * @param id 主键ID 
  50.    * @return int 影响行数 
  51.    */ 
  52.   @Delete("DELETE FROM t_users where id = #{id}"
  53.   int deleteById(String id) ; 
  54.      
  55.   /** 
  56.    *  <p>通过SelectProvider实现动态SQL语句查询</p> 
  57.    *  <p>时间:2021年5月21日-上午9:30:00</p> 
  58.    * @author xg 
  59.    * @param users 
  60.    * @return List<Users> 
  61.    */ 
  62.   @SelectProvider(type = UsersProvider.class, method = "selectLikeUsers"
  63.   @ResultMap("users"
  64.   List<Users> selectLikeUsers(Users users) ; 
  65.      
  66.   /** 
  67.    *  <p>通过UpdateProvider实现动态SQL更新操作</p> 
  68.    *  <p>时间:2021年5月21日-上午9:36:48</p> 
  69.    * @author xg 
  70.    * @param users 
  71.    * @return int 影响行数 
  72.   */ 
  73.   @UpdateProvider(type = UsersProvider.class, method = "updateByProvider"
  74.   int updateByProvider(@Param("users") Users users) ; 

 说明:

@Results注解添加了id属性后,在其他的方法中可以通过@ResultMap("users")来引用。

@*Provider用来动态的定义SQL语句。

  1. public class UsersProvider { 
  2.  
  3.   public String selectLikeUsers(Users users) { 
  4.     StringBuilder sql = new StringBuilder("SELECT * FROM t_users t where 1=1 "); 
  5.       if(users.getUsername() != null && users.getUsername().trim().length() > 0) { 
  6.          sql.append(String.format("and t.username like '%s'""%" + users.getUsername() + "%")); 
  7.       } 
  8.     return sql.toString(); 
  9.     } 
  10.      
  11.   public String updateByProvider(@Param("users") Users users) { 
  12.     SQL sql = new SQL() ; 
  13.     sql.UPDATE("t_users"
  14.       .SET("username = #{users.username}""password = #{users.password}"
  15.       .WHERE("id = #{users.id}") ; 
  16.     return sql.toString() ; 
  17.   } 
  18.      

 单元测试

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest 
  3. public class UsersMapperTest { 
  4.      
  5.   @Resource 
  6.   private UsersMapper usersMapper ; 
  7.      
  8.   @Test 
  9.   public void testFindAll() { 
  10.     Page<Users> page = PageHelper.startPage(1, 2) ; 
  11.     usersMapper.findAll() ; 
  12.     System.out.println(page.getResult()) ; 
  13.     System.out.println(page.getTotal() + "\n" + page.getPages()) ; 
  14.   } 
  15.      
  16.   @Test 
  17.   public void testFindById() { 
  18.     System.out.println(usersMapper.findById("1")) ; 
  19.   } 
  20.      
  21.   @Test 
  22.   public void testSaveUsers() { 
  23.     Users users = new Users() ; 
  24.     users.setId("4") ; 
  25.     users.setPassword("123456") ; 
  26.     users.setUsername("zhangsan") ; 
  27.     System.out.println(usersMapper.saveUsers(users)) ; 
  28.   } 
  29.      
  30.   @Test 
  31.   public void testUpdateUser() { 
  32.     Users users = new Users() ; 
  33.     users.setId("3") ; 
  34.     users.setPassword("111111") ; 
  35.     users.setUsername("zhangsan") ; 
  36.     System.out.println(usersMapper.updateUsers(users)) ; 
  37.   } 
  38.      
  39.   @Test 
  40.   public void testDeleteById() { 
  41.     System.out.println(usersMapper.deleteById("3")) ; 
  42.   } 
  43.      
  44.   @Test 
  45.   public void testSelectLikeUsers() { 
  46.     Users users = new Users() ; 
  47.     users.setUsername("gu") ; 
  48.     System.out.println(usersMapper.selectLikeUsers(users)) ; 
  49.   } 
  50.      
  51.   @Test 
  52.   public void testUpdateByProvider() { 
  53.     Users users = new Users() ; 
  54.     users.setId("2") ; 
  55.     users.setPassword("111111") ; 
  56.     users.setUsername("guest") ; 
  57.     System.out.println(usersMapper.updateByProvider(users)) ; 
  58.   } 
  59.      

 完毕!!!

 

责任编辑:姜华 来源: 今日头条
相关推荐

2021-05-19 09:53:16

SpringbootMyBatisMySQL

2023-10-09 07:37:01

2017-05-12 15:47:15

Spring BootMybatis Ann Web

2023-06-07 08:08:37

MybatisSpringBoot

2020-05-27 08:05:33

MybatisMapper接口

2023-10-11 07:57:23

springboot微服务

2021-11-10 11:37:48

Spring整合 Mybatis

2024-10-18 08:53:49

SpringMybatis微服务

2020-11-09 10:16:41

Mybatis

2023-09-07 17:06:21

@Autowired报错原因分析

2024-10-09 10:46:41

springboot缓存redis

2021-02-20 11:40:35

SpringBoot占位符开发技术

2024-07-02 11:42:53

SpringRedis自定义

2021-09-26 05:02:00

缓存Ehcache用法

2024-09-02 09:26:28

2024-11-06 09:26:48

SpringprofileENV

2023-07-03 15:55:05

语法jpa状态

2021-07-05 08:09:54

@AutowiredSpringMapper

2023-11-10 08:17:01

分布式搜索引擎

2023-08-09 08:01:00

WebSockett服务器web
点赞
收藏

51CTO技术栈公众号