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>
参考链接:
SpringBoot 实战系列:
项目的 github 地址:https://github.com/qchery/funda