本篇文章将一步步地来实现一个完整的RESTful接口以及对应的单元测试与集成测试。
数据库
第一步,首先来创建一个部门表并插入几条数据,打开MySQLWorkbench,执行下面的sql语句:
# 创建数据库ddn_hrm_db
create database ddn_hrm_db;
# 使用数据库ddn_hrm_db
use ddn_hrm_db;
# 创建表dept_inf
create table dept_inf (
id INT(11) not null auto_increment,
name varchar(50) not null,
remark varchar(300) default null,
primary key (id)
);
# 插入几条数据
insert into dept_inf(id, name, remark) values (1, '技术部', '技术部'), (2, '运营部', '运营部'), (3, '财务部', '财务部'), (4, '总公办', '总公办'), (5, '市场部', '市场部');
用MySQLWorkbench查询下刚才插入进去的数据,验证下表建立的是否正确、插入数据是否正确,查询结果如下所示:
第二步,在Spring Boot中配置mybatis,配置数据库连接池(使用阿里的Druid),先打开pom.xml加入mybatis、druid所依赖的jar包,配置如下所示:
<!-- Mybatis集成 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.4</version>
</dependency>
接着打开application.properties加入JDBC配置、druid配置、mybatis配置,配置如下所示:
# JDBC配置
spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/ddn_hrm_db?useUnicode=true&characterEncoding=utf8
spring.datasource.druid.username=root
spring.datasource.druid.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 连接池配置
spring.datasource.druid.initial-size=10
spring.datasource.druid.max-active=50
spring.datasource.druid.min-idle=10
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
# 监控配置
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/**
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.web-stat-filter.session-stat-enable=true
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
spring.datasource.druid.web-stat-filter.profile-enable=true
# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.reset-enable=true
spring.datasource.druid.stat-view-servlet.login-username=bruce
spring.datasource.druid.stat-view-servlet.login-password=bruce2017
# Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
spring.datasource.druid.aop-patterns=com.dodonew.service.*,com.dodonew.dao.* # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
# 如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true
# Filter配置
spring.datasource.druid.filters=stat,wall
# logging配置
logging.level.org.mybatis.spring=debug
# 显示SQL日志
logging.level.com.dodonew.dao=debug
# mybatis配置
mybatis.configuration.cache-enabled=true
mybatis.configuration.jdbc-type-for-null=null
mybatis.configuration.call-setters-on-nulls=true
在上面的配置中,显示SQL日志的配置要特别注意下,其中com.dodonew.dao是你mapper类所在的包,只有这样配置才能把sql日志给打印出来。
第三步,建立Dept域对象、DeptDao类、DeptService类,如下所示:
Dept域对象:
public class Dept implements Serializable {
private static final long serialVersionUID = -4243387151355500160L;
private Integer id;
private String departName;
private String remark;
public Dept(Integer id, String departName, String remark) {
this.id = id;
this.departName = departName;
this.remark = remark;
}
public Dept(String departName, String remark) {
this.departName = departName;
this.remark = remark;
}
public Dept() {
}
public Integer getId() {
return id;
}
public String getDepartName() {
return departName;
}
public String getRemark() {
return remark;
}
public void setId(Integer id) {
this.id = id;
}
public void setDepartName(String departName) {
this.departName = departName;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "Dept{" +
"id=" + id +
", departName='" + departName + '\'' +
", remark='" + remark + '\'' +
'}';
}
}
DeptDao、DeptDynaSqlProvider类:
public interface DeptDao {
/**
* 查询所有部门
* @return 所有部门
*/
@Select("select * from " + HrmConstants.DEPTTABLE + " ")
List<Dept> selectAllDept();
/**
* 根据id查询部门
* @param id 部门id
* @return 某个部门
*/
@Select("select * from " + HrmConstants.DEPTTABLE + " where id = #{id}")
Dept selectById(Integer id);
/**
* 根据id删除部门
* @param id 部门id
*/
@Delete("delete from " + HrmConstants.DEPTTABLE + " where id = #{id}")
Integer deleteById(Integer id);
/**
* 查询总数量
* @param params
* @return 部门总数量
*/
@SelectProvider(type = DeptDynaSqlProvider.class, method = "count")
Integer count(Map<String, Object> params);
/**
* 分页动态查询
* @param params
* @return 部门列表
*/
@SelectProvider(type = DeptDynaSqlProvider.class, method = "selectWithParams")
List<Dept> selectByPage(Map<String, Object> params);
/**
* 动态插入部门
* @param dept
*
* @SelectKey 注解的主要作用就是把当前插入对象的主键值,赋值给对应的id属性(id代表对应的主键)
*/
@InsertProvider(type = DeptDynaSqlProvider.class, method = "insertDept")
@SelectKey(statement = "SELECT LAST_INSERT_ID() AS id", keyProperty = "id", keyColumn = "id", before = false, resultType = Integer.class)
Integer save(Dept dept);
/**
* 更新某个部门的信息
* @param dept
*/
@UpdateProvider(type = DeptDynaSqlProvider.class, method = "updateDept")
Integer update(Dept dept);
}
public class DeptDynaSqlProvider {
// 分页动态查询
public String selectWithParams(final Map<String, Object> params) {
String sql = new SQL() {
{
SELECT("*");
FROM(HrmConstants.DEPTTABLE);
if (params.get("dept") != null) {
Dept dept = (Dept) params.get("dept");