Springboot框架实现简单的CRUD(增删改查)

本文通过Springboot框架展示了如何实现数据表的增删改查功能,包括创建项目、生成DAO和Model、编写Service接口及实现、创建VO类以及编写Controller进行测试。重点讨论了VO的作用和使用,以及借助Lombok简化编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建项目

前面讲过如何在IDEA中创建springboot见我的博客创建一个springboot空项目,这里不再赘述。

创建数据表

一张表是用户信息表:test_db,如下图:
在这里插入图片描述
其中包含id,用户名,密码,学校id和性别这几个字段。
另一张表为是学校名字表:school_name,如下图:
在这里插入图片描述
其中id对应着test_db中的school_id,由此表可以查询得到学校的名称。

生成数据表dao和model

如何自动生成dao和model在我的上一篇博客:创建一个springboot空项目,这里不再赘述。生成后的项目结构如下:在这里插入图片描述

编写service层接口

import com.example.demo4.model.TestDb;

import java.util.List;

public interface IUserService {

    /**
     * 通过id精准查询
     * @param id
     * @return
     */
    Object read(Integer id);

    /**
     * 通过用户名查询出list
     * @param username
     * @return
     */
    Object list(String username);

    /**
     * 编辑testdb
     * @param testDb
     * @return
     */
    Object edit(TestDb testDb);

    /**
     * 通过ids列表删除
     * @param ids
     * @return
     */
    Object del(List<Integer> ids);

    /**
     * 新增一个testdb
     * @param testDb
     * @return
     */
    Object add(TestDb testDb);
}

编写VO(非必要)

首先介绍一下什么VO,为什么要写VO?
VO:value object 值对象 / view object 表现层对象。
1 .主要对应页面显示(web页面/swt、swing界面)的数据对象。
2 .可以和表对应,也可以不,这根据业务的需要
说得直白一点,就是把自己想显示的数据打包成一个been送个前端去,而不是一股脑的全返回给前端。
举个例子,在这个项目中,我想输入id之后返回的结果只有user_name和school_name,其他的属性如:性别,密码,id等等都用不着的就不需要了。

编写vo类:

package com.example.demo4.vo;

import lombok.Data;

@Data
public class TestDbVO {
    //基础字段
    private String username;
    private  Integer schoolId;
    //vo字段
    private String schoolName;
}

其中有几点值得注意的:

其一是testdb中有的字段,叫做基础字段,testdb中没有的属性(来自其他的数据表),这里是schoolname,则叫做vo字段,两者有何区别,在后面会演示。

其二是这里的属性名字和数据库的命名不同,java是采用的驼峰命名法,而数据库则是用下划线区分开,如数据库中school_name,在这里可以看到我写的是schoolName。但是在与数据库连接是时候是可以匹配的。

其三是我这里使用了一个@Data的标签,这并不是Springboot自带的标签,而是我在IDEA上下载安装了一个叫lombok的组件,然后添加他的依赖,他的作用是帮助我们自动生成get(),set(),和toString()方法,让我们编码速度更快,代码更加清爽,lombok的下载安装步骤和依赖见Lombok的使用详解与插件安装

编写接口实现类

新建一个 类去实现接口,在重写方法之前,编写两个工具方法:一个是单个的testdb类转换成vo,另一个是list<testdb>转化成vo的list集合:

package com.example.demo4.service.impl;

import com.example.demo4.dao.SchoolNameMapper;
import com.example.demo4.dao.TestDbMapper;
import com.example.demo4.model.SchoolName;
import com.example.demo4.model.SchoolNameExample;
import com.example.demo4.model.TestDb;
import com.example.demo4.service.IUserService;
import com.example.demo4.vo.TestDbVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class UserService implements IUserService {

    @Autowired
    private TestDbMapper dbMapper;
    @Autowired
    private SchoolNameMapper schoolNameMapper;
    @Override
    public Object read(Integer id) {
        return null;
    }

    @Override
    public Object list(String username) {
        return null;
    }

    @Override
    public Object edit(TestDb testDb) {
        return null;
    }

    @Override
    public Object del(List<Integer> ids) {
        return null;
    }

    @Override
    public Object add(TestDb testDb) {
        return null;
    }

    /**
     * 单个转成vo
     * @param testDb
     * @return
     */
    private TestDbVO testDBVO2vo(TestDb testDb) {
        TestDbVO vo = new TestDbVO();
        BeanUtils.copyProperties(testDb, vo);
        SchoolName schoolName = schoolNameMapper.selectByPrimaryKey(testDb.getSchoolId());
        vo.setSchoolName(schoolName.getSchoolName());
        return vo;
    }

    private List<TestDbVO> testDBVOS2vos(List<TestDb> models) {
        List<TestDbVO> vos = new LinkedList<>();
        List<Integer> testDbIds = new ArrayList<>();
//        testDbIds.add(-1);
        for (TestDb model : models) {
            testDbIds.add(model.getSchoolId());
            vos.add(testDBVO2vo(model));
        }
        Map<Integer, SchoolName> refMap = refTestDb(testDbIds);
        for (TestDbVO vo : vos) {
            vo.setSchoolName(refMap.get(vo.getSchoolId()).getSchoolName());
        }
        return vos;
    }

    /**
     * 查出一个schoolId:schoolName的键值对map
     * @param schoolIds
     * @return
     */
    private Map<Integer, SchoolName> refTestDb(List<Integer> schoolIds) {
        Map<Integer, SchoolName> refMap = new HashMap();
        if (schoolIds != null && schoolIds.size() != 0) {
            SchoolNameExample example = new SchoolNameExample();
            example.setDistinct(true);//应该是不可重复
            example.createCriteria().andIdIn(schoolIds);
            List<SchoolName> models = schoolNameMapper.selectByExample(example);
            for (SchoolName model : models) {
                refMap.put(model.getId(), model);
            }
        }
        return refMap;
    }
}

如上面testDBVO2vo()和testDBVOS2vos()两个方法。
其中会用到BeanUtils.copyProperties(testDb, vo)这个方法,将testDb中与vo相同的字段自动写入到vo中。

接下来开始重写接口定义的几个增删改查的方法:

package com.example.demo4.service.impl;

import com.example.demo4.constants.TestDBConstant;
import com.example.demo4.dao.SchoolNameMapper;
import com.example.demo4.dao.TestDbMapper;
import com.example.demo4.model.SchoolName;
import com.example.demo4.model.SchoolNameExample;
import com.example.demo4.model.TestDb;
import com.example.demo4.model.TestDbExample;
import com.example.demo4.service.IUserService;
import com.example.demo4.util.ArgumentUtil;
import com.example.demo4.util.ResponseUtil;
import com.example.demo4.vo.TestDbVO;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class UserService implements IUserService {

    @Autowired
    private TestDbMapper dbMapper;
    @Autowired
    private SchoolNameMapper schoolNameMapper;
    @Override
    public Object read(Integer id) {
        if (id == null) {
            return ResponseUtil.badArgument();
        }
        TestDb testDb = dbMapper.selectByPrimaryKey(id);
        if (testDb == null) {
            return ResponseUtil.fail(TestDBConstant.TestDB_NOT_EXIST_CODE,
                    TestDBConstant.TestDB_NOT_EXIST_ERROR);
        } else {
            return ResponseUtil.ok(testDBVO2vo(testDb));
        }
    }

    @Override
    public Object list(String username) {
        TestDbExample example = new TestDbExample();
        TestDbExample.Criteria criteria = example.createCriteria();
        if (username != null)
            criteria.andUsernameEqualTo(username);
        List<TestDb> list = dbMapper.selectByExample(example);
        long total = PageInfo.of(list).getTotal();//加入依赖
        return ResponseUtil.ok(total, testDBVOS2vos(list));
    }

    /**
     * id,name,pwd不能为空
     * @param testDb
     * @return
     */
    @Override
    public Object edit(TestDb testDb) {
        if (dbMapper.selectByPrimaryKey(testDb.getId()) != null
                && ArgumentUtil.notNull(testDb.getId(),testDb.getPassword(),testDb.getUsername())) {
            dbMapper.updateByPrimaryKey(testDb);
            return ResponseUtil.ok();
        } else
            return ResponseUtil.badArgument();
    }

    @Override
    public Object del(List<Integer> ids) {
        if (ids != null && ids.size() != 0) {
            TestDbExample example = new TestDbExample();
            TestDbExample.Criteria criteria = example.createCriteria();
            criteria.andIdIn(ids);
            dbMapper.deleteByExample(example);
            return ResponseUtil.ok();
        } else
            return ResponseUtil.badArgument();
    }

    @Override
    public Object add(TestDb testDb) {
        if (ArgumentUtil.notNull(testDb.getUsername(),testDb.getPassword(),testDb.getSchoolId(),testDb.getGender())){
            dbMapper.insert(testDb);
            return ResponseUtil.ok();
        }else 
            return ResponseUtil.badArgument();
    }

    /**
     * 单个转成vo
     * @param testDb
     * @return
     */
    private TestDbVO testDBVO2vo(TestDb testDb) {
        TestDbVO vo = new TestDbVO();
        BeanUtils.copyProperties(testDb, vo);
        SchoolName schoolName = schoolNameMapper.selectByPrimaryKey(testDb.getSchoolId());
        vo.setSchoolName(schoolName.getSchoolName());
        return vo;
    }

    private List<TestDbVO> testDBVOS2vos(List<TestDb> models) {
        List<TestDbVO> vos = new LinkedList<>();
        List<Integer> testDbIds = new ArrayList<>();
//        testDbIds.add(-1);
        for (TestDb model : models) {
            testDbIds.add(model.getSchoolId());
            vos.add(testDBVO2vo(model));
        }
        Map<Integer, SchoolName> refMap = refTestDb(testDbIds);
        for (TestDbVO vo : vos) {
            vo.setSchoolName(refMap.get(vo.getSchoolId()).getSchoolName());
        }
        return vos;
    }

    /**
     * 查出一个schoolId:schoolName的键值对map
     * @param schoolIds
     * @return
     */
    private Map<Integer, SchoolName> refTestDb(List<Integer> schoolIds) {
        Map<Integer, SchoolName> refMap = new HashMap();
        if (schoolIds != null && schoolIds.size() != 0) {
            SchoolNameExample example = new SchoolNameExample();
            example.setDistinct(true);//应该是不可重复
            example.createCriteria().andIdIn(schoolIds);
            List<SchoolName> models = schoolNameMapper.selectByExample(example);
            for (SchoolName model : models) {
                refMap.put(model.getId(), model);
            }
        }
        return refMap;
    }
}

其中有写工具类是自己写的,不用太在意。

编写Controller测试

package com.example.demo4.controller;

import com.example.demo4.model.TestDb;
import com.example.demo4.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/demo4")
public class TestController {

    @Autowired
    private IUserService userService;

    @PostMapping(value = "/add")
    public Object add(@RequestBody TestDb testDb) {
        return userService.add(testDb);
    }

    @GetMapping(value = "/del")
    public Object del(@RequestParam(name = "ids") List<Integer> ids) { return userService.del(ids); }

    @PostMapping(value = "/edit")
    public Object edit(@RequestBody TestDb testDb) {
        return userService.edit(testDb);
    }

    @PostMapping(value = "/selectByName")
    public Object list(@RequestParam(name = "name") String name) { return userService.list(name); }

    @GetMapping(value = "/selectById")
    public Object selectById(@RequestParam(name = "id") Integer id) {
        return userService.read(id);
    }
}

测试(时间关系,只测试查询功能):
在这里插入图片描述
反回前台的vo是我们希望得到的,成功!


如有不足请大家及时指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值