一:准备工作
1.需求说明
部门管理:新增,删除,编辑部门
员工管理:新增,编辑,单个删除(主键),批量删除,分页查询,条件查询
2.环境搭建
创建springboot工程---思考所需的依赖
Java操作数据库--mybatis
三层架构--面向接口编程--准备实现类
(1)搭建数据库
use tial;
-- 部门管理
create table dept(
id int unsigned primary key auto_increment comment '主键ID',
name varchar(10) not null unique comment '部门名称',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '部门表';
insert into dept (id, name, create_time, update_time) values(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()), (4,'就业部',now(),now()),(5,'人事部',now(),now());
-- 员工管理
create table emp (
id int unsigned primary key auto_increment comment 'ID',
username varchar(20) not null unique comment '用户名',
password varchar(32) default '123456' comment '密码',
name varchar(10) not null comment '姓名',
gender tinyint unsigned not null comment '性别, 说明: 1 男, 2 女',
image varchar(300) comment '图像',
job tinyint unsigned comment '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',
entrydate date comment '入职时间',
dept_id int unsigned comment '部门ID',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '员工表';
INSERT INTO emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
(11,'luzhangke','123456','鹿杖客',1,'11.jpg',5,'2007-02-01',3,now(),now()),
(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',5,'2008-08-18',3,now(),now()),
(13,'fangdongbai','123456','方东白',1,'13.jpg',5,'2012-11-01',3,now(),now()),
(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
(2)构建项目
新建项目--maven管理-web--sql驱动--mybatis框架
pom.xml文件:
(4)编写配置文件--连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/tial spring.datasource.username=root spring.datasource.password=123456 # 配置日志 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启驼峰命名 mybatis.configuration.map-underscore-to-camel-case=true
(5)项目中添加数据库
(6)搭建三层架构
两个数据表:员工表Emp,部门表Dept,
分别对其拆分为dao,service , controller层
对于Dao层,使用mybatis映射,从sql获取数据
创建mapper层
pojo:部门,员工实体类,类中属性名驼峰命名,数据库中相应的表字段是下划线。
controller层:
(7)添加lombok依赖并创建员工与部门对象
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
3.开发规范
(1)接口文档
每一个接口:
关注以下三点:请求方式--post, get , 还有其它
接收参数:基本参数,数组参数,json参数,路径参数
响应数据:
(2)开发规范-- Restful (表述性状态转换)
新增put, delete提交方式
请求参数全变为路径参数与无参数
https://panda-tang.blog.csdn.net/article/details/130020396
(3)开发规范--统一响应结果
注意三个方法的使用
(4.1)导入依赖dom4j
<!-- 解析XML --> <dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
(4.2)导入工具包和result结果类
(4)开发流程
二:部门管理
1.查询部门
导这个包下的list
Controller层与Service层要加注解(代替new上一层的对象)
Service层与Dao层(Mapping层)要加注解@Service,创建bean对象
在Dao层使用mybatis从数据库取数据@Mapper
DeptController层 /** * 部门管理Controller */ @Slf4j @RestController public class DeptController { @Autowired private DeptService deptService; //private static Logger log = LoggerFactory.getLogger(DeptController.class); // 定义日志对象,可以用注解简化,@Slf4j //@RequestMapping(value = "/depts",method = RequestMethod.GET) //限制近允许get方式发送请求 @GetMapping("/depts") public Result list(){ //System.out.println("查询所有部门"); //日志输出 log.info("查询所有部门"); //查询调用Servicr部门接口,再由接口的继承类实现 List<Dept> deptlist=deptService.list(); return Result.success(deptlist); }
2.前后端连调
进入前端工程页面,点击部门管理,如果页面显示了数据,就说明此时我们前后端联调成功:
小结:
3.删除部门
路径参数,delete方式
3.1.思路
3.2实现
//controller层
/*
* 删除部门
**/
@DeleteMapping("/depts/{id}")
//参数路径@PathVariable
public Result delete(@PathVariable Integer id){
log.info("查询所有部门");
deptService.delete(id);
return Result.success();
}
//mapper层(Dao层)
//删除部门
@Delete("delete from tial.dept where id=#{id}")
void delet(Integer id);
//service层,接口
void delete(Integer id);//删除部门
//实现类方法
@Override
public void delete(Integer id) {//删除部门
deptMapper.delet(id);
}
前后端联调
4.新增部门
JSON请求响应,post方式
requestmapping
4.1思路
4.2实现
//controller层
//添加部门
@PostMapping("/depts")
//@RequestBody 请求json数据,使用注解@RequestBody,将对象转为json
public Result add(@RequestBody Dept dept){
log.info("添加部门");
deptService.add(dept);
return Result.success();
}
//service层
//接口
void add(Dept dept);//添加部门
//实现类
public void add(Dept dept) {//添加部门
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
deptMapper.add(dept);
}
//Dao层
//添加部门
@Insert("insert into tial.dept (name, create_time, update_time) "+
"values (#{name},#{createTime},#{updateTime})")
void add(Dept dept);
5.小结
5.1 controller层代码优化
6.修改部门
6.1思路
6.2实现
//controller层
/*
* 修改部门
**/
@PutMapping
public Result revise(@RequestBody Dept dept){
log.info("修改部门",dept);
deptService.revise(dept);
return Result.success();
}
//service层
//接口
void revise(Dept dept);//修改部门
//实现类
@Override
public void revise(Dept dept) {//修改部门
dept.setUpdateTime(LocalDateTime.now());
deptMapper.revise(dept);
}
//Dao层
@Update("update tial.dept set name=#{name}, " +
"update_time=#{updateTime} where id =#{id}")
void revise(Dept dept);
三:员工管理(查询&删除)
1.分页员工查询
1.1思路
1.2 实现
//controller层
/**
* 员工管理Controller
*/
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
private EmpService empService;
/*
员工分页查询,
*/
@GetMapping
public Result list(Integer page, Integer pageSize){
log.info("员工分页查询",page,pageSize);
//未指定情况,默认情况
if (page==null) page=1;
if (pageSize==null) pageSize=10;
//通过注解@RequestParam 为参数指定默认值
//list(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize)
return Result.success(empService.list(page,pageSize));
}
}
//service层
//接口
PageBean list(Integer Page,Integer pageSize);
//实现类
@Service //交给IOC容器管理,创建Dao(Mapper)层的bean对象
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Override
public PageBean list(Integer Page,Integer pageSize) {//员工查询
//获取总数
Long total= empMapper.count();
//获取分页员工数据
Integer start=(Page-1)*pageSize;
List<Emp> rows=empMapper.page(start,pageSize);
//封装bean对象
PageBean pageBean=new PageBean(total,rows);
return pageBean;
}
}
//Dao层
/*员工分页查询*/
//查询总记录数
@Select("select count(*) from tial.emp") //聚合函数,计数
public Long count();
//分页查询的结果
@Select("select * from tial.emp limit #{start}, #{pageSize}")
public List<Emp> page(Integer start,Integer pageSize);
1.3总结
2. PageHelper分页查询插件--简化操作
依赖包坐标大全
分页插件一直出错
//service层
//1. 设置分页参数
// 2. 执行查询
PageHelper.startPage(page,pageSize);
List<Emp> empList=empMapper.list(); //分页结果查询的封装类,Page类
Page<Emp> p = (Page<Emp>) empList;// 强转类型,将empList强转为Page类型
//3.封装bean对象
PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
return pageBean;
//Mapper层
//使用pagehelper 分页查询
@Select("select * from tial.emp")
public List<Emp> list();
3.条件分页查询
3.1 思路
3.2 实现
(1).动态sql--配置XML文件
xml文件的
(2)代码
入职时间匹配不上,写粗了,应该是begin 和 end
修改后:
// controller
/*
员工分页条件查询,
*/
@GetMapping("/emps")
public Result list1(@Param("page") Integer page, @Param("pageSize") Integer pageSize,
@Param("name")String name, @Param("gender")Short gender,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){
log.info("员工条件分页查询,参数:{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);
//未指定情况,默认情况
if (page==null) page=1;
if (pageSize==null) pageSize=10;
//通过注解@RequestParam 为参数指定默认值
//list(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize)
return Result.success(empService.page(page,pageSize,name,gender,begin,end));
}
//service层
//接口
PageBean page(Integer page, Integer pageSize,String name, Short gender, LocalDate begin, LocalDate end);
//实现类
@Override
public PageBean page(Integer page, Integer pageSize,String name,
Short gender, LocalDate begin, LocalDate end) {
log.info("查询总数");//获取总数
Long total= empMapper.count1(name,gender,begin,end);
//获取分页员工数据
//Integer start=(page-1)*pageSize;
List<Emp> rows=empMapper.page1((page-1)*pageSize,pageSize,name,gender,begin,end);
//封装bean对象
PageBean pageBean=new PageBean(total,rows);
return pageBean;
}
//Mapper层
Long count1(String name, Short gender, LocalDate begin, LocalDate end);
List<Emp> page1(Integer start, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);
// 动态SQL,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.ithema.mapper.EmpMapper">
<select id="count1" resultType="Long" >
select count(*)
from tial.emp
<where>
<if test="name!=null">
name like concat('%',#{name},'%')
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
<if test="begin!=null and end!=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
<select id="page1" resultType="com.ithema.pojo.Emp">
select *
from tial.emp
<where>
<if test="name!=null">
name like concat('%',#{name},'%')
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
<if test="begin!=null and end!=null ">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
</mapper>
4.删除员工
4.1思路
批量删除
4.2实现
//controller层
//删除员工
@DeleteMapping("/emps/{ids}") //路径参数,传递数组
public Result delete(@PathVariable List<Integer> ids){
log.info("批量删除操作:{}",ids);
empService.delete(ids);
return Result.success();
}
//service层
//接口
void delete(List<Integer> ids);
//实现类
@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}
//Dao层
void delete(List<Integer> ids);
//XML文件
<delete id="delete">
delete from tial.emp
where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
5.新增员工
5.1思路
5.2实现
//controller层
//添加员工
@PostMapping("/emps")
public Result add(@RequestBody Emp emp){
empService.add(emp);
return Result.success();
}
//service层
//接口
void add(Emp emp);
//实现类
@Override
public void add(Emp emp) {//添加员工
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
empMapper.add(emp);
}
//Dao层
void add(Emp emp);
//XML文件
<insert id="add"> /*添加员工*/
insert into tial.emp(username, name, gender, image, job, entrydate,
dept_id, create_time, update_time) VALUES
(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})
</insert>