springboot+mybatis的CRUD:项目的搭建

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 = sqleg: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);
    }

}

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值