diff --git a/pom.xml b/pom.xml index 9d6d895..adc6bf1 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ spring-boot-demo-orm-jpa spring-boot-demo-orm-mybatis spring-boot-demo-orm-mybatis-mapper-page + spring-boot-demo-orm-mybatis-plus spring-boot-demo-email spring-boot-demo-upload spring-boot-demo-war diff --git a/spring-boot-demo-orm-mybatis-plus/.gitignore b/spring-boot-demo-orm-mybatis-plus/.gitignore new file mode 100644 index 0000000..82eca33 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/.gitignore @@ -0,0 +1,25 @@ +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ \ No newline at end of file diff --git a/spring-boot-demo-orm-mybatis-plus/README.md b/spring-boot-demo-orm-mybatis-plus/README.md new file mode 100644 index 0000000..8669a6e --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/README.md @@ -0,0 +1,426 @@ +# spring-boot-demo-orm-mybatis-plus + +> 此 demo 演示了 Spring Boot 如何集成 mybatis-plus,简化Mybatis开发,带给你难以置信的开发体验。 + +## pom.xml + +```xml + + + 4.0.0 + + spring-boot-demo-orm-mybatis-plus + 1.0.0-SNAPSHOT + jar + + spring-boot-demo-orm-mybatis-plus + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + 3.0.5 + + + + + org.springframework.boot + spring-boot-starter + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis.plus.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + mysql + mysql-connector-java + + + + cn.hutool + hutool-all + + + + com.google.guava + guava + + + + org.projectlombok + lombok + true + + + + + spring-boot-demo-orm-mybatis-plus + + + org.springframework.boot + spring-boot-maven-plugin + + + + + +``` + +## MybatisPlusConfig.java + +```java +/** + *

+ * mybatis-plus 配置 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.config + * @description: mybatis-plus 配置 + * @author: yangkai.shen + * @date: Created in 2018/11/8 17:29 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Configuration +@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.plus.mapper"}) +@EnableTransactionManagement +public class MybatisPlusConfig { + /** + * 性能分析拦截器,不建议生产使用 + */ + @Bean + public PerformanceInterceptor performanceInterceptor(){ + return new PerformanceInterceptor(); + } + + /** + * 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} +``` + +## CommonFieldHandler.java + +```java +package com.xkcoding.orm.mybatis.plus.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + *

+ * 通用字段填充 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.config + * @description: 通用字段填充 + * @author: yangkai.shen + * @date: Created in 2018/11/8 17:40 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +@Component +public class CommonFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + log.info("start insert fill ...."); + this.setFieldValByName("createTime", new Date(), metaObject); + this.setFieldValByName("lastUpdateTime", new Date(), metaObject); + } + + @Override + public void updateFill(MetaObject metaObject) { + log.info("start update fill ...."); + this.setFieldValByName("lastUpdateTime", new Date(), metaObject); + } +} +``` + +## application.yml + +```yaml +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + initialization-mode: always + continue-on-error: true + schema: + - "classpath:db/schema.sql" + data: + - "classpath:db/data.sql" + hikari: + minimum-idle: 5 + connection-test-query: SELECT 1 FROM DUAL + maximum-pool-size: 20 + auto-commit: true + idle-timeout: 30000 + pool-name: SpringBootDemoHikariCP + max-lifetime: 60000 + connection-timeout: 30000 +logging: + level: + com.xkcoding: debug + com.xkcoding.orm.mybatis.plus.mapper: trace +mybatis-plus: + mapper-locations: classpath:mappers/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.xkcoding.orm.mybatis.plus.entity + global-config: + # 数据库相关配置 + db-config: + #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; + id-type: auto + #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" + field-strategy: not_empty + #驼峰下划线转换 + table-underline: true + #是否开启大写命名,默认不开启 + #capital-mode: true + #逻辑删除配置 + #logic-delete-value: 1 + #logic-not-delete-value: 0 + db-type: mysql + #刷新mapper 调试神器 + refresh: true + # 原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: true +``` + +## UserMapper.java + +```java +/** + *

+ * UserMapper + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.mapper + * @description: UserMapper + * @author: yangkai.shen + * @date: Created in 2018/11/8 16:57 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Component +public interface UserMapper extends BaseMapper { +} +``` + +## UserService.java + +```java +/** + *

+ * User Service + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service + * @description: User Service + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:10 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface UserService extends IService { +} +``` + +## UserServiceImpl.java + +```java +/** + *

+ * User Service + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service.impl + * @description: User Service + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:10 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { +} +``` + +## UserServiceImplTest.java + +```java +/** + *

+ * User Service 测试 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service.impl + * @description: User Service 测试 + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:13 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class UserServiceImplTest extends SpringBootDemoOrmMybatisPlusApplicationTests { + @Autowired + private UserService userService; + + /** + * 测试Mybatis-Plus 新增 + */ + @Test + public void testSave() { + String salt = IdUtil.fastSimpleUUID(); + User testSave3 = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).build(); + boolean save = userService.save(testSave3); + Assert.assertTrue(save); + log.debug("【测试id回显#testSave3.getId()】= {}", testSave3.getId()); + } + + /** + * 测试Mybatis-Plus 批量新增 + */ + @Test + public void testSaveList() { + List userList = Lists.newArrayList(); + for (int i = 4; i < 14; i++) { + String salt = IdUtil.fastSimpleUUID(); + User user = User.builder().name("testSave" + i).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + i + "@xkcoding.com").phoneNumber("1730000000" + i).status(1).lastLoginTime(new DateTime()).build(); + userList.add(user); + } + boolean batch = userService.saveBatch(userList); + Assert.assertTrue(batch); + List ids = userList.stream().map(User::getId).collect(Collectors.toList()); + log.debug("【userList#ids】= {}", ids); + } + + /** + * 测试Mybatis-Plus 删除 + */ + @Test + public void testDelete() { + boolean remove = userService.removeById(1L); + Assert.assertTrue(remove); + User byId = userService.getById(1L); + Assert.assertNull(byId); + } + + /** + * 测试Mybatis-Plus 修改 + */ + @Test + public void testUpdate() { + User user = userService.getById(1L); + Assert.assertNotNull(user); + user.setName("MybatisPlus修改名字"); + boolean b = userService.updateById(user); + Assert.assertTrue(b); + User update = userService.getById(1L); + Assert.assertEquals("MybatisPlus修改名字", update.getName()); + log.debug("【update】= {}", update); + } + + /** + * 测试Mybatis-Plus 查询单个 + */ + @Test + public void testQueryOne() { + User user = userService.getById(1L); + Assert.assertNotNull(user); + log.debug("【user】= {}", user); + } + + /** + * 测试Mybatis-Plus 查询全部 + */ + @Test + public void testQueryAll() { + List list = userService.list(new QueryWrapper<>()); + Assert.assertTrue(CollUtil.isNotEmpty(list)); + log.debug("【list】= {}", list); + } + + /** + * 测试Mybatis-Plus 分页排序查询 + */ + @Test + public void testQueryByPageAndSort() { + initData(); + int count = userService.count(new QueryWrapper<>()); + Page userPage = new Page<>(1, 5); + userPage.setDesc("id"); + IPage page = userService.page(userPage, new QueryWrapper<>()); + Assert.assertEquals(5, page.getSize()); + Assert.assertEquals(count, page.getTotal()); + log.debug("【page.getRecords()】= {}", page.getRecords()); + } + + /** + * 测试Mybatis-Plus 自定义查询 + */ + @Test + public void testQueryByCondition() { + initData(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("name", "Save1").or().eq("phone_number", "17300000001").orderByDesc("id"); + int count = userService.count(wrapper); + Page userPage = new Page<>(1, 3); + IPage page = userService.page(userPage, wrapper); + Assert.assertEquals(3, page.getSize()); + Assert.assertEquals(count, page.getTotal()); + log.debug("【page.getRecords()】= {}", page.getRecords()); + } + + /** + * 初始化数据 + */ + private void initData() { + testSaveList(); + } + +} +``` + +## 参考 + +- mybatis-plus官方文档:http://mp.baomidou.com/ + diff --git a/spring-boot-demo-orm-mybatis-plus/pom.xml b/spring-boot-demo-orm-mybatis-plus/pom.xml new file mode 100644 index 0000000..adbfd6a --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + spring-boot-demo-orm-mybatis-plus + 1.0.0-SNAPSHOT + jar + + spring-boot-demo-orm-mybatis-plus + Demo project for Spring Boot + + + com.xkcoding + spring-boot-demo + 1.0.0-SNAPSHOT + + + + UTF-8 + UTF-8 + 1.8 + 3.0.5 + + + + + org.springframework.boot + spring-boot-starter + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis.plus.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + mysql + mysql-connector-java + + + + cn.hutool + hutool-all + + + + com.google.guava + guava + + + + org.projectlombok + lombok + true + + + + + spring-boot-demo-orm-mybatis-plus + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplication.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplication.java new file mode 100644 index 0000000..9b908b2 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplication.java @@ -0,0 +1,26 @@ +package com.xkcoding.orm.mybatis.plus; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + *

+ * 启动器 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus + * @description: 启动器 + * @author: yangkai.shen + * @date: Created in 2018/11/8 16:48 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@SpringBootApplication +public class SpringBootDemoOrmMybatisPlusApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoOrmMybatisPlusApplication.class, args); + } +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/CommonFieldHandler.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/CommonFieldHandler.java new file mode 100644 index 0000000..77584eb --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/CommonFieldHandler.java @@ -0,0 +1,39 @@ +package com.xkcoding.orm.mybatis.plus.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + *

+ * 通用字段填充 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.config + * @description: 通用字段填充 + * @author: yangkai.shen + * @date: Created in 2018/11/8 17:40 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +@Component +public class CommonFieldHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + log.info("start insert fill ...."); + this.setFieldValByName("createTime", new Date(), metaObject); + this.setFieldValByName("lastUpdateTime", new Date(), metaObject); + } + + @Override + public void updateFill(MetaObject metaObject) { + log.info("start update fill ...."); + this.setFieldValByName("lastUpdateTime", new Date(), metaObject); + } +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/MybatisPlusConfig.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/MybatisPlusConfig.java new file mode 100644 index 0000000..4d6f846 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/config/MybatisPlusConfig.java @@ -0,0 +1,42 @@ +package com.xkcoding.orm.mybatis.plus.config; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + *

+ * mybatis-plus 配置 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.config + * @description: mybatis-plus 配置 + * @author: yangkai.shen + * @date: Created in 2018/11/8 17:29 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Configuration +@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.plus.mapper"}) +@EnableTransactionManagement +public class MybatisPlusConfig { + /** + * 性能分析拦截器,不建议生产使用 + */ + @Bean + public PerformanceInterceptor performanceInterceptor(){ + return new PerformanceInterceptor(); + } + + /** + * 分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/entity/User.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/entity/User.java new file mode 100644 index 0000000..afa560a --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/entity/User.java @@ -0,0 +1,88 @@ +package com.xkcoding.orm.mybatis.plus.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT; +import static com.baomidou.mybatisplus.annotation.FieldFill.INSERT_UPDATE; + +/** + *

+ * 用户实体类 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.entity + * @description: 用户实体类 + * @author: yangkai.shen + * @date: Created in 2018/11/8 16:49 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@TableName("orm_user") +public class User implements Serializable { + private static final long serialVersionUID = -1840831686851699943L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户名 + */ + private String name; + + /** + * 加密后的密码 + */ + private String password; + + /** + * 加密使用的盐 + */ + private String salt; + + /** + * 邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phoneNumber; + + /** + * 状态,-1:逻辑删除,0:禁用,1:启用 + */ + private Integer status; + + /** + * 创建时间 + */ + @TableField(fill = INSERT) + private Date createTime; + + /** + * 上次登录时间 + */ + private Date lastLoginTime; + + /** + * 上次更新时间 + */ + @TableField(fill = INSERT_UPDATE) + private Date lastUpdateTime; +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/mapper/UserMapper.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/mapper/UserMapper.java new file mode 100644 index 0000000..4bb44b4 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/mapper/UserMapper.java @@ -0,0 +1,22 @@ +package com.xkcoding.orm.mybatis.plus.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xkcoding.orm.mybatis.plus.entity.User; +import org.springframework.stereotype.Component; + +/** + *

+ * UserMapper + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.mapper + * @description: UserMapper + * @author: yangkai.shen + * @date: Created in 2018/11/8 16:57 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Component +public interface UserMapper extends BaseMapper { +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/UserService.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/UserService.java new file mode 100644 index 0000000..bb357bb --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/UserService.java @@ -0,0 +1,20 @@ +package com.xkcoding.orm.mybatis.plus.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xkcoding.orm.mybatis.plus.entity.User; + +/** + *

+ * User Service + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service + * @description: User Service + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:10 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +public interface UserService extends IService { +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImpl.java b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..5afb5f7 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImpl.java @@ -0,0 +1,24 @@ +package com.xkcoding.orm.mybatis.plus.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xkcoding.orm.mybatis.plus.entity.User; +import com.xkcoding.orm.mybatis.plus.mapper.UserMapper; +import com.xkcoding.orm.mybatis.plus.service.UserService; +import org.springframework.stereotype.Service; + +/** + *

+ * User Service + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service.impl + * @description: User Service + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:10 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/resources/application.yml b/spring-boot-demo-orm-mybatis-plus/src/main/resources/application.yml new file mode 100644 index 0000000..875c3e2 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/resources/application.yml @@ -0,0 +1,51 @@ +spring: + datasource: + url: jdbc:mysql://127.0.0.1:3306/spring-boot-demo?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8 + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + initialization-mode: always + continue-on-error: true + schema: + - "classpath:db/schema.sql" + data: + - "classpath:db/data.sql" + hikari: + minimum-idle: 5 + connection-test-query: SELECT 1 FROM DUAL + maximum-pool-size: 20 + auto-commit: true + idle-timeout: 30000 + pool-name: SpringBootDemoHikariCP + max-lifetime: 60000 + connection-timeout: 30000 +logging: + level: + com.xkcoding: debug + com.xkcoding.orm.mybatis.plus.mapper: trace +mybatis-plus: + mapper-locations: classpath:mappers/*.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.xkcoding.orm.mybatis.plus.entity + global-config: + # 数据库相关配置 + db-config: + #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; + id-type: auto + #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" + field-strategy: not_empty + #驼峰下划线转换 + table-underline: true + #是否开启大写命名,默认不开启 + #capital-mode: true + #逻辑删除配置 + #logic-delete-value: 1 + #logic-not-delete-value: 0 + db-type: mysql + #刷新mapper 调试神器 + refresh: true + # 原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: true \ No newline at end of file diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/data.sql b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/data.sql new file mode 100644 index 0000000..3ab2b59 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/data.sql @@ -0,0 +1,2 @@ +INSERT INTO `orm_user`(`id`,`name`,`password`,`salt`,`email`,`phone_number`) VALUES (1, 'user_1', 'ff342e862e7c3285cdc07e56d6b8973b', '412365a109674b2dbb1981ed561a4c70', 'user1@xkcoding.com', '17300000001'); +INSERT INTO `orm_user`(`id`,`name`,`password`,`salt`,`email`,`phone_number`) VALUES (2, 'user_2', '6c6bf02c8d5d3d128f34b1700cb1e32c', 'fcbdd0e8a9404a5585ea4e01d0e4d7a0', 'user2@xkcoding.com', '17300000002'); \ No newline at end of file diff --git a/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/schema.sql b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/schema.sql new file mode 100644 index 0000000..22804e5 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/main/resources/db/schema.sql @@ -0,0 +1,13 @@ +DROP TABLE IF EXISTS `orm_user`; +CREATE TABLE `orm_user` ( + `id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键', + `name` VARCHAR(32) NOT NULL UNIQUE COMMENT '用户名', + `password` VARCHAR(32) NOT NULL COMMENT '加密后的密码', + `salt` VARCHAR(32) NOT NULL COMMENT '加密使用的盐', + `email` VARCHAR(32) NOT NULL UNIQUE COMMENT '邮箱', + `phone_number` VARCHAR(15) NOT NULL UNIQUE COMMENT '手机号码', + `status` INT(2) NOT NULL DEFAULT 1 COMMENT '状态,-1:逻辑删除,0:禁用,1:启用', + `create_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', + `last_login_time` DATETIME DEFAULT NULL COMMENT '上次登录时间', + `last_update_time` DATETIME NOT NULL DEFAULT NOW() COMMENT '上次更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Spring Boot Demo Orm 系列示例表'; diff --git a/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplicationTests.java b/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplicationTests.java new file mode 100644 index 0000000..9973d2d --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/SpringBootDemoOrmMybatisPlusApplicationTests.java @@ -0,0 +1,16 @@ +package com.xkcoding.orm.mybatis.plus; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class SpringBootDemoOrmMybatisPlusApplicationTests { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImplTest.java b/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImplTest.java new file mode 100644 index 0000000..d2ec6d7 --- /dev/null +++ b/spring-boot-demo-orm-mybatis-plus/src/test/java/com/xkcoding/orm/mybatis/plus/service/impl/UserServiceImplTest.java @@ -0,0 +1,153 @@ +package com.xkcoding.orm.mybatis.plus.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.xkcoding.orm.mybatis.plus.SpringBootDemoOrmMybatisPlusApplicationTests; +import com.xkcoding.orm.mybatis.plus.entity.User; +import com.xkcoding.orm.mybatis.plus.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.util.Lists; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * User Service 测试 + *

+ * + * @package: com.xkcoding.orm.mybatis.plus.service.impl + * @description: User Service 测试 + * @author: yangkai.shen + * @date: Created in 2018/11/8 18:13 + * @copyright: Copyright (c) 2018 + * @version: V1.0 + * @modified: yangkai.shen + */ +@Slf4j +public class UserServiceImplTest extends SpringBootDemoOrmMybatisPlusApplicationTests { + @Autowired + private UserService userService; + + /** + * 测试Mybatis-Plus 新增 + */ + @Test + public void testSave() { + String salt = IdUtil.fastSimpleUUID(); + User testSave3 = User.builder().name("testSave3").password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave3@xkcoding.com").phoneNumber("17300000003").status(1).lastLoginTime(new DateTime()).build(); + boolean save = userService.save(testSave3); + Assert.assertTrue(save); + log.debug("【测试id回显#testSave3.getId()】= {}", testSave3.getId()); + } + + /** + * 测试Mybatis-Plus 批量新增 + */ + @Test + public void testSaveList() { + List userList = Lists.newArrayList(); + for (int i = 4; i < 14; i++) { + String salt = IdUtil.fastSimpleUUID(); + User user = User.builder().name("testSave" + i).password(SecureUtil.md5("123456" + salt)).salt(salt).email("testSave" + i + "@xkcoding.com").phoneNumber("1730000000" + i).status(1).lastLoginTime(new DateTime()).build(); + userList.add(user); + } + boolean batch = userService.saveBatch(userList); + Assert.assertTrue(batch); + List ids = userList.stream().map(User::getId).collect(Collectors.toList()); + log.debug("【userList#ids】= {}", ids); + } + + /** + * 测试Mybatis-Plus 删除 + */ + @Test + public void testDelete() { + boolean remove = userService.removeById(1L); + Assert.assertTrue(remove); + User byId = userService.getById(1L); + Assert.assertNull(byId); + } + + /** + * 测试Mybatis-Plus 修改 + */ + @Test + public void testUpdate() { + User user = userService.getById(1L); + Assert.assertNotNull(user); + user.setName("MybatisPlus修改名字"); + boolean b = userService.updateById(user); + Assert.assertTrue(b); + User update = userService.getById(1L); + Assert.assertEquals("MybatisPlus修改名字", update.getName()); + log.debug("【update】= {}", update); + } + + /** + * 测试Mybatis-Plus 查询单个 + */ + @Test + public void testQueryOne() { + User user = userService.getById(1L); + Assert.assertNotNull(user); + log.debug("【user】= {}", user); + } + + /** + * 测试Mybatis-Plus 查询全部 + */ + @Test + public void testQueryAll() { + List list = userService.list(new QueryWrapper<>()); + Assert.assertTrue(CollUtil.isNotEmpty(list)); + log.debug("【list】= {}", list); + } + + /** + * 测试Mybatis-Plus 分页排序查询 + */ + @Test + public void testQueryByPageAndSort() { + initData(); + int count = userService.count(new QueryWrapper<>()); + Page userPage = new Page<>(1, 5); + userPage.setDesc("id"); + IPage page = userService.page(userPage, new QueryWrapper<>()); + Assert.assertEquals(5, page.getSize()); + Assert.assertEquals(count, page.getTotal()); + log.debug("【page.getRecords()】= {}", page.getRecords()); + } + + /** + * 测试Mybatis-Plus 自定义查询 + */ + @Test + public void testQueryByCondition() { + initData(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("name", "Save1").or().eq("phone_number", "17300000001").orderByDesc("id"); + int count = userService.count(wrapper); + Page userPage = new Page<>(1, 3); + IPage page = userService.page(userPage, wrapper); + Assert.assertEquals(3, page.getSize()); + Assert.assertEquals(count, page.getTotal()); + log.debug("【page.getRecords()】= {}", page.getRecords()); + } + + /** + * 初始化数据 + */ + private void initData() { + testSaveList(); + } + +} \ No newline at end of file