环境: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.
完毕!!!