Spring Boot 技术探索

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

13、Spring Boot使用SpringData JPA操作数据库

平台环境:

名称

版本号

Mac OS X

10.14.5

JDK

1.8.0_201

Apache Maven

3.6.0

IntelliJ IDEA

2019.1 (Ultimate Edition)

Spring Boot

2.1.6.RELEASE

MySQL

8.0.13 库名叫test1

 

  Spring Data JPA是Spring大家族中的一员。使用它可以轻松构建拥有数据存取能力的“Spring-powered”的应用程序。换句话说就是它提供了极简的方式增删改查数据库。

 

一、项目中使用SpringData JPA的配置过程

1、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.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </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-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

</project>

 

2、配置好MySQL环境。启动MySQL。

 

3、配置文件application.properties,写入数据库连接配置:

# Spring Config
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test1?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = 12345678

# Spring Data JPA Config
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

Spring Config这里需要注意:

  • 从MySQL5.X以后的版本(不包括5.X)开始,数据库连接驱动使用com.mysql.cj.jdbc.Driver
  • 旧版本的数据库连接驱动为com.mysql.jdbc.Driver
  • 使用新的数据库驱动时要加上时区serverTimezone=Asia/Shanghai,如果不加则默认为格林威治标准时间。
  • characterEncoding=utf-8的意思是存取数据时使用的字符编码格式UTF-8。如果MySQL数据库的字符集是用的GBK的则需要再加参数&useUnicode=true,此时数据库在存放数据的时候会先用UTF-8格式将数据解码成字节码,然后再将字节码重新使用GBK编码存放到数据库中。从数据库中取数据的时候,数据库会先将数据按GBK格式解码成字节码,然后再将字节码按UTF-8格式编码数据,最后再将数据返回。

 

Spring Data JPA Config这里需要注意,这里的spring.jpa.properties.hibernate.hbm2ddl.auto参数的作用是:

  • create:每次加载hibernate时都会删除上一次的生成的表,然后根据你的Entity类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
  • create-drop :每次加载hibernate时根据Entity类生成表,但是sessionFactory一关闭,表就自动删除。
  • update:最常用的属性,第一次加载hibernate时根据Entity类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据Entity类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
  • validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表。如果Entity类增加了成员变量,则会报错。如果Entity类少了成员变量,则会按照null值插入映射表中。

 

spring.jpa.properties.hibernate.dialect:方言配置,可以理解为告诉Hibernate它要“说”哪种数据库的语言。因为不同的数据库,在SQL语句的设计上是存在差异的,就好比不同地方的人说不同的方言。而Hibernate呢,它会所有的“方言”,我们要做的,就是告诉它,我们需要它说哪种“方言”。

spring.jpa.show-sql:是否在输出日志中打印sql语句

spring.jpa.hibernate.naming.physical-strategy:Hibernate中实体映射时的命名策略。具体解释:

//1.PhysicalNamingStrategyStandardImpl:不做修改,直接映射
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

//2.SpringPhysicalNamingStrategy:在进行领域映射时,首字母小写,大写字母变为下划线加小写(默认是这个)
//ex: LoginName --> login_name
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

 

 

4、建立Entity类:

package com.example.demo.dao.entity;

import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String userName;

    @Column(nullable = false)
    private String passWord;

    @Column
    private Date regTime;

    @Column
    private String remark;

    @Column
    private int sex;

    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;
    }

    public String getPassWord()
    {
        return passWord;
    }

    public void setPassWord(String passWord)
    {
        this.passWord = passWord;
    }

    public Date getRegTime()
    {
        return regTime;
    }

    public void setRegTime(Date regTime)
    {
        this.regTime = regTime;
    }

    public String getRemark()
    {
        return remark;
    }

    public void setRemark(String remark)
    {
        this.remark = remark;
    }

    public int isSex()
    {
        return sex;
    }

    public void setSex(int sex)
    {
        this.sex = sex;
    }
}

 

5、新建一个Repository接口并继承自JpaRepository(Spring为我们准备好的数据库操作接口),就可以操作数据库了。

package com.example.demo.dao;

import com.example.demo.dao.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long>
{
    // 自定义查询
    User findByUserName(String userName);
}

这里的findByUserName是自定义规则查询。不写这个也可以执行最简易的CRUD操作。

 

二、测试

1、src/test/java目录下,建立测试类UserRepositoryTests

package com.example.demo;

import java.util.Date;

import com.example.demo.dao.UserRepository;
import com.example.demo.dao.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTests
{
    @Autowired
    private UserRepository userRepository;

    @Test
    public void testInsert() throws Exception
    {
        User aUser = new User();
        aUser.setUserName("a01");
        aUser.setPassWord("123456");
        aUser.setRegTime(new Date());
        aUser.setRemark("rmkA01");
        aUser.setSex(1);

        userRepository.save(aUser);
    }

    @Test
    public void testSelect() throws Exception
    {
        User user = userRepository.findByUserName("a01");
        System.out.println("testSelect():" + user.getUserName() + "," + user.getRemark());
    }

    @Test
    public void testUpdate() throws Exception
    {
        User userUpdate = userRepository.findByUserName("a01");
        userUpdate.setRemark("rmkA01_XXX");
        userRepository.save(userUpdate);
    }

    @Test
    public void testDelete() throws Exception
    {
        userRepository.delete(userRepository.findByUserName("a01"));
    }

}

 

测试结果:

testInsert():

 

testSelect():

 

testUpdate():

 

testDelete():

 

Bootstrap Thumbnail Second
MySQL

MySQL is the world's most popular open source database.

GO

Bootstrap Thumbnail Third
算法基础

本书介绍了什么是计算机算法,如何描述它们,以及如何来评估它们。

GO