springboot+mybatis的CRUD:项目的搭建
1、创建项目,就不讲了
2、引入mybatis
百度maven第一个结果,或者直接进入传送门,进去之后搜索"MyBatis Spring Boot Starter",复制到项目的pom文件里
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
等待依赖下载成功
3、试试Mysql是否能连接成功
第一次链接可能会让你下载驱动,那就跟着提示下载就好了
用户名密码没错的话就会展示成功
4、创建数据库表
CREATE TABLE `m_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(64) DEFAULT NULL,
`avatar` varchar(255) DEFAULT NULL,
`email` varchar(64) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL,
`status` int(5) NOT NULL,
`created` datetime DEFAULT NULL,
`last_login` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `UK_USERNAME` (`username`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `m_blog` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`title` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
`content` longtext,
`created` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,
`status` tinyint(4) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;
INSERT INTO `vueblog`.`m_user` (`id`, `username`, `avatar`, `email`, `password`, `status`, `created`, `last_login`) VALUES ('1', 'markerhub', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', NULL, '96e79218965eb72c92a549dd5a330112', '0', '2020-04-20 10:44:01', NULL);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (1, 1, '文章一', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-17 17:36:11', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (2, 1, '文章一2', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-17 17:36:11', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (3, 2, '文章一3', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (4, 3, '文章一4', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (5, 2, '文章一5', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (6, 4, '文章一6', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (7, 4, '文章一7', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 11:38:56', 0);
INSERT INTO m_blog (id, user_id, title, description, content, created, status) VALUES (8, 5, '文章一8', '第一篇文章', '第一篇文章第一篇文章第一篇文章', '2021-06-18 13:49:04', 0);
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (1, 'markerhub', 'https://image-1300566513.cos.ap-guangzhou.myqcloud.com/upload/images/5a9f48118166308daba8b6da7e466aab.jpg', 'zhangxi@qq.com', '96e79218965eb72c92a549dd5a330112', 0, '2021-06-02 17:52:01', null);
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (2, '张liu', 'new', 'zhangliu@qq.com', '123456', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (3, '王wu', 'old', 'wangwu@qq.com', '2222222', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (4, 'si', 'sisi', 'sisisi', 'sisisisi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (5, 'wu', 'wuwu', 'wuwuwu', 'wuwuwuwuwu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (6, 'liu', 'liuliu', 'liuliuliu', 'liuliuliuliu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (7, 'qi', 'qiqi', 'qiqiqi', 'qiqiqiqi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (8, 'ba', 'baba', 'bababa', 'babababa', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (9, 'jiu', 'jiujiu', 'jiujiujiu', 'jiujiujiujiu', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (10, 'shi', 'shishi', 'shishishi', 'shishishishi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (11, 'shiyi', 'shiyiyi', 'shiyiyiyi', 'shiyiyiyiyi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (12, 'shier', 'shierer', 'shiererer', 'shierererer', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (13, 'shisan', 'shisansan', 'shisansansan', 'shisansansansan', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
INSERT INTO m_user (id, username, avatar, email, password, status, created, last_login) VALUES (14, 'shisi', 'shisisi', 'shisisisi', 'shisisisisi', 0, '2021-06-02 17:52:01', '2021-06-02 17:52:01');
5、配置文件的使用
我们发现在项目的resource文件夹下面已经有一个application.properties文件了
删掉,然后再自己新建yaml文件,下面四个文件从上到下,分别对应着主配置、开发环境配置、生产环境配置、测试环境配置。可以不建这么多,用哪个建哪个
application.yaml是主配置文件,放一些项目通用的配
application-dev.yaml 放的是平常开发的一些配置,比如说数据库的连接地址、帐号密码等,
application-prod.yaml 放的是生产环境的一些配置,比如说数据库的连接地址、帐号密码等,
当然也可以再多一个application-test.yaml ,放一些测试环境需要用到的参数。
怎么确定项目使用那个配置文件呢
在主配置文件中使用如下配置来确定自己的项目调用哪个环境
spring:
profiles:
active: test
6、配置文件中配置数据
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库连接地址:3306/要连接的库?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: 用户名
password: 密码
server:
port: 8083
mybatis:
mapper-locations: classpath*:/mapper/**Mapper.xml
type-aliases-package: com.newcrud.entity
spring:datasource
配置的数据库连接信息
server:port
配置的是我们项目从哪个端口启动
mybatis
mapper-locations:对应的是我们之后在哪里写mapper.xml文件,请跳转到第10小段
type-aliases-package:就是我们编写的mapper.xml中的实体类的位置,请跳转到下一小节,也就是第7节
7、新建entity层
package com.newcrud.entity;
import lombok.Data;
@Data
public class Blog {
private Integer id;
private Integer user_id;
private String title;
private String description;
private String content;
private String created;
private Integer status;
}
package com.newcrud.entity;
import lombok.Data;
@Data
public class User {
private Integer id;
private String username;
private String avatar;
private String email;
private String password;
private Integer status;
private String created;
private String last_login;
}
为什么entity层使用Integer而不是int
int的默认值为0,而Integer默认值为null。
数据库中数据存在为空的情况。
返回数据库字段值是null的话,int类型会报错。
int是基本数据类型,其声明的是变量,而null则是对象。
所以用integer。
8、新建service层
package com.newcrud.service;
import com.newcrud.entity.Blog;
import java.util.List;
public interface BlogService {
List<Blog> getBlogs();
List<Blog> getBlogByUserId(Integer userid);
boolean insertBlog(Blog blog);
boolean updateBlog(Blog blog);
boolean deleteBlogById(Integer id);
}
package com.newcrud.service;
import com.newcrud.entity.User;
import java.util.List;
public interface UserService {
User getUserById(Integer id);
List<User> getAllUser();
boolean insertUser(User user);
boolean deleteUserById(Integer id);
boolean updateUser(User user);
User getJmeterUser(Integer id,String username);
User getUserByUserName(String username);
Integer getUserIdByUserName(String username);
}
9、新建mapper层
package com.newcrud.mapper;
import com.newcrud.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 这里有两种方法,一种是像我们一样使用@Mapper,一种是在CrudApplication上面新增了@MapperScan备注。直接扫描了整个包
* https://www.cnblogs.com/JackpotHan/p/10286496.html
* 不过不知道为啥,不加上这个好像是不行,没办法auto,稍微有那么点尴尬
* **/
@Mapper
public interface UserMapper {
List<User> getUsers();
List<User> getUsersPage();
User getUserById(Integer id);
boolean insertUser(User user);
boolean deleteUserById(Integer id);
boolean updateUser(User user);
User getUSerJmeter(Integer id,String username);
User getUserByUserName(String username);
Integer getUSerIdByUserName(String username);
}
package com.newcrud.mapper;
import com.newcrud.entity.Blog;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface BlogMapper {
List<Blog> getBlogs();
List<Blog> getBlogByUserId(Integer id);
boolean updateBlog(Blog blog);
boolean deleteBlogById(Integer id);
boolean insertBlog(Blog blog);
}
这里看起来是不是和service层看起来是一样的,但其实这里的方法名对应的是未来我们要编写的Mapper.xml文件对应的,而不是和service层的interface对应的
10、编写Mapper.xml
resource下新建mapper文件夹,文件夹下新建
UserMapper.xml
BlogMapper.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">
<!--这里一定要把namespace写全了,要不然会找不到对应的UserMapper里的每一个方法-->
<mapper namespace="com.newcrud.mapper.BlogMapper">
<resultMap id="blog" type="Blog">
<id column="id" property="id" javaType="Integer"></id>
<result column="user_id" property="user_id" javaType="Integer"></result>
<result column="title" property="title" javaType="String"></result>
<result column="description" property="description" javaType="String"></result>
<result column="content" property="content" javaType="String"></result>
<result column="created" property="created" javaType="String"></result>
<result column="status" property="status" javaType="Integer"></result>
</resultMap>
<select id="getBlogs" resultMap="blog" resultType="Blog">
select * from m_blog
</select>
<select id="getBlogByUserId" resultType="Blog" resultMap="blog" parameterType="Integer">
select * from m_blog
<where>
<trim suffixOverrides="and" prefixOverrides="and">
and user_id = #{user_id}
</trim>
</where>
</select>
<update id="updateBlog" parameterType="Blog">
update m_user set user_id=#{user_id},
title = #{title},
description=#{description},
content = #{content},
created = #{created},
status = #{status}
where id =#{id}
</update>
<delete id="deleteBlogById" parameterType="Integer">
delete m_user where id =#{id}
</delete>
<insert id="insertBlog" parameterType="User">
insert into m_user values (${id},#{user_id},#{title},#{description},#{content},#{created},#{status})
</insert>
</mapper>
<?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">
<!--这里一定要把namespace写全了,要不然会找不到对应的UserMapper里的每一个方法-->
<mapper namespace="com.newcrud.mapper.UserMapper">
<!--我们一般将这个xml对应的实体类的所有字段抽出来放在这里,将它做为一个模板,称之为resultMap,比如我们select * 那查出来的都是这个对应的实体类对不对
type="User",代表使用哪种类作为其映射的类,可以是别名或者全限定名-->
<resultMap id="user" type="User">
<!--在自定义的resultMap中第一列通常是主键id,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用,尤其是应用到缓存和内嵌的结果映射;
property:映射数据库列的字段或属性,如果JavaBean的属性与给定的名称匹配,就会使用匹配的名字;
column:数据库的列名或者列标签别名-->
<id column="id" property="id" javaType="Integer"></id>
<result column="username" property="username" javaType="String"></result>
<result column="avatar" property="avatar" javaType="String"></result>
<result column="email" property="email" javaType="String"></result>
<result column="password" property="password" javaType="String"></result>
<result column="status" property="status" javaType="Integer"></result>
<result column="created" property="created" javaType="String"></result>
<result column="last_login" property="last_login" javaType="String"></result>
</resultMap>
<!--查询所有用户-->
<!--select 对应的是数据库的方法(增删改查),id="getUsers"对应的mapper层对应接口的定义的方法,resultType="User" 对应的是entity层的实体类-->
<select id="getUsers" resultType="User">
<!--这里放的就是查询语句-->
select * from m_user
</select>
<!--根据ID查询用户-->
<!--这里的resultMap就是上面定义的那个resultMap,resultType="User",代表使用哪种类作为其映射的类,parameterType="Integer",参数的类型-->
<select id="getUserById" resultMap="user" resultType="User" parameterType="Integer">
select * from m_user
<trim prefixOverrides="and" suffixOverrides="and">
<where>
and id = #{id}
</where>
</trim>
</select>
<select id="getUSerJmeter" resultType="User" resultMap="user">
select * from m_user
<trim suffixOverrides="and" prefixOverrides="and">
<where>
and id=#{id} and
username=#{username}
</where>
</trim>
</select>
<select id="getUserByUserName" parameterType="String" resultMap="user" resultType="User">
select * from m_user
<trim prefixOverrides="and" suffixOverrides="and">
<where>
and username=#{username}
</where>
</trim>
</select>
<!--更新用户-->
<update id="updateUser" parameterType="User">
update m_user set username=#{username},
avatar=#{avatar},
email=#{email},
password=#{password},
status=#{status},
created=#{created},
last_login=#{last_login}
where id=#{id}a
</update>
<!--新增用户-->
<insert id="insertUser" parameterType="User">
insert into m_user
values (${id},#{username},#{avatar},#{email},#{password},#{status},#{created},#{last_login});
</insert>
<!--删除用户-->
<delete id="deleteUserById" parameterType="Integer">
delete from m_user where id=#{id}
</delete>
<select id="getUSerIdByUserName" parameterType="String" resultType="Integer">
select id from m_user where username=#{username}
</select>
</mapper>
$和#号的区别
虽说我们的文件都只写了#号,但是也有的地方写$号。
1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id =‘1’.
2 是 将 传 入 的 数 据 直 接 显 示 生 成 s q l 语 句 , e g : s e l e c t i d , n a m e , a g e f r o m s t u d e n t w h e r e i d = 是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id = 是将传入的数据直接显示生成sql语句,eg:selectid,name,agefromstudentwhereid={id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1.
3 使用#可以很大程度上防止sql注入。(语句的拼接)
4 但是如果使用在order by 中就需要使用 $.
trim suffixOverrides=“and” prefixOverrides=“and”
上面的文件中有一段是比较特殊的语句再这里
<select id="getUSerJmeter" resultType="User" resultMap="user">
select * from m_user
<trim suffixOverrides="and" prefixOverrides="and">
<where>
and id=#{id} and
username=#{username}
</where>
</trim>
</select>
prefix:在trim标签内sql语句加上前缀。
prefixOverrides:指定去除多余的前缀内容 如:prefixOverrides = “and”,去除trim标签内sql语句多余的前缀"and"。
suffix:在trim标签内sql语句加上后缀。
suffixOverrides:指定去除多余的后缀内容,如:suffixOverrides=",",去除trim标签内sql语句多余的后缀","。
我们的这个例子不够明显,我抄来了一份更明显的
<update id="update" parameterType="Object">
update student set
<trim suffixOverrides="," >
<if test="name != null ">
name=#{name},
</if>
<if test="hobby != null ">
hobby=#{hobby},
</if>
</trim> where id=#{id}
</update>
如果没有写suffixOverrides=","执行的语句就会变成
update student set name= ? ,hobby=? , , where id = ?
这样的SQL语句就会报错了,加上suffixOverrides=","
update student set name= ?,hobby=?, where id = ?
11、service层的impl实现类的编写
service下新建impl文件夹
package com.newcrud.service.impl;
import com.newcrud.entity.Blog;
import com.newcrud.mapper.BlogMapper;
import com.newcrud.service.BlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
//实现service层的对应接口
public class BlogServiceImpl implements BlogService {
//引入对应的mapper层,因为其实在mapper层完成了xml文件的编写的时候,对应的接口已经实现了其增删改查的功能。
@Autowired
BlogMapper blogMapper;
@Override
public List<Blog> getBlogs() {
return blogMapper.getBlogs();
}
@Override
public List<Blog> getBlogByUserId(Integer userid) {
return blogMapper.getBlogByUserId(userid);
}
@Override
public boolean insertBlog(Blog blog) {
return blogMapper.insertBlog(blog);
}
@Override
public boolean updateBlog(Blog blog) {
return blogMapper.updateBlog(blog);
}
@Override
public boolean deleteBlogById(Integer id) {
return blogMapper.deleteBlogById(id);
}
}
package com.newcrud.service.impl;
import com.newcrud.entity.User;
import com.newcrud.mapper.UserMapper;
import com.newcrud.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User getUserById(Integer id) {
return userMapper.getUserById(id);
}
@Override
public List<User> getAllUser() {
return userMapper.getUsers();
}
@Override
public Integer getUserIdByUserName(String username) {
return userMapper.getUSerIdByUserName(username);
}
@Override
public boolean insertUser(User user) {
return userMapper.insertUser(user);
}
@Override
public boolean deleteUserById(Integer id) {
return userMapper.deleteUserById(id);
}
@Override
public boolean updateUser(User user) {
return userMapper.updateUser(user);
}
@Override
public User getJmeterUser(Integer id,String username){
return userMapper.getUSerJmeter(id,username);
}
@Override
public User getUserByUserName(String username){
return userMapper.getUserByUserName(username);
}
}
是不是感觉service层的接口有些累赘?
当项目的业务逻辑简单时,可选择service层=service类;
当项目的业务复杂时,可选择service层=service接口+serviceImpl实现类;
而且接口本来就有解藕的功能。
12、编写入参类和出参类
开发在编写controller的时候,很喜欢一个页面传进来什么参数,就将这些参数封装成一个类。
然后我们再观察出参的参数,发现很多地方都是共同的,比如这里的code,message,totalRow,只有result里的内容是真正的数据,所以我们一般也将这些封装出来
新建outInParam文件夹
入参类
比如说我们通过id查询用户
package com.newcrud.outInParam;
import lombok.Data;
@Data
public class RequestParamOne {
private Integer id;
}
出参类
package com.newcrud.outInParam;
import lombok.Data;
import java.io.Serializable;
@Data
public class Result implements Serializable {
private String code;
private String msg;
private Object data;
public static Result succ(Object object){
Result result=new Result();
result.setCode("200");
result.setMsg("ok");
result.setData(object);
return result;
}
public static Result fail(Object object){
Result result=new Result();
result.setData(object);
result.setCode("100");
result.setMsg("fail");
return result;
}
}
13、controller层的编写
package com.newcrud.controller;
import com.newcrud.entity.Blog;
import com.newcrud.service.impl.BlogServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/crud")
@CrossOrigin
public class BlogController {
@Autowired
private BlogServiceImpl blogServiceImpl;
@RequestMapping(value = "/getById",method = RequestMethod.POST)
public List<Blog> getBlogById(@RequestParam(value = "id") Integer id){
return blogServiceImpl.getBlogByUserId(id);
}
@GetMapping("/blogs")
public List<Blog> getAll(){
return blogServiceImpl.getBlogs();
}
}
package com.newcrud.controller;
import com.newcrud.entity.User;
import com.newcrud.outInParam.RequestParamOne;
import com.newcrud.outInParam.Result;
import com.newcrud.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/crud")
@CrossOrigin
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("/user/{id}")
public Result geyUserById(@PathVariable("id") Integer id){
return Result.succ(userService.getUserById(id));
}
@RequestMapping(value = "userone",method = RequestMethod.POST)
public User getUserByIdPost(@RequestBody RequestParamOne requestParamOne){
return userService.getUserById(requestParamOne.getId());
}
@RequestMapping(value = "/username",method = RequestMethod.POST)
public User getUserByUserName(@RequestParam(value = "username") String username){
return userService.getUserByUserName(username);
}
@RequestMapping(value = "/users",method = RequestMethod.POST)
public Result getUser(){
// return userService.getAllUser();
return Result.succ(userService.getAllUser());
}
}
@CrossOrigin
这个是用来做跨域请求的,暂时还用不到,可以不加
@PathVariable
如下图,就是说从路径里获取参数
@RequestBody
我的理解,就是如果你要传进来的是一个json还对应了一个自己编写的实体类,那就用@RequestBody
@RequestParam
我的理解就是你要使用form-data你就用@RequestParam
14、如果查询为null,就是数据库里没有这个结果,想返回msg为"查询失败"
第一种蠢办法
就脑子一热,这么实现了一下,但是后来一想,不对劲,因为我们写死了失败的原因,没有做到定制化
package com.newcrud.outInParam;
import lombok.Data;
import java.io.Serializable;
@Data
public class Result implements Serializable {
private String code;
private String msg;
private Object data;
public static Result succ(Object object){
Result result=new Result();
result.setCode("200");
result.setMsg("ok");
result.setData(object);
return result;
}
public static Result fail(Object object){
Result result=new Result();
result.setData(object);
result.setCode("100");
//首先修改Result的msg为查询失败,为什么说这种方法不对,就是因为一旦这么写,就会造成所有的查询失败都会使用这个msg,没有做到定制化
result.setMsg("查询失败");
return result;
}
}
package com.newcrud.controller;
import com.newcrud.entity.User;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.RequestParamOne;
import com.newcrud.outInParam.Result;
import com.newcrud.service.impl.UserServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/crud")
@CrossOrigin
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("/user/{id}")
public Result geyUserById(@PathVariable("id") Integer id){
return Result.succ(userService.getUserById(id));
}
@RequestMapping(value = "userone",method = RequestMethod.POST)
public Result getUserByIdPost(@RequestBody RequestParamOne requestParamOne){
User user = userService.getUserById(requestParamOne.getId());
log.info("查询结果为:",user);
if (user == null){
//判断一下查询用户的结果,如果查询的结果为空,那就报失败
return Result.fail(null);
}else {
return Result.succ(user);
}
}
@RequestMapping(value = "/username",method = RequestMethod.POST)
public User getUserByUserName(@RequestParam(value = "username") String username){
return userService.getUserByUserName(username);
}
@RequestMapping(value = "/users",method = RequestMethod.POST)
public Result getUser(){
// return userService.getAllUser();
return Result.succ(userService.getAllUser());
}
//新增controler层方法,只需要传入PageRequest的类型对象就行
@RequestMapping(value = "/page",method = RequestMethod.POST)
public Object findPage(@RequestBody PageRequest pageRequest){
return userService.getAllUserPage(pageRequest);
}
}
第二种,定制化失败信息
package com.newcrud.outInParam;
import lombok.Data;
import java.io.Serializable;
@Data
public class Result implements Serializable {
private String code;
private String msg;
private Object data;
public static Result succ(Object object){
Result result=new Result();
result.setCode("200");
result.setMsg("ok");
result.setData(object);
return result;
}
public static Result fail(Object object,String string){
Result result=new Result();
result.setData(object);
result.setCode("100");
//我们这次不将msg写死了,而是通过入参来填写,当然succ静态方法也可以这么写
result.setMsg(string);
return result;
}
}
package com.newcrud.controller;
import com.newcrud.entity.User;
import com.newcrud.outInParam.PageRequest;
import com.newcrud.outInParam.RequestParamOne;
import com.newcrud.outInParam.Result;
import com.newcrud.service.impl.UserServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/crud")
@CrossOrigin
public class UserController {
@Autowired
private UserServiceImpl userService;
@GetMapping("/user/{id}")
public Result geyUserById(@PathVariable("id") Integer id){
return Result.succ(userService.getUserById(id));
}
@RequestMapping(value = "userone",method = RequestMethod.POST)
public Result getUserByIdPost(@RequestBody RequestParamOne requestParamOne){
User user = userService.getUserById(requestParamOne.getId());
log.info("查询结果为:",user);
if (user == null){
//判断一下查询用户的结果,如果查询的结果为空,那就报失败,报错信息为我们手动填写,更自由
return Result.fail(null,"新的报错:查询结果为空");
}else {
return Result.succ(user);
}
}
@RequestMapping(value = "/username",method = RequestMethod.POST)
public User getUserByUserName(@RequestParam(value = "username") String username){
return userService.getUserByUserName(username);
}
@RequestMapping(value = "/users",method = RequestMethod.POST)
public Result getUser(){
// return userService.getAllUser();
return Result.succ(userService.getAllUser());
}
//新增controler层方法,只需要传入PageRequest的类型对象就行
@RequestMapping(value = "/page",method = RequestMethod.POST)
public Object findPage(@RequestBody PageRequest pageRequest){
return userService.getAllUserPage(pageRequest);
}
}