@@ -23,6 +23,7 @@ | |||
<module>spring-boot-demo-orm-jdbctemplate</module> | |||
<module>spring-boot-demo-orm-jpa</module> | |||
<module>spring-boot-demo-orm-mybatis</module> | |||
<module>spring-boot-demo-orm-mybatis-mapper-page</module> | |||
<module>spring-boot-demo-email</module> | |||
<module>spring-boot-demo-upload</module> | |||
<module>spring-boot-demo-war</module> | |||
@@ -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/ |
@@ -0,0 +1,336 @@ | |||
# spring-boot-demo-orm-mybatis-mapper-page | |||
> 此 demo 演示了 Spring Boot 如何集成通用Mapper插件和分页助手插件,简化Mybatis开发,带给你难以置信的开发体验。 | |||
## pom.xml | |||
```xml | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>spring-boot-demo-orm-mybatis-mapper-page</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-mybatis-mapper-page</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
</parent> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||
<java.version>1.8</java.version> | |||
<mybatis.mapper.version>2.0.4</mybatis.mapper.version> | |||
<mybatis.pagehelper.version>1.2.9</mybatis.pagehelper.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
</dependency> | |||
<!-- 通用Mapper --> | |||
<dependency> | |||
<groupId>tk.mybatis</groupId> | |||
<artifactId>mapper-spring-boot-starter</artifactId> | |||
<version>${mybatis.mapper.version}</version> | |||
</dependency> | |||
<!-- 分页助手 --> | |||
<dependency> | |||
<groupId>com.github.pagehelper</groupId> | |||
<artifactId>pagehelper-spring-boot-starter</artifactId> | |||
<version>${mybatis.pagehelper.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.hutool</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-mybatis-mapper-page</finalName> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-maven-plugin</artifactId> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> | |||
``` | |||
## SpringBootDemoOrmMybatisApplication.java | |||
```java | |||
/** | |||
* <p> | |||
* 启动器 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage | |||
* @description: 启动器 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 13:43 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@SpringBootApplication | |||
@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.MapperAndPage.mapper"}) // 注意:这里的 MapperScan 是 tk.mybatis.spring.annotation.MapperScan 这个包下的 | |||
public class SpringBootDemoOrmMybatisMapperPageApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoOrmMybatisMapperPageApplication.class, args); | |||
} | |||
} | |||
``` | |||
## 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.MapperAndPage.mapper: trace | |||
mybatis: | |||
configuration: | |||
# 下划线转驼峰 | |||
map-underscore-to-camel-case: true | |||
mapper-locations: classpath:mappers/*.xml | |||
type-aliases-package: com.xkcoding.orm.mybatis.MapperAndPage.entity | |||
mapper: | |||
mappers: | |||
- tk.mybatis.mapper.common.Mapper | |||
not-empty: true | |||
style: camelhump | |||
wrap-keyword: "`{0}`" | |||
safe-delete: true | |||
safe-update: true | |||
identity: MYSQL | |||
pagehelper: | |||
auto-dialect: true | |||
helper-dialect: mysql | |||
reasonable: true | |||
params: count=countSql | |||
``` | |||
## UserMapper.java | |||
```java | |||
/** | |||
* <p> | |||
* UserMapper | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage.mapper | |||
* @description: UserMapper | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 14:15 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Component | |||
// 注意:这里的Mapper是tk.mybatis.mapper.common.Mapper包下的 | |||
public interface UserMapper extends Mapper<User>, MySqlMapper<User> { | |||
} | |||
``` | |||
## UserMapperTest.java | |||
```java | |||
/** | |||
* <p> | |||
* UserMapper 测试 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage.mapper | |||
* @description: UserMapper 测试 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 14:25 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Slf4j | |||
public class UserMapperTest extends SpringBootDemoOrmMybatisMapperPageApplicationTests { | |||
@Autowired | |||
private UserMapper userMapper; | |||
/** | |||
* 测试通用Mapper - 保存 | |||
*/ | |||
@Test | |||
public void testInsert() { | |||
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()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build(); | |||
userMapper.insertUseGeneratedKeys(testSave3); | |||
Assert.assertNotNull(testSave3.getId()); | |||
log.debug("【测试主键回写#testSave3.getId()】= {}", testSave3.getId()); | |||
} | |||
/** | |||
* 测试通用Mapper - 批量保存 | |||
*/ | |||
@Test | |||
public void testInsertList() { | |||
List<User> 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()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build(); | |||
userList.add(user); | |||
} | |||
int i = userMapper.insertList(userList); | |||
Assert.assertEquals(userList.size(), i); | |||
List<Long> ids = userList.stream().map(User::getId).collect(Collectors.toList()); | |||
log.debug("【测试主键回写#userList.ids】= {}", ids); | |||
} | |||
/** | |||
* 测试通用Mapper - 删除 | |||
*/ | |||
@Test | |||
public void testDelete() { | |||
Long primaryKey = 1L; | |||
int i = userMapper.deleteByPrimaryKey(primaryKey); | |||
Assert.assertEquals(1, i); | |||
User user = userMapper.selectByPrimaryKey(primaryKey); | |||
Assert.assertNull(user); | |||
} | |||
/** | |||
* 测试通用Mapper - 更新 | |||
*/ | |||
@Test | |||
public void testUpdate() { | |||
Long primaryKey = 1L; | |||
User user = userMapper.selectByPrimaryKey(primaryKey); | |||
user.setName("通用Mapper名字更新"); | |||
int i = userMapper.updateByPrimaryKeySelective(user); | |||
Assert.assertEquals(1, i); | |||
User update = userMapper.selectByPrimaryKey(primaryKey); | |||
Assert.assertNotNull(update); | |||
Assert.assertEquals("通用Mapper名字更新", update.getName()); | |||
log.debug("【update】= {}", update); | |||
} | |||
/** | |||
* 测试通用Mapper - 查询 | |||
*/ | |||
@Test | |||
public void testQueryAll() { | |||
List<User> users = userMapper.selectAll(); | |||
Assert.assertTrue(CollUtil.isNotEmpty(users)); | |||
log.debug("【users】= {}", users); | |||
} | |||
/** | |||
* 测试分页助手 - 分页排序查询 | |||
*/ | |||
@Test | |||
public void testQueryByPageAndSort() { | |||
initData(); | |||
int currentPage = 1; | |||
int pageSize = 5; | |||
String orderBy = "id desc"; | |||
int count = userMapper.selectCount(null); | |||
PageHelper.startPage(currentPage, pageSize, orderBy); | |||
List<User> users = userMapper.selectAll(); | |||
PageInfo<User> userPageInfo = new PageInfo<>(users); | |||
Assert.assertEquals(5, userPageInfo.getSize()); | |||
Assert.assertEquals(count, userPageInfo.getTotal()); | |||
log.debug("【userPageInfo】= {}", userPageInfo); | |||
} | |||
/** | |||
* 测试通用Mapper - 条件查询 | |||
*/ | |||
@Test | |||
public void testQueryByCondition() { | |||
initData(); | |||
Example example = new Example(User.class); | |||
// 过滤 | |||
example.createCriteria().andLike("name", "%Save1%").orEqualTo("phoneNumber", "17300000001"); | |||
// 排序 | |||
example.setOrderByClause("id desc"); | |||
int count = userMapper.selectCountByExample(example); | |||
// 分页 | |||
PageHelper.startPage(1, 3); | |||
// 查询 | |||
List<User> userList = userMapper.selectByExample(example); | |||
PageInfo<User> userPageInfo = new PageInfo<>(userList); | |||
Assert.assertEquals(3, userPageInfo.getSize()); | |||
Assert.assertEquals(count, userPageInfo.getTotal()); | |||
log.debug("【userPageInfo】= {}", userPageInfo); | |||
} | |||
/** | |||
* 初始化数据 | |||
*/ | |||
private void initData() { | |||
testInsertList(); | |||
} | |||
} | |||
``` | |||
## 参考 | |||
- 通用Mapper官方文档:https://github.com/abel533/Mapper/wiki/1.integration | |||
- pagehelper 官方文档:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md |
@@ -0,0 +1,85 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>spring-boot-demo-orm-mybatis-mapper-page</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-mybatis-mapper-page</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
</parent> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||
<java.version>1.8</java.version> | |||
<mybatis.mapper.version>2.0.4</mybatis.mapper.version> | |||
<mybatis.pagehelper.version>1.2.9</mybatis.pagehelper.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter</artifactId> | |||
</dependency> | |||
<!-- 通用Mapper --> | |||
<dependency> | |||
<groupId>tk.mybatis</groupId> | |||
<artifactId>mapper-spring-boot-starter</artifactId> | |||
<version>${mybatis.mapper.version}</version> | |||
</dependency> | |||
<!-- 分页助手 --> | |||
<dependency> | |||
<groupId>com.github.pagehelper</groupId> | |||
<artifactId>pagehelper-spring-boot-starter</artifactId> | |||
<version>${mybatis.pagehelper.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.projectlombok</groupId> | |||
<artifactId>lombok</artifactId> | |||
<optional>true</optional> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.hutool</groupId> | |||
<artifactId>hutool-all</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-mybatis-mapper-page</finalName> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-maven-plugin</artifactId> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> |
@@ -0,0 +1,27 @@ | |||
package com.xkcoding.orm.mybatis.MapperAndPage; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
import tk.mybatis.spring.annotation.MapperScan; | |||
/** | |||
* <p> | |||
* 启动器 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage | |||
* @description: 启动器 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 13:43 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@SpringBootApplication | |||
@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.MapperAndPage.mapper"}) | |||
public class SpringBootDemoOrmMybatisMapperPageApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoOrmMybatisMapperPageApplication.class, args); | |||
} | |||
} |
@@ -0,0 +1,86 @@ | |||
package com.xkcoding.orm.mybatis.MapperAndPage.entity; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Builder; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import tk.mybatis.mapper.annotation.KeySql; | |||
import javax.persistence.Id; | |||
import javax.persistence.Table; | |||
import java.io.Serializable; | |||
import java.util.Date; | |||
/** | |||
* <p> | |||
* 用户实体类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage.entity | |||
* @description: 用户实体类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 14:14 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
@Table(name = "orm_user") | |||
public class User implements Serializable { | |||
private static final long serialVersionUID = -1840831686851699943L; | |||
/** | |||
* 主键 | |||
*/ | |||
@Id | |||
@KeySql(useGeneratedKeys = true) | |||
private Long id; | |||
/** | |||
* 用户名 | |||
*/ | |||
private String name; | |||
/** | |||
* 加密后的密码 | |||
*/ | |||
private String password; | |||
/** | |||
* 加密使用的盐 | |||
*/ | |||
private String salt; | |||
/** | |||
* 邮箱 | |||
*/ | |||
private String email; | |||
/** | |||
* 手机号码 | |||
*/ | |||
private String phoneNumber; | |||
/** | |||
* 状态,-1:逻辑删除,0:禁用,1:启用 | |||
*/ | |||
private Integer status; | |||
/** | |||
* 创建时间 | |||
*/ | |||
private Date createTime; | |||
/** | |||
* 上次登录时间 | |||
*/ | |||
private Date lastLoginTime; | |||
/** | |||
* 上次更新时间 | |||
*/ | |||
private Date lastUpdateTime; | |||
} |
@@ -0,0 +1,23 @@ | |||
package com.xkcoding.orm.mybatis.MapperAndPage.mapper; | |||
import com.xkcoding.orm.mybatis.MapperAndPage.entity.User; | |||
import org.springframework.stereotype.Component; | |||
import tk.mybatis.mapper.common.Mapper; | |||
import tk.mybatis.mapper.common.MySqlMapper; | |||
/** | |||
* <p> | |||
* UserMapper | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage.mapper | |||
* @description: UserMapper | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 14:15 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Component | |||
public interface UserMapper extends Mapper<User>, MySqlMapper<User> { | |||
} |
@@ -0,0 +1,46 @@ | |||
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.MapperAndPage.mapper: trace | |||
mybatis: | |||
configuration: | |||
# 下划线转驼峰 | |||
map-underscore-to-camel-case: true | |||
mapper-locations: classpath:mappers/*.xml | |||
type-aliases-package: com.xkcoding.orm.mybatis.MapperAndPage.entity | |||
mapper: | |||
mappers: | |||
- tk.mybatis.mapper.common.Mapper | |||
not-empty: true | |||
style: camelhump | |||
wrap-keyword: "`{0}`" | |||
safe-delete: true | |||
safe-update: true | |||
identity: MYSQL | |||
pagehelper: | |||
auto-dialect: true | |||
helper-dialect: mysql | |||
reasonable: true | |||
params: count=countSql |
@@ -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'); |
@@ -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 系列示例表'; |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.orm.mybatis.MapperAndPage; | |||
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 SpringBootDemoOrmMybatisMapperPageApplicationTests { | |||
@Test | |||
public void contextLoads() { | |||
} | |||
} |
@@ -0,0 +1,154 @@ | |||
package com.xkcoding.orm.mybatis.MapperAndPage.mapper; | |||
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.github.pagehelper.PageHelper; | |||
import com.github.pagehelper.PageInfo; | |||
import com.xkcoding.orm.mybatis.MapperAndPage.SpringBootDemoOrmMybatisMapperPageApplicationTests; | |||
import com.xkcoding.orm.mybatis.MapperAndPage.entity.User; | |||
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 tk.mybatis.mapper.entity.Example; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
/** | |||
* <p> | |||
* UserMapper 测试 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.MapperAndPage.mapper | |||
* @description: UserMapper 测试 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 14:25 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Slf4j | |||
public class UserMapperTest extends SpringBootDemoOrmMybatisMapperPageApplicationTests { | |||
@Autowired | |||
private UserMapper userMapper; | |||
/** | |||
* 测试通用Mapper - 保存 | |||
*/ | |||
@Test | |||
public void testInsert() { | |||
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()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build(); | |||
userMapper.insertUseGeneratedKeys(testSave3); | |||
Assert.assertNotNull(testSave3.getId()); | |||
log.debug("【测试主键回写#testSave3.getId()】= {}", testSave3.getId()); | |||
} | |||
/** | |||
* 测试通用Mapper - 批量保存 | |||
*/ | |||
@Test | |||
public void testInsertList() { | |||
List<User> 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()).createTime(new DateTime()).lastUpdateTime(new DateTime()).build(); | |||
userList.add(user); | |||
} | |||
int i = userMapper.insertList(userList); | |||
Assert.assertEquals(userList.size(), i); | |||
List<Long> ids = userList.stream().map(User::getId).collect(Collectors.toList()); | |||
log.debug("【测试主键回写#userList.ids】= {}", ids); | |||
} | |||
/** | |||
* 测试通用Mapper - 删除 | |||
*/ | |||
@Test | |||
public void testDelete() { | |||
Long primaryKey = 1L; | |||
int i = userMapper.deleteByPrimaryKey(primaryKey); | |||
Assert.assertEquals(1, i); | |||
User user = userMapper.selectByPrimaryKey(primaryKey); | |||
Assert.assertNull(user); | |||
} | |||
/** | |||
* 测试通用Mapper - 更新 | |||
*/ | |||
@Test | |||
public void testUpdate() { | |||
Long primaryKey = 1L; | |||
User user = userMapper.selectByPrimaryKey(primaryKey); | |||
user.setName("通用Mapper名字更新"); | |||
int i = userMapper.updateByPrimaryKeySelective(user); | |||
Assert.assertEquals(1, i); | |||
User update = userMapper.selectByPrimaryKey(primaryKey); | |||
Assert.assertNotNull(update); | |||
Assert.assertEquals("通用Mapper名字更新", update.getName()); | |||
log.debug("【update】= {}", update); | |||
} | |||
/** | |||
* 测试通用Mapper - 查询 | |||
*/ | |||
@Test | |||
public void testQueryAll() { | |||
List<User> users = userMapper.selectAll(); | |||
Assert.assertTrue(CollUtil.isNotEmpty(users)); | |||
log.debug("【users】= {}", users); | |||
} | |||
/** | |||
* 测试分页助手 - 分页排序查询 | |||
*/ | |||
@Test | |||
public void testQueryByPageAndSort() { | |||
initData(); | |||
int currentPage = 1; | |||
int pageSize = 5; | |||
String orderBy = "id desc"; | |||
int count = userMapper.selectCount(null); | |||
PageHelper.startPage(currentPage, pageSize, orderBy); | |||
List<User> users = userMapper.selectAll(); | |||
PageInfo<User> userPageInfo = new PageInfo<>(users); | |||
Assert.assertEquals(5, userPageInfo.getSize()); | |||
Assert.assertEquals(count, userPageInfo.getTotal()); | |||
log.debug("【userPageInfo】= {}", userPageInfo); | |||
} | |||
/** | |||
* 测试通用Mapper - 条件查询 | |||
*/ | |||
@Test | |||
public void testQueryByCondition() { | |||
initData(); | |||
Example example = new Example(User.class); | |||
// 过滤 | |||
example.createCriteria().andLike("name", "%Save1%").orEqualTo("phoneNumber", "17300000001"); | |||
// 排序 | |||
example.setOrderByClause("id desc"); | |||
int count = userMapper.selectCountByExample(example); | |||
// 分页 | |||
PageHelper.startPage(1, 3); | |||
// 查询 | |||
List<User> userList = userMapper.selectByExample(example); | |||
PageInfo<User> userPageInfo = new PageInfo<>(userList); | |||
Assert.assertEquals(3, userPageInfo.getSize()); | |||
Assert.assertEquals(count, userPageInfo.getTotal()); | |||
log.debug("【userPageInfo】= {}", userPageInfo); | |||
} | |||
/** | |||
* 初始化数据 | |||
*/ | |||
private void initData() { | |||
testInsertList(); | |||
} | |||
} |