SpringBoot实战 之 数据库

xiaoxiao2021-02-28  84

1. 数据库配置

1.1. In-Memory 数据库

SpringBoot 可以自动配置嵌入式数据库,如:H2,HSQL 和 Derby 等。不需要提供任何连接URL,只需将构建依赖关系包含到要使用的嵌入式数据库中即可。

以 HSQL 配置 In-Memory 数据库:

"org.hsqldb:hsqldb:2.4.0"

使用内存嵌入式数据库开发应用程序通常很方便。显然,内存数据库不提供持久存储;在应用程序启动时,需要填充数据库,并准备在应用程序结束时丢弃数据。

1.2. 持久化数据库

与 In-Memory 数据库相比,持久化数据库需要配置更多的信息,如:数据库连接地址、用户名、密码等。

以 Mysql 为例,依赖配置项如下:

"mysql:mysql-connector-java:6.0.6"

数据库配置项如下:

spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver

2. ORM 集成

2.1. JPA 使用(Hibernate实现)

Java Persistence API是一种标准技术,可让你将对象映射到关系数据库。 添加 jpa 的依赖:

"org.springframework.boot:spring-boot-starter-data-jpa:1.5.2.RELEASE"

spring-boot-starter-data-jpa 提供了一种快速入门的方法。它提供以下几个核心依赖: 1. Hibernate - 最受欢迎的 JPA 实现之一。 2. Spring Data JPA - 轻松实现基于 JPA 的存储库。 3. Spring ORMs - 来自 Spring Framework 的核心 ORM 支持。

2.1.1. 实体类

通常,JPA 的 Entity 类都是在 persistence.xml 文件中指定。而在 SpringBoot里面,不再需要这些,而是通过 Entity 扫描来指定。任何以 @Entity、@Embeddable 或 @MappedSuperclass 标识的类都将被考虑。以前文中的用户实体为例:

建立数据库表及数据初始化脚本如下:

DROP TABLE IF EXISTS sys_user; CREATE TABLE sys_user ( id int AUTO_INCREMENT COMMENT 'ID', username VARCHAR(20) NOT NULL COMMENT '用户名', password VARCHAR(20) NOT NULL COMMENT '密码', age int COMMENT '年龄', nick_name VARCHAR(20) COMMENT '昵称', PRIMARY KEY (id) ) COMMENT '用户表'; INSERT INTO sys_user (username, password, age, nick_name) VALUES ('13632675555', '123456', 22, '三儿'); INSERT INTO sys_user (username, password, age, nick_name) VALUES ('13632674444', '987654', 20, '尼古拉斯·赵四');

实体类如下:

@Entity(name = "sys_user") public class User { @Id @GeneratedValue private Long id; @Column(nullable = false) private String username; @Column(nullable = false) private String password; @Min(20) private int age; private String nickName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonIgnore public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } }

2.1.2. JPA 存储库

Spring Data JPA 存储库是可以定义数据访问接口。Spring 数据存储库通常从 Repository 或 CrudRepository 接口扩展。具体例子如下:

public interface UserRepository extends CrudRepository<User, Long> { User findByUsername(String username); }

在这个例子中,自定义了一个 findByUsername 方法,然后继承了 CrudRepository 的所有方法,包括 findAll() 等。

2.2. Mybatis 使用

相比 Hibernate 而言,Mybatis 显得更加小巧精致,与 JPA 类似,在 SpringBoot 里面集成 Mybatis 也非常的简单。

首先,配置依赖项:

"org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.0"

配置实体的自动映射与扫描:

mybatis: configuration: # 将数据库的字段名自动映射到类中的驼峰命名,要求: # 数据库字段名类似 nick_name, 使用下划线分隔 # 类中的属性名类似 nickName map-underscore-to-camel-case: true # 自动扫描映射实体,并以类名作为实体的别名,在 Dao.xml 中使用 type-aliases-package: com.qchery.funda.modules

实体类,相对比 JPA 简单一些,在使用 Mybatis 的过程中,保持良好的命名规范,可以极大的简化 Mybatis 的配置,同时也更利于项目的维护:

public class User { private Long id; private String username; private String password; @Min(20) private int age; private String nickName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @JsonIgnore public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } }

数据访问映射接口:

@Mapper public interface UserDao { User findByUsername(String username); List<User> findAll(); }

数据访问映射接口实现,在 JPA 中,接口在满足其命名规范的时候,是不需要定实现的,而 Mybatis 需要,不过这样也使得 Mybatis 的数据操作更加灵活:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qchery.funda.modules.sys.dao.UserDao"> <select id="findByUsername" resultType="User"> SELECT * FROM sys_user WHERE username = #{username} </select> <select id="findAll" resultType="User"> SELECT * FROM sys_user </select> </mapper>

参考链接:

Spring Boot - Reference 1.5.3

MyBatis-Spring-Boot-Starter

SpringBoot 实战系列:

SpringBoot实战 之 入门篇

SpringBoot实战 之 数据交互篇

SpringBoot实战 之 外部配置篇

SpringBoot实战 之 异常处理篇

SpringBoot实战 之 接口日志篇

项目的 github 地址:https://github.com/qchery/funda

转载请注明原文地址: https://www.6miu.com/read-47285.html

最新回复(0)