环境: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>

应用配置

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

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

分页配置:

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

 

mybatis配置:

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

 

启动类添加Mapper扫描

@SpringBootApplication
@MapperScan({"com.pack.mapper"})
public class SpringBootMyBatisApplication {

  public static void main(String[] args) {
    SpringApplication.run(SpringBootMyBatisApplication.class, args);
  }

}

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

核心处理类:
MapperScannerRegistrar.java

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {
}  


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) ;
}

说明:

@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() ;
  }
	
}

单元测试

@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)) ;
  }
	
}

完毕!!!

给个关注+转发谢谢

Springboot整合MyBatis复杂查询应用

springboot mybatis jpa 实现读写分离

Springboot整合MyBatis参数传值方式

mybatis sharding-jdbc Java8日期

SpringBoot整合MyBatis自定义类型转换实现数据加解密

Springboot整合RabbitMQ死信队列详解

SpringBoot RabbitMQ消息可靠发送与接收

alibaba sentinel 流控使用

Alibaba Sentinel授权规则

Alibaba Sentinel动态规则(Nacos数据源)

Springboot整合RocketMQ实现消息过滤功能

SpringBoot整合RocketMQ事务/广播/顺序消息

SpringBoot+Atomikos多数据源分布式事务

Java中能用set方法就不要用BeanUtils的copy

关注公众:Springboot实战案例锦集

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐