@@ -23,6 +23,7 @@ | |||||
<module>spring-boot-demo-orm-jdbctemplate</module> | <module>spring-boot-demo-orm-jdbctemplate</module> | ||||
<module>spring-boot-demo-orm-jpa</module> | <module>spring-boot-demo-orm-jpa</module> | ||||
<module>spring-boot-demo-orm-mybatis</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-email</module> | ||||
<module>spring-boot-demo-upload</module> | <module>spring-boot-demo-upload</module> | ||||
<module>spring-boot-demo-war</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(); | |||||
} | |||||
} |