@@ -22,6 +22,7 @@ | |||
<module>spring-boot-demo-template-enjoy</module> | |||
<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-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,256 @@ | |||
# spring-boot-demo-orm-mybatis | |||
> 此 demo 演示了 Spring Boot 如何与原生的 mybatis 整合,使用了 mybatis 官方提供的脚手架 `mybatis-spring-boot-starter `可以很容易的和 Spring Boot 整合。 | |||
## 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</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-mybatis</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.version>1.3.2</mybatis.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.mybatis.spring.boot</groupId> | |||
<artifactId>mybatis-spring-boot-starter</artifactId> | |||
<version>${mybatis.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</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>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-mybatis</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 | |||
* @description: 启动类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 10:52 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.mapper"}) | |||
@SpringBootApplication | |||
public class SpringBootDemoOrmMybatisApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoOrmMybatisApplication.class, args); | |||
} | |||
} | |||
``` | |||
## UserMapper.java | |||
```java | |||
/** | |||
* <p> | |||
* User Mapper | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.mapper | |||
* @description: User Mapper | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 10:54 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Mapper | |||
@Component | |||
public interface UserMapper { | |||
/** | |||
* 查询所有用户 | |||
* | |||
* @return 用户列表 | |||
*/ | |||
@Select("SELECT * FROM orm_user") | |||
List<User> selectAllUser(); | |||
/** | |||
* 根据id查询用户 | |||
* | |||
* @param id 主键id | |||
* @return 当前id的用户,不存在则是 {@code null} | |||
*/ | |||
@Select("SELECT * FROM orm_user WHERE id = #{id}") | |||
User selectUserById(@Param("id") Long id); | |||
/** | |||
* 保存用户 | |||
* | |||
* @param user 用户 | |||
* @return 成功 - {@code 1} 失败 - {@code 0} | |||
*/ | |||
int saveUser(@Param("user") User user); | |||
/** | |||
* 删除用户 | |||
* | |||
* @param id 主键id | |||
* @return 成功 - {@code 1} 失败 - {@code 0} | |||
*/ | |||
int deleteById(@Param("id") Long id); | |||
} | |||
``` | |||
## UserMapper.xml | |||
```xml | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.xkcoding.orm.mybatis.mapper.UserMapper"> | |||
<insert id="saveUser"> | |||
INSERT INTO `orm_user` (`name`, | |||
`password`, | |||
`salt`, | |||
`email`, | |||
`phone_number`, | |||
`status`, | |||
`create_time`, | |||
`last_login_time`, | |||
`last_update_time`) | |||
VALUES (#{user.name}, | |||
#{user.password}, | |||
#{user.salt}, | |||
#{user.email}, | |||
#{user.phoneNumber}, | |||
#{user.status}, | |||
#{user.createTime}, | |||
#{user.lastLoginTime}, | |||
#{user.lastUpdateTime}) | |||
</insert> | |||
<delete id="deleteById"> | |||
DELETE | |||
FROM `orm_user` | |||
WHERE `id` = #{id} | |||
</delete> | |||
</mapper> | |||
``` | |||
## UserMapperTest.java | |||
```java | |||
/** | |||
* <p> | |||
* UserMapper 测试类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.mapper | |||
* @description: UserMapper 测试类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 11:25 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Slf4j | |||
public class UserMapperTest extends SpringBootDemoOrmMybatisApplicationTests { | |||
@Autowired | |||
private UserMapper userMapper; | |||
@Test | |||
public void selectAllUser() { | |||
List<User> userList = userMapper.selectAllUser(); | |||
Assert.assertTrue(CollUtil.isNotEmpty(userList)); | |||
log.debug("【userList】= {}", userList); | |||
} | |||
@Test | |||
public void selectUserById() { | |||
User user = userMapper.selectUserById(1L); | |||
Assert.assertNotNull(user); | |||
log.debug("【user】= {}", user); | |||
} | |||
@Test | |||
public void saveUser() { | |||
String salt = IdUtil.fastSimpleUUID(); | |||
User user = 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(); | |||
int i = userMapper.saveUser(user); | |||
Assert.assertEquals(1, i); | |||
} | |||
@Test | |||
public void deleteById() { | |||
int i = userMapper.deleteById(1L); | |||
Assert.assertEquals(1, i); | |||
} | |||
} | |||
``` | |||
## 参考 | |||
- Mybatis官方文档:http://www.mybatis.org/mybatis-3/zh/index.html | |||
- Mybatis官方脚手架文档:http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ | |||
- Mybatis整合Spring Boot官方demo:https://github.com/mybatis/spring-boot-starter/tree/master/mybatis-spring-boot-samples |
@@ -0,0 +1,71 @@ | |||
<?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</artifactId> | |||
<version>0.0.1-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-orm-mybatis</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.version>1.3.2</mybatis.version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.mybatis.spring.boot</groupId> | |||
<artifactId>mybatis-spring-boot-starter</artifactId> | |||
<version>${mybatis.version}</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>mysql</groupId> | |||
<artifactId>mysql-connector-java</artifactId> | |||
</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>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-orm-mybatis</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; | |||
import org.mybatis.spring.annotation.MapperScan; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
/** | |||
* <p> | |||
* 启动类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis | |||
* @description: 启动类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 10:52 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@MapperScan(basePackages = {"com.xkcoding.orm.mybatis.mapper"}) | |||
@SpringBootApplication | |||
public class SpringBootDemoOrmMybatisApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoOrmMybatisApplication.class, args); | |||
} | |||
} |
@@ -0,0 +1,80 @@ | |||
package com.xkcoding.orm.mybatis.entity; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Builder; | |||
import lombok.Data; | |||
import lombok.NoArgsConstructor; | |||
import java.io.Serializable; | |||
import java.util.Date; | |||
/** | |||
* <p> | |||
* 用户实体类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.entity | |||
* @description: 用户实体类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 10:58 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Data | |||
@NoArgsConstructor | |||
@AllArgsConstructor | |||
@Builder | |||
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; | |||
/** | |||
* 创建时间 | |||
*/ | |||
private Date createTime; | |||
/** | |||
* 上次登录时间 | |||
*/ | |||
private Date lastLoginTime; | |||
/** | |||
* 上次更新时间 | |||
*/ | |||
private Date lastUpdateTime; | |||
} |
@@ -0,0 +1,61 @@ | |||
package com.xkcoding.orm.mybatis.mapper; | |||
import com.xkcoding.orm.mybatis.entity.User; | |||
import org.apache.ibatis.annotations.Mapper; | |||
import org.apache.ibatis.annotations.Param; | |||
import org.apache.ibatis.annotations.Select; | |||
import org.springframework.stereotype.Component; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* User Mapper | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.mapper | |||
* @description: User Mapper | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 10:54 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Mapper | |||
@Component | |||
public interface UserMapper { | |||
/** | |||
* 查询所有用户 | |||
* | |||
* @return 用户列表 | |||
*/ | |||
@Select("SELECT * FROM orm_user") | |||
List<User> selectAllUser(); | |||
/** | |||
* 根据id查询用户 | |||
* | |||
* @param id 主键id | |||
* @return 当前id的用户,不存在则是 {@code null} | |||
*/ | |||
@Select("SELECT * FROM orm_user WHERE id = #{id}") | |||
User selectUserById(@Param("id") Long id); | |||
/** | |||
* 保存用户 | |||
* | |||
* @param user 用户 | |||
* @return 成功 - {@code 1} 失败 - {@code 0} | |||
*/ | |||
int saveUser(@Param("user") User user); | |||
/** | |||
* 删除用户 | |||
* | |||
* @param id 主键id | |||
* @return 成功 - {@code 1} 失败 - {@code 0} | |||
*/ | |||
int deleteById(@Param("id") Long id); | |||
} |
@@ -0,0 +1,32 @@ | |||
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.mapper: trace | |||
mybatis: | |||
configuration: | |||
# 下划线转驼峰 | |||
map-underscore-to-camel-case: true | |||
mapper-locations: classpath:mappers/*.xml | |||
type-aliases-package: com.xkcoding.orm.mybatis.entity |
@@ -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,31 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |||
<mapper namespace="com.xkcoding.orm.mybatis.mapper.UserMapper"> | |||
<insert id="saveUser"> | |||
INSERT INTO `orm_user` (`name`, | |||
`password`, | |||
`salt`, | |||
`email`, | |||
`phone_number`, | |||
`status`, | |||
`create_time`, | |||
`last_login_time`, | |||
`last_update_time`) | |||
VALUES (#{user.name}, | |||
#{user.password}, | |||
#{user.salt}, | |||
#{user.email}, | |||
#{user.phoneNumber}, | |||
#{user.status}, | |||
#{user.createTime}, | |||
#{user.lastLoginTime}, | |||
#{user.lastUpdateTime}) | |||
</insert> | |||
<delete id="deleteById"> | |||
DELETE | |||
FROM `orm_user` | |||
WHERE `id` = #{id} | |||
</delete> | |||
</mapper> |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.orm.mybatis; | |||
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 SpringBootDemoOrmMybatisApplicationTests { | |||
@Test | |||
public void contextLoads() { | |||
} | |||
} |
@@ -0,0 +1,61 @@ | |||
package com.xkcoding.orm.mybatis.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.xkcoding.orm.mybatis.SpringBootDemoOrmMybatisApplicationTests; | |||
import com.xkcoding.orm.mybatis.entity.User; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.junit.Assert; | |||
import org.junit.Test; | |||
import org.springframework.beans.factory.annotation.Autowired; | |||
import java.util.List; | |||
/** | |||
* <p> | |||
* UserMapper 测试类 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.orm.mybatis.mapper | |||
* @description: UserMapper 测试类 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018/11/8 11:25 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@Slf4j | |||
public class UserMapperTest extends SpringBootDemoOrmMybatisApplicationTests { | |||
@Autowired | |||
private UserMapper userMapper; | |||
@Test | |||
public void selectAllUser() { | |||
List<User> userList = userMapper.selectAllUser(); | |||
Assert.assertTrue(CollUtil.isNotEmpty(userList)); | |||
log.debug("【userList】= {}", userList); | |||
} | |||
@Test | |||
public void selectUserById() { | |||
User user = userMapper.selectUserById(1L); | |||
Assert.assertNotNull(user); | |||
log.debug("【user】= {}", user); | |||
} | |||
@Test | |||
public void saveUser() { | |||
String salt = IdUtil.fastSimpleUUID(); | |||
User user = 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(); | |||
int i = userMapper.saveUser(user); | |||
Assert.assertEquals(1, i); | |||
} | |||
@Test | |||
public void deleteById() { | |||
int i = userMapper.deleteById(1L); | |||
Assert.assertEquals(1, i); | |||
} | |||
} |