黑马2023Javaweb(10)|案例(准备工作&部门管理&员工管理)

一:准备工作

1.需求说明

部门管理:新增,删除,编辑部门

员工管理:新增,编辑,单个删除(主键),批量删除,分页查询,条件查询

3ac36d3ccc884c21ab92902dcb5f10ea.png

2.环境搭建

创建springboot工程---思考所需的依赖

Java操作数据库--mybatis

三层架构--面向接口编程--准备实现类

97bb3b1ca7e5467ebfe12e5725c39550.png

(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框架

2e3559318e3f489d977810508016e0e9.png

ea63f5e24cb54a16b9dddad151fd3051.png

pom.xml文件:

b1247401b50b418ea8e330f311f1f2cd.png

ceca8903e07f4e3aa9f0fdcf1c0ed4c2.png

(4)编写配置文件--连接数据库

ee06018193e848e4915d6ea06066f880.png

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)项目中添加数据库

63254df586de436297dbc871fd32ed63.png

(6)搭建三层架构

388100c1b85340178d8eacc8668aa612.png

两个数据表:员工表Emp,部门表Dept,

分别对其拆分为dao,service , controller层

对于Dao层,使用mybatis映射,从sql获取数据

创建mapper层

pojo:部门,员工实体类,类中属性名驼峰命名,数据库中相应的表字段是下划线。

controller层:

77168d7b12774e638ef91b0a1a015e6e.png

4111b724fb1841eeb017a471ff586b5d.png

(7)添加lombok依赖并创建员工与部门对象

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

a2d24697949f483e8b2544a31c2c6f1d.png

3.开发规范 

c29aeba4cc114e92bdb171f19e97c2c8.png

(1)接口文档

每一个接口:

关注以下三点:请求方式--post, get , 还有其它

接收参数:基本参数,数组参数,json参数,路径参数

响应数据

f3d0778386b741dc93d44f3ce3f4125a.png

c90cf9ef879942178ea0a25555137440.png

a70d0ca724c344c39acc1d9494b3fc83.png

(2)开发规范-- Restful (表述性状态转换)

新增put, delete提交方式

请求参数全变为路径参数与无参数

https://panda-tang.blog.csdn.net/article/details/130020396

a9b01558d4634d68b3a0156e5da99897.png

6050abb9281a4a9ca199d04c2d711ca5.png

86f54179fa404dc09172c8262b2701fd.png

(3)开发规范--统一响应结果

注意三个方法的使用

5418af5674ae43699411aa166fd5c2ff.png

(4.1)导入依赖dom4j

<!-- 解析XML -->
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

(4.2)导入工具包和result结果类

0cd77e0b9300417bb082dcad5f53afde.png

(4)开发流程

f5283ca15c1b46b9ac5e3c9f69d70bdc.png

二:部门管理

1.查询部门

11dc6ea6c02a440cb4366be10dd02a8e.png

00fba022b9424c4daaf7244e9fbfc906.png

导这个包下的list

8509813264e14b4ba3c8a1809f3b32ce.png

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);

     }


0996c801277c450e83765856a3ff364d.png

ea8a0602b6874a99bb33e7a5c3dd7692.png

3589602a859d4a5cbea478d2082cc859.png

7ce04044ec0542caab4ab21e3c193335.png

18964dedfb764f239b9382f65b75416e.png

bd3cf148b38d487a993040b36acf2779.png

2.前后端连调

5a632c04b9d64661b18d2c294148ba1b.png

进入前端工程页面,点击部门管理,如果页面显示了数据,就说明此时我们前后端联调成功:

8bc5ebdbf4044e1f920da85fb41361dc.png

小结:

7cc2f99b9b214386887b4c47cafd5962.png

3.删除部门

路径参数,delete方式

3.1.思路

66a0a36815f54a22a9e6d5861d68f74c.png

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);
    }

5420ed55e14848c9a9a4850956a9e257.png

前后端联调

bac780bb42834bfb93553156a985c442.png

4.新增部门

JSON请求响应,post方式

requestmapping

4.1思路

db8a82fcc90643f885bb52e329f7da6f.png

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);

b5d67fbcf4154b9a90d52f816959f9eb.png

2ceec72255cc443180061d7aae01d90e.png

90e4c0de330b4a6e941c44a033844e83.png

5.小结

5.1 controller层代码优化

4fcf144786dc403b8dd74601b2e2f6d4.png

b0d3312e2d394b63af3bb460dcd65537.png

6.修改部门

6.1思路

479e22bce8de4bbb8e3ebcec6ba77360.png

e6950654af4b45f48c55a90d8b9f66f8.png

0635144ed59d4dc89e047b83adde8c91.png

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);

4357beb00db442949f20a92266421280.png

三:员工管理(查询&删除)

8a883edb3f4540e18f48561f04153388.png

1.分页员工查询

1.1思路

4a18eb5ca2754262a0888ca75513e9cd.png

65a78827ce5c4891bb3ff649f9d34992.png

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);

a54e6b5994b94c53a80a607a8bef9401.png

1.3总结

20cf901a53d2485eb9dd14ac615511d7.png

2. PageHelper分页查询插件--简化操作

依赖包坐标大全

https://mvnrepository.com/

分页插件一直出错

33bdc85be55b437cb0ee81558b5794f8.png

624ae4dffa3c42d29808dc0469433453.png

f2a72d78a5e64b6ea595c925d48df611.png

4f1b04c45bf144049d562867171b72ea.png

//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 思路

b93eca989b044f639cb37a7704256d07.png

aa309c74d4ae4d549ecd942f096090fd.png

d1a170a577d04f3998ea7acbfc671cc0.png

3.2 实现

bf73311a217444c984a208c9c0c579bf.png

131a44863259451e802239d98f928d22.png

(1).动态sql--配置XML文件

9dda08945e2148218bcd9eab89a00387.png

xml文件的

59b7ac211b9748b0bd31dd2f92ec5b5b.png

49256c457bab432580695077fa888e8a.png

f0062c03599543e2889a4fbd5ed54d50.png

6351782e27ce4393b8fffef8dac94e5f.png

(2)代码

入职时间匹配不上,写粗了,应该是begin  和 end

ea8618d69e77494aac18f3cead801319.png

修改后:

4e0391289dec4190b9966177fd89a4f0.png

// 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思路

批量删除

e12577f707c84d7f9c4d4257569b8ced.png

1a363a4fed41456fb4a322de1686692d.png

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>

53898443d8264528a79c5b7150815b12.png

5.新增员工

5.1思路

78c842dbd50a40a9afc57154c8d22710.png

cfd9d4b9977c43dab6ae27a76e5296a9.png

6ee138d9e3a243089e1d7a0189945080.png

ff8d67e41397488e936cf7da7ff4497e.png

cd843e75f5624e6d9ae645cf2d9fcea9.png

7986d7781ef94b78ac2e93ad0d34ae16.png

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>

1026f7f9deb44cf7b278beb49901c28e.png

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值