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

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

[[404045]]

环境:springboot2.3.11 + MyBatis3.5.6

依赖

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

 应用配置

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

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

分页配置:

mybatis配置:

启动类添加Mapper扫描

@SpringBootApplication 
@MapperScan({"com.pack.mapper"}) 
public class SpringBootMyBatisApplication { 
 
  public static void main(String[] args) { 
    SpringApplication.run(SpringBootMyBatisApplication.class, args); 
  } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

核心处理类:

MapperScannerRegistrar.java

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

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

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

Mapper接口定义

public interface UsersMapper { 
     
  /** 
   *  <p>查询所有数据</p> 
   *  <p>时间:2021年4月21日-上午9:18:54</p> 
   * @author xg 
   * @return List<Users> 
   */ 
  @Select("SELECT * FROM t_users"
  @Results(id = "users", value = {@Result(property = "name"column = "name", javaType = String.class),  
  @Result(property = "password"column = "password")}) 
  List<Users> findAll() ; 
     
  /** 
   *  <p>根据主键ID查询</p> 
   *  <p>时间:2021年4月21日-上午9:19:34</p> 
   * @author xg 
   * @param id 主键ID 
   * @return Users 
   */ 
  @Select("SELECT * FROM t_users WHERE id = #{id}"
  @ResultMap("users"
  Users findById(String id) ; 
     
  /** 
   *  <p>保存数据</p> 
   *  <p>时间:2021年4月21日-上午9:21:14</p> 
   * @author xg 
   * @param users 
   * @return int 影响行数 
   */ 
  @Insert("insert into t_users values(#{id}, #{password}, #{username})"
  int saveUsers(Users users) ; 
     
  /** 
   *  <p>更新数据</p> 
   *  <p>时间:2021年4月21日-上午9:22:19</p> 
   * @author xg 
   * @param users 
   * @return int 影响行数 
   */ 
  @Update("UPDATE t_users SET username = #{username}, password = #{password} WHERE id = #{id}"
  int updateUsers(Users users) ; 
     
  /** 
   *  <p>根据主键ID删除</p> 
   *  <p>时间:2021年4月21日-上午9:23:36</p> 
   * @author xg 
   * @param id 主键ID 
   * @return int 影响行数 
   */ 
  @Delete("DELETE FROM t_users where id = #{id}"
  int deleteById(String id) ; 
     
  /** 
   *  <p>通过SelectProvider实现动态SQL语句查询</p> 
   *  <p>时间:2021年5月21日-上午9:30:00</p> 
   * @author xg 
   * @param users 
   * @return List<Users> 
   */ 
  @SelectProvider(type = UsersProvider.class, method = "selectLikeUsers"
  @ResultMap("users"
  List<Users> selectLikeUsers(Users users) ; 
     
  /** 
   *  <p>通过UpdateProvider实现动态SQL更新操作</p> 
   *  <p>时间:2021年5月21日-上午9:36:48</p> 
   * @author xg 
   * @param users 
   * @return int 影响行数 
  */ 
  @UpdateProvider(type = UsersProvider.class, method = "updateByProvider"
  int updateByProvider(@Param("users") Users users) ; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.

 说明:

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

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

public class UsersProvider { 
 
  public String selectLikeUsers(Users users) { 
    StringBuilder sql = new StringBuilder("SELECT * FROM t_users t where 1=1 "); 
      if(users.getUsername() != null && users.getUsername().trim().length() > 0) { 
         sql.append(String.format("and t.username like '%s'""%" + users.getUsername() + "%")); 
      } 
    return sql.toString(); 
    } 
     
  public String updateByProvider(@Param("users") Users users) { 
    SQL sql = new SQL() ; 
    sql.UPDATE("t_users"
      .SET("username = #{users.username}""password = #{users.password}"
      .WHERE("id = #{users.id}") ; 
    return sql.toString() ; 
  } 
     

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

 单元测试

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UsersMapperTest { 
     
  @Resource 
  private UsersMapper usersMapper ; 
     
  @Test 
  public void testFindAll() { 
    Page<Users> page = PageHelper.startPage(1, 2) ; 
    usersMapper.findAll() ; 
    System.out.println(page.getResult()) ; 
    System.out.println(page.getTotal() + "\n" + page.getPages()) ; 
  } 
     
  @Test 
  public void testFindById() { 
    System.out.println(usersMapper.findById("1")) ; 
  } 
     
  @Test 
  public void testSaveUsers() { 
    Users users = new Users() ; 
    users.setId("4") ; 
    users.setPassword("123456") ; 
    users.setUsername("zhangsan") ; 
    System.out.println(usersMapper.saveUsers(users)) ; 
  } 
     
  @Test 
  public void testUpdateUser() { 
    Users users = new Users() ; 
    users.setId("3") ; 
    users.setPassword("111111") ; 
    users.setUsername("zhangsan") ; 
    System.out.println(usersMapper.updateUsers(users)) ; 
  } 
     
  @Test 
  public void testDeleteById() { 
    System.out.println(usersMapper.deleteById("3")) ; 
  } 
     
  @Test 
  public void testSelectLikeUsers() { 
    Users users = new Users() ; 
    users.setUsername("gu") ; 
    System.out.println(usersMapper.selectLikeUsers(users)) ; 
  } 
     
  @Test 
  public void testUpdateByProvider() { 
    Users users = new Users() ; 
    users.setId("2") ; 
    users.setPassword("111111") ; 
    users.setUsername("guest") ; 
    System.out.println(usersMapper.updateByProvider(users)) ; 
  } 
     

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.

 完毕!!!

 

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

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

2020-11-09 10:16:41

Mybatis

2024-10-18 08:53:49

SpringMybatis微服务

2023-09-07 17:06:21

@Autowired报错原因分析

2025-02-26 09:24:54

SpringMySQLMyBatis

2021-02-20 11:40:35

SpringBoot占位符开发技术

2024-07-02 11:42:53

SpringRedis自定义

2024-10-09 10:46:41

springboot缓存redis

2021-09-26 05:02:00

缓存Ehcache用法

2024-09-02 09:26:28

2021-07-05 08:09:54

@AutowiredSpringMapper

2024-11-06 09:26:48

SpringprofileENV

2023-07-03 15:55:05

语法jpa状态

2023-11-10 08:17:01

分布式搜索引擎
点赞
收藏

51CTO技术栈公众号