使用 Spring Boot 搭建一套 CRUD

1,431 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

在开始代码之前还是要说明一下,Spring Boot 的搭建环境没有问题了才能继续向下走,搭建环境有问题的,可以看看这篇文章

准备数据库环境 - 建表

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `age` int(2) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

项目目录结构

图片

编辑配置文件 application.properties 、pom.xml

编辑 application.properties 文件

## 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_test?useUnicode=true&characterEncoding=utf8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

## Mybatis 配置
# 配置为 com.kris.entry 指向实体类包路径。
mybatis.typeAliasesPackage=com.kris.entry

编辑 pom.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.kris</groupId>
    <artifactId>demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
          <!-- 这个 mybatis 的版本不能太低,否则有问题,无法导入相关注解 -->
        <mybatis-spring-boot>1.3.2</mybatis-spring-boot>
        <mysql-connector>5.1.39</mysql-connector>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

编写实体类

package com.kris.entry;

public class User {
    private Integer id;
    private String name;
    private Integer age;
... getter and setter
}

编写 DAO 接口

package com.kris.dao;

import com.kris.entry.User;
import org.apache.ibatis.annotations.*;
@Mapper
public interface UserDao {

    @Insert("insert into t_user(id,name,age) values (#{id},#{name},#{age})")
    boolean add(User user);

    @Delete("delete from t_user where id = #{id} ")
    boolean delete(Integer id);

    @Update("update t_user set name = #{name},age = #{age} where id = #{id} ")
    boolean update(User user);

    @Select("select * from t_user where id = #{id}")
    User select(Integer id);
}

@Mapper 的作用:实话说,都说有作用,但是我测试了一波,去掉这个也没有问题。原因后面说。

@Insert @Delete @Update @Select 对应数据库的增删改查操作。

另外,在绑定参数的过程中,因为只有一个参数,所以可以自动绑定,若是有多个参数,那就需要@Param("XXX") 与 SQL 语句中的参数绑定了。例如:

@Update("update t_user set name = #{name},age = #{age} where id = #{id} ")
boolean update(@Param("name")String name,@Param("age")Integer age,@Param("id")Integer id);

编写 Service 接口以及 Service 实现

这个模块和之前的 SSM 项目没有区别,当前就这个 Demo 来说,也可以不写这个层。

package com.kris.service;

import com.kris.entry.User;

public interface UserService {
    boolean add(User user);
    boolean delete(Integer id);
    boolean update(User user);
    User select(Integer id);
}
package com.kris.service.impl;

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    UserDao userDao;

    @Override
    public boolean add(User user) {
        return userDao.add(user);
    }

    @Override
    public boolean delete(Integer id) {
        return userDao.delete(id);
    }

    @Override
    public boolean update(User user) {
        return userDao.update(user);
    }

    @Override
    public User select(Integer id) {
        return userDao.select(id);
    }
}

编写 Controller 层

package com.kris.controller;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping(value = "/add",method = RequestMethod.POST)
    public boolean addUser(User user){
        return userService.add(user);
    }

    @RequestMapping(value = "/delete",method = RequestMethod.DELETE)
    public boolean deleteUser(Integer id){
        return userService.delete(id);
    }

    @RequestMapping(value = "/update",method = RequestMethod.PUT)
    public boolean updateUser(User user){
        return userService.update(user);
    }

    @RequestMapping(value = "/select",method = RequestMethod.GET)
    public User selectUser(Integer id){
        return userService.select(id);
    }
}

@RestController 这个注解等于 @Controller + @ResponseBody 访问结果以 JSON 格式返回,其它的都是以前的知识。

运行项目

package com.kris;

@SpringBootApplication
@MapperScan("com.kris.dao")
public class Demo2Application {

    public static void main(String[] args) {
        SpringApplication.run(Demo2Application.class, args);
    }
}

SpringBootApplication:开启组件扫描和自动配置。

到这里知道了为什么会有 @Mapper 这个注解了,在之前我们想要实现 Dao 层的实现,我们使用 Mapper 动态代理开发机制,但是外在表现就是在 DAO 接口上添加 @Mapper 即可。但是这样我们需要为每一个 Dao 文件添加注解,太麻烦,现在为了方便,简化操作我们可以直接使用 @MapperScan 进行扫描即可。另外,@MapperScan 这个注解还可以同时扫描多个文件,中间用逗号隔开。我们可以这样写

@MapperScan("com.kris.dao","com.yu.mapper")

测试

测试这里我使用的 Postman ,当然你也可以使用 Restlet 。呃呃,测试就自己来吧,我就不截图了。实在不行,你就用浏览器直接访问啊,但是注意请求的形式呦。

最后,这篇文章的代码较多,照着这个来是没有问题的,或许看起来很简单,但是还是建议实践一下,切勿眼高手低。