Sprngboot框架实现简单的增删改查
创建项目
前面讲过如何在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是我们希望得到的,成功!
如有不足请大家及时指正!