tlias智能学习辅助系统-增删改查+参数传递

本篇实现黑马tlias智能学习辅助系统中的部门以及员工管理,主要完成增删改查操作以及一些细节问题,后面会进一步总结登录校验、异常处理以及AOP的内容。


目录

一、环境搭建:

二、部门管理:

1、查询所有部门:

controller层代码:

Service层中的代码:

Mapper层中的代码:

2、删除部门:

Controller层中代码:

Service层中代码:

Mapper层中代码:

3、添加部门:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

4、修改部门:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

三、员工管理

1、分页查询所有员工:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

xml映射文件中的sql语句:

2、批量删除操作:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

xml映射文件中的SQL语句:

3、新增员工:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

4、修改员工信息:

Controller层中的代码:

Service层中的代码:

Mapper层中的代码:

xml映射文件中的SQL语句:


一、环境搭建:

  • 准备数据库表(dept、emp)
  • 创建springboot工程,引入对应的起步依赖(web、mybatis、lombok、mysql驱动)
  • 配置application.properties文件,引入mybatis配置信息,准备实体类
  • 准备Mapper、Service接口以及实现类,Controller层代码
  • 依然使用前面讲过的统一响应结果Result。

整体的代码结构如下:

整体的开发流程如下:

二、部门管理:

1、查询所有部门:

controller层代码:

输出日志:引入Slf4j包下的logger。

直接使用GetMappring指定为get请求。

由于增删改查功能中请求路径中都包含/depts,因此使用@RequestMapping注解,放在类的前面,简化操作。因此完整的请求路径就是类上的@RequestMapping的value属性+方法上的@RequestMappring的value属性

java 复制代码
@RestController
@Slf4j
@RequestMapping("/depts")//在前面加上后,下面的就可以注释掉了,不用加depts了
public class DeptController {
    @Autowired
    private DeptService deptService;

    //TODO 查询所有部门数据:
    //private static Logger log= LoggerFactory.getLogger(DeptController.class);//引入slf4j包下的 这段代码是固定的,所以为了方便起见,可以直接添加一个注解:slf4j
    //@RequestMapping(value = "/depts",method = RequestMethod.GET)//指定请求方式是get,但是有一种更简洁的方式如下;
    //@GetMapping("/depts")//在postman中测试用post请求会报405
    @GetMapping
    public Result list(){
        log.info("查询全部信息");//一般不用sout输出,正规一些要用logback日志的形式输出;

        List<Dept> deptList=deptService.list();
        return Result.success(deptList);
    }
Service层中的代码:
java 复制代码
@Override
    public List<Dept> list() {
        return deptMapper.list();
    }
Mapper层中的代码:
java 复制代码
@Mapper
public interface DeptMapper {
    @Select("select *from dept")//因为查询语句很简单,不用xml映射文件中配置的方法;
    List<Dept> list();

2、删除部门:

Controller层中代码:
java 复制代码
//TODO 删除指定部门:
    //@DeleteMapping("/depts/{id}")
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){//PathBariable注解将路径中的id绑定到参数id;
        log.info("根据参数id删除部门:{}",id);
        deptService.delete(id);
        return Result.success();
    }
Service层中代码:
java 复制代码
public void deleteById(Integer id){
    deptMapper.deleteById(id);
}
Mapper层中代码:
java 复制代码
@Delete("delete from dept where id=#{id}")
    void delete(Integer id);

3、添加部门:

Controller层中的代码:

要使用@RequestBody注解将前端发送的json格式数据封装到实体类对象当中

java 复制代码
//TODO 添加部门:
    //@PostMapping("/depts")
    @PostMapping
    public Result add(@RequestBody Dept dept){
        log.info("添加部门:{}",dept);
        deptService.add(dept);
        return Result.success();
    }
Service层中的代码:

注意此处需要将创建时间以及更新时间两个属性定义好,前端界面添加面板中没有这两个属性。

java 复制代码
@Override
    public void add(Dept dept) {
        dept.setCreateTime(LocalDateTime.now());
        dept.setUpdateTime(LocalDateTime.now());
        deptMapper.insert(dept);
    }
Mapper层中的代码:
java 复制代码
@Insert("insert into dept(name,create_time,update_time) values(#{name},#{createTime},#{updateTime})")
    void insert(Dept dept);

4、修改部门:

Controller层中的代码:

注意修改部门涉及到两个操作,可以看到在前端界面中点击编辑后先是一个get请求,需要先进行一步根据id查询操作,相当于进行一个绑定操作,然后再进行put请求,进行修改操作。

java 复制代码
//TODO 修改部门:包含两部分,首先是一个查询get请求,然后将那条数据查询出来然后跟修改绑定到一起,这样id就会对应,后面的set方法也不用设置createTime属性。
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("获取部门id号:" + id);
        Dept dept = deptService.getById(id);
        return Result.success(dept);
    }
    @PutMapping
    public Result update(@RequestBody Dept dept){
        log.info("修改部门");
        deptService.update(dept);
        return Result.success();

    }
Service层中的代码:
java 复制代码
@Override
    public Dept getById(Integer id) {
        return deptMapper.getById(id);

    }
    @Override
    public void update(Dept dept) {
        dept.setUpdateTime(LocalDateTime.now());//此处已经和查询的数据联合起来了,所以不用对createtime进行设置,不会为null;
        deptMapper.update(dept);
Mapper层中的代码:
java 复制代码
@Select("select * from dept where id=#{id}")
    Dept getById(Integer id);
    @Update("update dept set name=#{name},create_time=#{createTime},update_time=#{updateTime} where id=#{id} ")
    void update(Dept dept);

三、员工管理

1、分页查询所有员工:

注意查询员工的时候分页查询,前端需要传递两个参数,然后服务端返回两个数据,但是同时返回两个并且还是不同类型的数据,此时可以用map也可以用一个实体类进行封装(PageBean类,包含两个属性一个是Integer类型的记录总数,另一个是集合类型的用于存储Emp实体类对象)。

最重要的是分析出来前端传入什么,服务端返回什么,此处前端传入的是哪一页以及一页最多有多少条数据。而服务端应该返回所有的数据个数以及这一页的数据。

使用分页插件:

条件分页查询(动态sql语句):

注意此处还要加上 and name!='',代表name不为空且不为空串的时候才加上这个name条件语句,因为通过前后端联调后发现如果什么都不写的话,name会是一个空串,并不是null。

Controller层中的代码:

使用@RequestParam设置默认值,

java 复制代码
 //TODO 条件分页查询(动态sql):其中也包含了查询所有员工
    @GetMapping
    public Result page(@RequestParam(defaultValue = "1")Integer page,//TODO 注意此处的参数名和前端传入的参数名相同就可以自动接收;
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern ="yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern ="yyyy-MM-dd") LocalDate end)//此处是设置默认值。利用@RequestParam注解;
    {
        log.info("条件分页查询,参数为:"+page+" "+pageSize+" "+name+" "+gender+" "+begin+" "+end);
        PageBean pageBean=empService.page(page,pageSize,name, gender,   begin,end);
        return Result.success(pageBean);
    }
Service层中的代码:
java 复制代码
//TODO 条件分页查询:
    @Override
    public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end){
        //1.设置分页参数:
        PageHelper.startPage(page,pageSize);
        //2.执行查询操作:
        List<Emp> emplist = empMapper.list(name, gender, begin,end);//注意此处调用了list方法其实自动封装成Page类型,所以emplist是Page类型的
        Page<Emp> p=(Page<Emp>)emplist;
        //3.封装为PageBean:
        PageBean pageBean=new PageBean(p.getTotal(),p.getResult());
        return pageBean;
    }
Mapper层中的代码:
java 复制代码
//TODO 条件分页查询:注意此处是动态sql,所以要用xml映射文件
    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
xml映射文件中的sql语句:
java 复制代码
 <select id="list" resultType="com.springboot_test.pojo.Emp">
        select * from emp
        <where>
            <if test="name!=null and name!=''">
                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>

2、批量删除操作:

Controller层中的代码:
java 复制代码
 //TODO 批量删除操作:
    @MyLog
    @DeleteMapping("/{ids}")
    public Result delete(@PathVariable List<Integer> ids){
        log.info("批量删除操作ids为"+ids);
        empService.delete(ids);
        return Result.success();
    }
Service层中的代码:
java 复制代码
//TODO 批量删除操作:
    public void delete(List<Integer> ids){
        empMapper.delete(ids);
    }
Mapper层中的代码:
java 复制代码
//TODO 批量删除操作:
    void delete(List<Integer> ids);//TODO 注意此处的参数名称ids要和xml配置文件中foreach中collection参数的值相同
xml映射文件中的SQL语句:
java 复制代码
 <delete id="delete">
        delete from emp where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

3、新增员工:

Controller层中的代码:
java 复制代码
//TODO 新增员工:
    @PostMapping
    public Result save(@RequestBody Emp emp){
        log.info("新增员工操作"+emp);
        empService.save(emp);
        return Result.success();
    }
Service层中的代码:
java 复制代码
//TODO 新增员工操作:
    public void save(Emp emp){
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.save(emp);
    }
Mapper层中的代码:
java 复制代码
//TODO 新增员工操作:
    @Insert("insert into emp(username, name, " +
            "gender, image,job, " +
            "entrydate, dept_id, create_time," +
            "update_time) values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void save(Emp emp);

4、修改员工信息:

注意,此处修改员工信息操作和前面修改部门信息操作类似,需要先进行查询然后将数据联合起来,相当于进行一步绑定操作,将此员工信息显示出来,然后再进行修改。

Controller层中的代码:
java 复制代码
//TODO 修改员工:
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){
        log.info("根据id查询员工信息,id为"+id);
        Emp emp1=empService.getById(id);
        return Result.success(emp1);

    }
    @PutMapping
    public Result update(@RequestBody Emp emp){
        empService.update(emp);
        return Result.success();
    }
Service层中的代码:
java 复制代码
//TODO 修改员工:先根据id查询到该员工:
    @Override
    public Emp getById(Integer id) {
        Emp emp1=empMapper.getById(id);
        return emp1;
    }
    public void update(Emp emp){
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
    }
Mapper层中的代码:
java 复制代码
//TODO 修改员工,先要根据id查询到此员工:
    @Select("select*from emp where id=#{id}")
    Emp getById(Integer id);

    void update(Emp emp);
xml映射文件中的SQL语句:
java 复制代码
<update id="update">
        update emp
        <set>
            <if test="username!=null">
                username=#{username},
            </if>
            <if test="password!=null">
                password=#{password},
            </if>
            <if test="name!=null and name!=''">
                name=#{name},
            </if>
            <if test="gender!=null">
            gender=#{gender},
            </if>
            <if test="image!=null and image!=''">
                image=#{image},
            </if>
            <if test="job!=null">
                job=#{job},
            </if>
            <if test="entrydate!=null">
                entrydate=#{entrydate},
            </if>
            <if test="deptId!=null">
                dept_id=#{deptId},
            </if>
            <if test="updateTime!=null">
                update_time=#{updateTime}
            </if>
        where id=#{id}
        </set>
    </update>

以上完成了部门管理以及员工管理操作。

相关推荐
程序员爱钓鱼9 分钟前
Go语言实战案例-开发一个Markdown转HTML工具
前端·后端·go
小小菜鸡ing25 分钟前
pymysql
java·服务器·数据库
getapi28 分钟前
shareId 的产生与传递链路
java
桦说编程38 分钟前
爆赞!完全认同!《软件设计的哲学》这本书深得我心
后端
thinktik1 小时前
还在手把手教AI写代码么? 让你的AWS Kiro AI IDE直接读飞书需求文档给你打工吧!
后端·serverless·aws
我没想到原来他们都是一堆坏人1 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民2 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
上官浩仁2 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存
小小工匠2 小时前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils