SpringBoot实战 之 数据库

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>

参考链接:

  1. Spring Boot - Reference 1.5.3

  2. MyBatis-Spring-Boot-Starter

SpringBoot 实战系列:

  1. SpringBoot实战 之 入门篇

  2. SpringBoot实战 之 数据交互篇

  3. SpringBoot实战 之 外部配置篇

  4. SpringBoot实战 之 异常处理篇

  5. SpringBoot实战 之 接口日志篇

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值