【JavaEE】SpringBoot框架——实现单表增删改查


不积跬步,无以至千里;不积小流,无以成江海。要沉下心来,诗和远方的路费真的很贵!

单表CRUD操作

以书籍表为例子,进行书籍的增删改查。数据库如下所示。

在这里插入图片描述

配置数据库驱动连接

  • pom.xml文件的<dependencies>标签中加入如下依赖。
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
  • 创建配置文件application.yml

在这里插入图片描述

  • 在配置文件中配置数据库驱动、端口号、路径等。
server:
  servlet:
    context-path: /springbootdemo   # 配置路径
  port: 8081  # 配置端口号
spring:
  datasource:
    username: root    # 数据库连接用户名
    password: 123456  # 数据库连接密码
    # 配置数据库    bookstore 是数据库名称
    url: jdbc:mysql://localhost:3306/bookstore?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
    # 配置JDBC驱动
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml    # 配置数据库操作文件
  type-aliases-package: com.hnucm.springbootdemo.model  # 配置数据来源

#showSql
logging:
  level:
    com:
      hnucm:
        springboot: debug

实现单表增删改查

传参:

  • 如果是json格式的,使用@RequestBody注释;
  • 如果是/格式的,使用@PathVariable(value = "")注释;
  • 如果是?格式的,使用@RequestParam(value = "")注释。

构建工程结构

  • 创建一个model文件夹,用于存放数据类。:下列创建方式都一样。

在这里插入图片描述

  • 创建一个dao文件夹,用于存放抽象接口。
  • 创建一个controller文件夹,用于存放控制器类。
  • 创建一个service文件夹,用于存放逻辑接口和具体实现。
  • 创建一个tools文件夹,用于存放错误信息提示和消息通知工具类。
  • resources文件夹中创建mapper文件夹,用于存放数据库操作文件。

在这里插入图片描述

  • 最终形成的工程结构如下图所示。

在这里插入图片描述

增加数据

  1. 根据数据库表的格式在model文件夹下创建数据类对象——Book
@Data
//采用注解,默认存在get和set方法
public class Book {
    
    
    //数据类型和名称尽量和数据库表中的一致
    private int bno;
    private String bname;
    private String bauth;
}
  1. dao文件夹下创建抽象接口,内部加入增加数据的方法。
@Mapper   //采用注解,表示其为抽象接口类
public interface BookMapper {
    
    
    //增加数据方法
    //传入的是整本书籍的数据
    int addBook(Book book);
}
  1. service文件夹下创建逻辑接口和具体实现类,利用dao层抽象接口实现具体功能。
//逻辑接口
public interface BookService {
    
    
    int addBook(Book book);
}
@Service   //利用注解证明其为具体实现类
public class BookServiceImpl implements BookService{
    
    
    //利用dao层抽象接口方法实现
    @Autowired
    BookMapper bookMapper;
    
    @Override
    public int addBook(Book book) {
    
    
        //实现功能
        return bookMapper.addBook(book);
    }
}
  1. 创建工具类,里面存储异常信息和通知消息。
package com.huncm.springbootdemo.tools;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据封装类
 */
public class Result extends HashMap<String, Object> {
    
    
    private static final long serialVersionUID = 1L;

    public Result() {
    
    
        put("code", 0);
        put("msg", "success");
    }

    public static Result error() {
    
    
        return error(500, "未知异常,请联系管理员");
    }

    public static Result error(String msg) {
    
    
        return error(500, msg);
    }

    public static Result error(int code, String msg) {
    
    
        Result r = new Result();
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }

    public static Result ok(String msg) {
    
    
        Result r = new Result();
        r.put("msg", msg);
        return r;
    }

    public static Result ok(Map<String, Object> map) {
    
    
        Result r = new Result();
        r.putAll(map);
        return r;
    }

    public static Result ok() {
    
    
        return new Result();
    }

    public Result put(String key, Object value) {
    
    
        super.put(key, value);
        return this;
    }
}
package com.huncm.springbootdemo.tools;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.sql.SQLException;

@ControllerAdvice
public class MyControllerAdvice {
    
    


    @ResponseBody
    @ExceptionHandler(value = SQLException.class)
    public Result sqlHandler(Exception ex) {
    
    
        return Result.error(501,ex.getMessage());
    }


    /**
     * 全局异常捕捉处理
     *
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Result errorHandler(Exception ex) {
    
    
        return Result.error(500,ex.getMessage());
    }

}
  1. controller文件夹下创建控制器类,进行接口的实现,利用工具类提示信息。
@RestController //控制器注解
@CrossOrigin  //跨域注解
public class BookController {
    
    
    @Autowired
    BookService bookService;

    @RequestMapping("addBook")
    public Result addBook(Book book) {
    
    
        //打印需要加入的书籍信息
        System.out.println(book);
        //利用服务层接口方法进行功能实现
        int result = bookService.addBook(book);
        //判断是否成功
        if(result > 0){
    
    
            return Result.ok("增加书籍成功");
        }
        return Result.error("增加书籍失败");
    }
}
  1. 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">
<mapper namespace="com.huncm.springbootdemo.dao.BookMapper">

    <!--  增加操作 使用insert
          id 数据接口方法名
          parameterType 是传入的数据类型
          中间是SQL语句进行数据库操作 -->
    <insert id="addBook" parameterType="com.huncm.springbootdemo.model.Book">
        insert into bookinfo(bname,bauth) values (#{bname},#{bauth});
    </insert>

</mapper>

删除数据

  1. dao层接口中加入删除数据的方法。
//删除数据方法  根据书籍编号删除
    int deleteBook(int bno);
  1. service层进行实现。service层的接口方法和dao层一致,不再复写。
@Override
    public int deleteBook(int bno) {
    
    
        return bookMapper.deleteBook(bno);
    }
  1. controller层调用实现。
@RequestMapping("deleteBook")
    public Result deleteBook(int bno) {
    
    
        //打印删除的书籍编号
        System.out.println(bno);
        //利用服务层接口方法进行功能实现
        int result = bookService.deleteBook(bno);
        //判断是否成功
        if(result > 0){
    
    
            return Result.ok("删除书籍成功");
        }
        return Result.error("删除书籍失败");
    }
  1. mapper层操作数据库。
<!--  删除操作 使用delete
         id 数据接口方法名
         parameterType 是传入的数据类型
         中间是SQL语句进行数据库操作 -->
    <delete id="deleteBook" parameterType="Integer">
        delete from bookinfo where bno = #{bno};
    </delete>

修改数据

  1. dao层接口中加入修改数据的方法。
//修改数据方法  根据书籍编号修改数据内容
    int updateBook(Book book);
  1. service层进行实现。
@Override
    public int updateBook(Book book) {
    
    
        return bookMapper.updateBook(book);
    }
  1. controller层调用实现。
@RequestMapping("updateBook")
    public Result updateBook(Book book) {
    
    
        //打印修改的书籍信息
        System.out.println(book);
        //利用服务层接口方法进行功能实现
        int result = bookService.updateBook(book);
        //判断是否成功
        if(result > 0){
    
    
            return Result.ok("修改书籍成功");
        }
        return Result.error("修改书籍失败");
    }
  1. mapper层操作数据库。
<!--  修改操作 使用update
         id 数据接口方法名
         parameterType 是传入的数据类型
         中间是SQL语句进行数据库操作 -->
    <update id="updateBook" parameterType="com.huncm.springbootdemo.model.Book">
        update bookinfo set bname = #{bname},bauth = #{bauth} where bno = #{bno};
    </update>

查询数据

  1. dao层接口中加入查询数据的方法。
//注:查询一条数据,Book和List<Book>都可以
    //注:查询多条数据,只能List<Book>
    //注:所以为了方便,统一使用List<Book>
    //查询数据方法  查询全部书籍
    List<Book> findAllBook();
    //查询数据方法  根据书籍编号进行查询
    List<Book> findBookById(int bno);
    //查询数据方法  根据书籍名称进行查询
    List<Book> findBookByName(String bname);
  1. service层进行实现。
@Override
    public List<Book> findAllBook() {
    
    
        return bookMapper.findAllBook();
    }

    @Override
    public List<Book> findBookById(int bno) {
    
    
        return bookMapper.findBookById(bno);
    }

    @Override
    public List<Book> findBookByName(String bname) {
    
    
        return bookMapper.findBookByName(bname);
    }
  1. controller层调用实现。
@RequestMapping("findAllBook")
    public Result findAllBook() {
    
    
        //返回json格式的数据,key构造为data
        return Result.ok().put("data",bookService.findAllBook());
    }

    @RequestMapping("findBookById")
    public Result findBookById(int bno) {
    
    
        //打印输入的书籍编号
        System.out.println(bno);
        return Result.ok().put("data",bookService.findBookById(bno));
    }

    @RequestMapping("findBookByName")
    public Result findBookByName(String bname) {
    
    
        //打印输入的书籍名称
        System.out.println(bname);
        return Result.ok().put("data",bookService.findBookByName(bname));
    }
  1. mapper层操作数据库。
<!--  查询操作 使用select
         id 数据接口方法名
         parameterType 是传入的数据类型
         resultType  是返回的数据类型
         中间是SQL语句进行数据库操作 -->
    <select id="findAllBook" resultType="com.huncm.springbootdemo.model.Book">
        select * from bookinfo;
    </select>

    <select id="findBookById" resultType="com.huncm.springbootdemo.model.Book">
        select * from bookinfo where bno = #{bno};
    </select>

    <select id="findBookByName" resultType="com.huncm.springbootdemo.model.Book">
        select * from bookinfo where bname = #{bname};
    </select>

测试接口

使用postwoman接口测试工具进行测试。如下图所示。

json格式的keyvalue外面的是双引号,前面使用自定义格式时,用单引号,总是报空。

在这里插入图片描述

测试增加数据接口

  • 选择请求类型,输入传递参数,输入请求接口网址,点击发送。

在这里插入图片描述

  • 查看数据库,验证是否真正成功。

在这里插入图片描述

验证数据库可知,该接口测试成功。

测试删除数据接口

  • 删除前数据库内容

在这里插入图片描述

  • 选择请求类型,输入传递参数,输入请求接口网址,点击发送。

在这里插入图片描述

  • 删除后数据库内容

在这里插入图片描述

对比可知,编号14的书籍删除成功,该接口测试成功。

测试修改数据接口

  • 修改前数据库内容

在这里插入图片描述

  • 选择请求类型,输入传递参数,输入请求接口网址,点击发送。

在这里插入图片描述

  • 修改后数据库内容

在这里插入图片描述

对比修改前后内容可知,编号15的记录确实已经修改,该接口测试成功。

测试查询数据接口

  1. 选择请求类型,输入请求接口网址,点击发送。

在这里插入图片描述

由上图可知,该接口测试成功。

  1. 选择请求类型,输入参数书籍编号,输入请求接口网址,点击发送。

在这里插入图片描述

  • 对比数据库,验证是否正确。

在这里插入图片描述

由上图可知,该接口测试成功。

  1. 选择请求类型,输入参数书籍名称,输入请求接口网址,点击发送。

在这里插入图片描述

  • 对比数据库,验证是否正确。

在这里插入图片描述

由上图可知,该接口测试成功。

猜你喜欢

转载自blog.csdn.net/qq_46546793/article/details/125036252