SpringBoot整合MyBatis完全使用注解方式定義Mapper
環(huán)境: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
以上配置請查看官方文檔說明:
分頁配置:
mybatis配置:
啟動類添加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類的主要功能就是用來動態(tài)注冊Bean的。很多的第三方庫都是通過實現(xiàn)該接口來動態(tài)注冊Bean,比如EnableFeignClients用來掃描指定包下所有類上帶有@FeignClient注解的類。
ImportBeanDefinitionRegistrar需要結(jié)合ClassPathBeanDefinitionScanner使用ClassPathBeanDefinitionScanner用來掃描那些類需要被動態(tài)注冊為Bean。比如Mybatis中使用AutoConfiguredMapperScannerRegistrar來動態(tài)注冊具有@Mapper注解的類。
Mapper接口定義
- public interface UsersMapper {
- /**
- * <p>查詢所有數(shù)據(jù)</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>根據(jù)主鍵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>保存數(shù)據(jù)</p>
- * <p>時間:2021年4月21日-上午9:21:14</p>
- * @author xg
- * @param users
- * @return int 影響行數(shù)
- */
- @Insert("insert into t_users values(#{id}, #{password}, #{username})")
- int saveUsers(Users users) ;
- /**
- * <p>更新數(shù)據(jù)</p>
- * <p>時間:2021年4月21日-上午9:22:19</p>
- * @author xg
- * @param users
- * @return int 影響行數(shù)
- */
- @Update("UPDATE t_users SET username = #{username}, password = #{password} WHERE id = #{id}")
- int updateUsers(Users users) ;
- /**
- * <p>根據(jù)主鍵ID刪除</p>
- * <p>時間:2021年4月21日-上午9:23:36</p>
- * @author xg
- * @param id 主鍵ID
- * @return int 影響行數(shù)
- */
- @Delete("DELETE FROM t_users where id = #{id}")
- int deleteById(String id) ;
- /**
- * <p>通過SelectProvider實現(xiàn)動態(tài)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實現(xiàn)動態(tài)SQL更新操作</p>
- * <p>時間:2021年5月21日-上午9:36:48</p>
- * @author xg
- * @param users
- * @return int 影響行數(shù)
- */
- @UpdateProvider(type = UsersProvider.class, method = "updateByProvider")
- int updateByProvider(@Param("users") Users users) ;
- }
說明:
@Results注解添加了id屬性后,在其他的方法中可以通過@ResultMap("users")來引用。
@*Provider用來動態(tài)的定義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)) ;
- }
- }
完畢!!!