SpringBoot项目CRUD实践

使用SpringBoot做的一个CRUD的手脚架,并且提供了数据库密码的加密功能。

项目准备

  1. 进入“https://start.spring.io/”构建SpringBoot项目;
  2. 选择“Web”、“MySQL”、“Mybatis”模块;
  3. 导入项目到idea;

配置数据库

  1. 新建数据库;

    1
    2
    
    create database test;
    use test;
    
  2. 新建表

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    -- create table `account`
    DROP TABLE `account`;
    CREATE TABLE `account` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) NOT NULL,
      `money` double DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
    INSERT INTO `account` VALUES ('1', 'aaa', '1000');
    INSERT INTO `account` VALUES ('2', 'bbb', '1000');
    INSERT INTO `account` VALUES ('3', 'ccc', '1000');
    

配置数据库连接

application.properties文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
# ENC() 是数据库加密函数
spring.datasource.username=ENC(YMoG7LZvcKq3DbW3dc9Ltg==)
spring.datasource.password=ENC(RgqVyviuib6ScIcgcQr9SA==)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# jasypt加密的盐值
jasypt.encryptor.password=erp
# 开启debug
debug=true
# 控制台打印SQL
logging.level.top.dengwq.springboot_crud.mapper=debug

Entity

1
2
3
4
5
6
7
8
@Data
@ToString
@EqualsAndHashCode
public class Account {
    private int id ;
    private String name ;
    private double money;
}

Mapper

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Mapper
public interface AccountMapper {
    @Insert("insert into account(name, money) values(#{name}, #{money})")
    int add(@Param("name") String name, @Param("money") double money);

    @Update("update account set name = #{name}, money = #{money} where id = #{id}")
    int update(@Param("name") String name, @Param("money") double money, @Param("id") int  id);

    @Delete("delete from account where id = #{id}")
    int delete(int id);

    @Select("select id, name as name, money as money from account where id = #{id}")
    Account findAccount(@Param("id") int id);

    @Select("select id, name as name, money as money from account")
    List<Account> findAccountList();
}

Service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class AccountService {
    @Autowired
    private AccountMapper accountMapper;

    public int add(String name, double money) {
        return accountMapper.add(name, money);
    }
    public int update(String name, double money, int id) {
        return accountMapper.update(name, money, id);
    }
    public int delete(int id) {
        return accountMapper.delete(id);
    }
    public Account findAccount(int id) {
        return accountMapper.findAccount(id);
    }
    public List<Account> findAccountList() {
        return accountMapper.findAccountList();
    }
}

Controller

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
@RestController
@RequestMapping("/account")
public class AccountController {
    @Autowired
    AccountService accountService;

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public List<Account> getAccounts() {
        return accountService.findAccountList();
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Account getAccountById(@PathVariable("id") int id) {
        return accountService.findAccount(id);
    }

    @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
    public String updateAccount(@PathVariable("id") int id, @RequestParam(value = "name", required = true) String name,
                                @RequestParam(value = "money", required = true) double money) {
        int t= accountService.update(name,money,id);
        if(t==1) {
            return "success";
        }else {
            return "fail";
        }

    }

    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable(value = "id")int id) {
        int t= accountService.delete(id);
        if(t==1) {
            return "success";
        }else {
            return "fail";
        }

    }

    @RequestMapping(value = "", method = RequestMethod.POST)
    public String postAccount(@RequestParam(value = "name") String name,
                              @RequestParam(value = "money") double money) {

        int t= accountService.add(name,money);
        if(t==1) {
            return "success";
        }else {
            return "fail";
        }

    }
}

加密组件

  1. 依赖

    1
    2
    3
    4
    5
    
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>2.1.1</version>
    </dependency>
    
  2. 添加盐值

    1
    2
    
    # jasypt加密的盐值
    jasypt.encryptor.password=erp
    
  3. 明文加密

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    /**
    * ulisesbocchio 加密组件
    */
    @Test
    public void getPass() {
        String name = encryptor.encrypt("root");
        String password = encryptor.encrypt("123456");
        System.out.println("Name加密后明文: " + name);
        System.out.println("Password加密后明文: " + password);
        Assert.assertTrue(name.length() > 0);
        Assert.assertTrue(password.length() > 0);
    }
    
  4. 使用(application.properties)

    1
    2
    3
    
    # ENC() 是数据库加密函数
    spring.datasource.username=ENC(YMoG7LZvcKq3DbW3dc9Ltg==)
    spring.datasource.password=ENC(RgqVyviuib6ScIcgcQr9SA==)
    
updatedupdated2025-04-172025-04-17