public interface UserMapper {
//查询
User selectOne(String userName);
User selectId(int userId);
//插入
int insert(User user);
//删除
int delete(int userId);
}
//------------------接口------------------------------
public interface UserService {
User findOne(String name);
User findId(Integer id);
void add(User user);
void drop(Integer id);
}
//-----------------实现类-----------------------------
@Service
public class UserServiceImp implements UserService{
@Autowired(required = false)
private UserMapper userMapper;
//通过用户名查找
@Override
public User findOne(String name) {
return userMapper.selectOne(name);
}
//通过id查询用胡
@Override
public User findId(Integer id) {
return userMapper.selectId(id);
}
//添加插入
@Override
public void add(User user) {
//可能是空数据引入插件
AccessUtil.isOK(StringUtils.isBlank(user.getUserName()),"用户名不能为空");
//判断用户id
AccessUtil.isOK(StringUtils.isBlank(user.getUserPwd()),"密码不能为空");
//查询是否重复
User users=findOne(user.getUserName());
AccessUtil.isOK(users!=null,"用户名不能重复");
//判断插入是否成共
AccessUtil.isOK(userMapper.insert(user)<1,"插入失败");
}
//删除
@Override
public void drop(Integer id) {
AccessUtil.isOK(id==null || findId(id)==null,"删除记录不存在~");
//判断是否删除成功
int num=userMapper.delete(id);
AccessUtil.isOK(num<1,"删除失败!");
}
}
⭐controller/UserController.java
@RestController
public class SpringTest {
@Autowired
private UserService userService;
@GetMapping("test")
public String test(){
return "is ok";
}
//查询
@GetMapping("select/{name}")
public User selectOne(@PathVariable("name") String name){
return userService.findOne(name);
}
//查询
@GetMapping("selectid/{userId}")
public User selectid(@PathVariable("userId") Integer userId){
return userService.findId(userId);
}
//插入
@GetMapping("insert")
public CheckMsg insert(User user){
CheckMsg cm=new CheckMsg();
//捕获异常
try{
userService.add(user);
cm.setCode(100);
cm.setMsg("插入成功");
}catch (CheckException ce){
cm.setCode(ce.getCode());
cm.setMsg(ce.getMsg());
}catch (Exception e){
cm.setMsg(e.getMessage());
}
return cm;
}
//删除
@RequestMapping("delete/{userId}")
public CheckMsg delete(@PathVariable("userId") int userId){
CheckMsg cm=new CheckMsg();
//捕获异常
try{
userService.drop(userId);
cm.setCode(100);
cm.setMsg("删除成功");
}catch (CheckException ce){
cm.setCode(ce.getCode());
cm.setMsg(ce.getMsg());
}catch (Exception e){
cm.setMsg(e.getMessage());
}
return cm;
}
@GetMapping("page")
public PageInfo pageSelect(PageQuery pq){
return userService.PageSelect(pq);
}
}
⭐resources/mappers/UserMapper.xml:
insert into user (userName,userPwd) values (#{userName},#{userPwd})
delete from user where userId=#{userId}
⭐以上便实现了简单的增删查改,还差一点~~~
②异常处理(自定义工具类)
引入依赖StringUtils 工具类
org.apache.commonscommons-lang3
⭐自定义异常类:exceptions/CheckException.java
public class CheckException extends RuntimeException{
private int code=101;
private String msg="发生异常》》》》";
//重载构造器,get和set方法自己不全~!!!
public CheckException() {
super("发生异常》》》》");
}
public CheckException(int code){
super("发生异常》》》》");
this.code=code;
}
public CheckException(String msg){
super(msg);
this.msg=msg;
}
public CheckException(String msg,int code){
super(msg);
this.msg=msg;
this.code=code;
}
}
⭐com.yjxxt.util/CheckMsg.java自定义状态码对象:
public class CheckMsg {
//状态码
private int code=100;
private String msg="插入成功";
//自动补全set 、get方法
}
⭐com.yjxxt.util/AccessUtil.java对异常的间接调用
public class AccessUtil {
//静态方法进行数据审核
public static void isOK(boolean bl,String msg){
if(bl){
throw new CheckException(msg);
}
}
}
③目标对象Bean和启动类Starter
Bean/User.java这里字段与数据库最好同步
public class User implements Serializable {
private String userName;
private Integer userId;
private String userPwd;
}
启动类:>>>>>
@SpringBootApplication
@MapperScan("com.yjxxt.mapper")//扫描mapper下内容
public class Starter {
public static void main(String[] args) {
SpringApplication.run(Starter.class,args);
}
}
public class PageQuery {
//第几页
private Integer pageNum;
//显示几条
private Integer pageTotle;
//查找的用户户名
private String userName;
//get set toString 构造器记得生成!!!此处略
}
⭐mapper/UserMapper.java
public interface UserMapper {
//分页查找
List pageQuery(PageQuery pg);
}
⭐service/UserService.java和UserServiceImp.java
public interface UserService {
PageInfo PageSelect(PageQuery pq);
}
//--------------------UserServiceImp.java------------
@Service
public class UserServiceImp implements UserService{
@Autowired(required = false)
private UserMapper userMapper;
//分页查找
@Override
public PageInfo PageSelect(PageQuery pq) {
//进行分页初始化分页规则
PageHelper.startPage(pq.getPageNum(),pq.getPageTotle());
List luser=userMapper.pageQuery(pq);
//进行分页
PageInfo pagelist=new PageInfo(luser);
System.out.println(pagelist.isHasNextPage());
System.out.println(pagelist.getPageNum());
System.out.println(pagelist.isHasPreviousPage());
return pagelist;
}
}
⭐controller/UserController.java
@RestController
public class SpringTest {
@Autowired
private UserService userService;
@GetMapping("page")
public PageInfo pageSelect(PageQuery pq){
return userService.PageSelect(pq);
}
}
mappers/UserMapper.java:Sql语言的编写
-- 如果没有输入userName参数,则查询全部数据
-- select * from user where userName like %{userName}%
select * from user
and userName like "%${userName}%"
②、Rest测试结果(使用PostMan)
pageNum:第几页,pageTotle:显示几条,userName:查询用户的名字
浏览器:
二、SpringBoot-API && 测试单元
1、API 文档构建工具 - Swagger2
由于 Spring Boot 能够快速开发、便捷部署等特性,通常在使用 Spring Boot 构建 Restful 接口应用时考虑到多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web 前端。对于不同的终端公用一套接口 API 时,对于联调测试的时候就需要知道后端提供的接口 API列表文档,对于服务端开发人员来说就需要编写接口文档,描述接口的调用地址、参数结果等,这里借助第三方构建工具 Swagger2 来实现 API 文档生成功能。