在Spring Boot环境下,Spring Data JPA入门笔记

你好,我是一名在大分工作的资深程序员。
我正在努力学习新的框架,但一些难点使我感到困扰。
最近,出现了像Qiita这样的程序员信息共享网站,非常方便。我会在这里保存我所学的知识,整理我的思维,并记录下我无法记住的事项。
今天我尝试了Spring Data JPA。

Spring Data JPA的指南

这次我参考了三种指南。

    1. 与Spring Boot Guide中与Spring Data JPA相关的章节进行简单的教程

Spring Data JPA的官方文档

我总是从简单的教程开始。第一个链接是关于使用Spring Boot的Spring Data JPA的入门教程。

接下来,我大致上在2号选项中学习了设置。
至于3号选项的Spring Data JPA官方文档,我只在需要详细查阅时才会查看。

安装

Maven的依赖关系

以下是第一个教程,要在Maven中添加依赖关系,请按照以下方式进行。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

这是第2版的官方指南,其中在29.1.1 Embedded Database Support中进行了详细说明。使用spring-boot-starter-data-jpa(基于Spring Boot的Spring Data JPA),通过Boot的自动配置功能,嵌入式数据库可以无需进行任何操作即可使用。主要用于编写JUnit单元测试,通常会将H2或HSQL与其依赖一起放置。

MySQL驱动的配置

第二版的官方指南中的29.1.2节中有关于连接生产数据库的说明。

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

在教程和示例程序中经常会看到”com.mysql.jdbc.Driver”的写法,但根据MySQL官方指南,这个已经过时了,新的类名是”com.mysql.cj.jdbc.Driver”。

JPA的DDL生成功能(※可选)

在JPA(Spring中的Hibernate实现)中,有一个功能可以从Bean的定义中生成DDL语句。

默认情况下,只有在使用嵌入式数据库(H2、HSQL或Derby)时,JPA数据库才会自动创建。

在指南中,该功能主要是为嵌入式数据库设计的,但如果您想在MySQL等数据库服务器上使用它,您需要在以下设置中将该功能启用。

记载的方法如同在此描述的那样。

spring.jpa.hibernate.ddl-auto=update

可设定的值包括none, validate, update, create, create-drop。
详细说明请参见这里。

Spring Boot中有一个功能,在启动时执行schema.sql(并在该sql语句中创建表)的功能,但是我觉得是否有必要创建SQL文件呢?目前正在尝试使用此功能。但是,在生产环境中,我将其设置为none,以停止该功能。

连接状态检查

在获取连接时,启用检查功能以确认连接已建立到数据库服务器的功能。

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.dbcp.validation-query=SELECT 1

为了防止文字乱码

在将数据库和模式的字符编码设置为UTF-8之后,由于应用程序使用时出现了日语乱码问题,因此在Spring框架中为MySQL的连接(驱动程序和连接)也设置为UTF-8。

这是实际的设置。

spring.datasource.connectionProperties=useUnicode=true;characterEncoding=utf-8;

这里是我参考的StackOverFlow。

在IntelliJ IDEA中,我看到了一个警告,提示设置本身可能过时,并在某个地方的指南中看到了相关内容。实际上,使用这个方法可以解决日文乱码的问题。

如果仔细思考,这个connectionProperties似乎是从Tomcat的Datasource传递给驱动程序的值(在我的情况下,我使用Tomcat作为Datasource)。

首先,MySQL驱动程序(MySQL Connector/J)的配置方法在官方指南中有详细说明。通常情况下,如果服务器端设置为UTF-8,客户端也会自动检测到。但是,如果客户端希望明确将其设置为UTF-8,则应将”characterEncoding”属性设置为UTF-8。

为了允许客户端发送多个字符集,可以使用UTF-8编码,可以通过将utf8配置为默认服务器字符集,或者通过配置JDBC驱动程序使用UTF-8的characterEncoding属性来实现。

有点儿改动,我稍稍意译了一下

刚才在applications.properties文件中提到了useUnicode和characterEncoding的设置,有关这些设置的说明也已经给出了。

在MySQL Server 4.1之前,Connector/J仅支持每个连接的单个字符编码,可以通过自动从服务器配置中检测或通过使用useUnicode和characterEncoding属性进行配置。

使用Unicode和字符编码两者都是为了兼容MySQL4.1之前的设置。从之后的版本开始,似乎只使用字符编码就足够让其正常工作。

好了,现在是要把这个属性值传递给MySQL驱动程序,而connectionProperties的值是直接传递给Tomcat的Datasource类的setConnectionProperties方法的,正如这个方法的Javadoc中所描述的那样。

将要传入Driver.connect(String, Properties)方法的属性

似乎是通过MySQL驱动程序进行传递…

顺便一提,在Tomcat的JDBC连接池说明页面中有一个与Apache Commons DBCP进行比较的表格,由于connectionProperties属性是作为公共属性介绍的,所以在Spring中选择Commons的DBCP作为数据源似乎也可以使用。

使用JPA的Java程序

嗯,现在已经详细记录了很多设置内容,成为了一篇相当长的文章,所以今天就到这里吧……至于Java程序部分,按照教程的示例进行即可,这里就省略了。

最近的编程因为自动化功能较多,所以相对而言,确认设置等方面需要花费更多学习成本。与编写程序相比,配置变得更加复杂…与编写位运算时相比,真的感觉是两个不同的世界了。

如果有关于设置的问题,对于初老者来说可能会有困难,因此如果有任何错误或更好的描述方法,请告诉我,非常感谢。如果您有任何注意点,请留下评论。

我向您微服私访,非常抱歉打扰。

广告
将在 10 秒后关闭
bannerAds