使用SpringBoot和Spring JPA连接到数据库

我将尝试访问数据库使用SpringBoot。

为了使用JPA,需要进行以下操作。

进行数据库连接的设置在application.properties文件内进行
创建名为Entity和Repository的类

1. 组成

sample-jpa
│  build.gradle
└─src
    └─main
        ├─java
        │  └─com
        │      └─jpasample
        │              Employee.java
        │              EmployeeRepository.java
        │              HeloController.java
        │              SamplePrj004JpaApplication.java
        │              ServletInitializer.java
        └─resources
            │  application.properties
            ├─static
            └─templates
                    index.html

2. 设置数据库连接信息,将其配置在application.properties文件中,如下所示。

spring.datasource.url=jdbc:mysql://localhost:3306/sampledb
spring.datasource.username=testuser
spring.datasource.password=testuser
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database=MYSQL
spring.jpa.hibernate.ddl-auto=update

设定spring.jpa.hibernate.ddl-auto=update后,即使数据库中没有定义表,也会创建表。

3. 互相依赖关系

dependencies {
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('org.springframework.boot:spring-boot-devtools')
    runtime('mysql:mysql-connector-java')
    compileOnly('org.projectlombok:lombok')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

4. 在数据库中定义表格。

我正在提供一个作为搜索员工主文件的示例。


CREATE TABLE `m_emp` (
  `empno` bigint(20) NOT NULL AUTO_INCREMENT,
  `empname` varchar(255) DEFAULT NULL,
  `departmentid` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`empno`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
INSERT INTO sampledb.m_emp
(empname,departmentid)
VALUES
 ('従業員A','10101001')
,('従業員B','10101001')
,('従業員C','10101002')
,('従業員D','10101003')

创建一个名为Entity的类。

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="m_emp")
public class Employee {
    @Id
    @Column(name="empno")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;
    private String empname;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getEmpname() {
        return empname;
    }
    public void setEmpname(String empname) {
        this.empname = empname;
    }
}

6. 存储库 chú kù)

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}

7.控制器

正在全面查找员工主数据。

import java.util.List;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HeloController {
    @Autowired
    EmployeeRepository empRepository;
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
        List<Employee> emplist=empRepository.findAll();
        model.addAttribute("emplist", emplist);
        return "index";
    }
}

请提供更多背景信息,并明确您所需要的翻译内容。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Springboot</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <h1 th:text="${title}"></h1>
        <table>
            <tr th:each="emp : ${emplist}" th:object="${emp}">
                <td th:text="*{id}"></td>
                <td th:text="*{empname}"></td>
            </tr>
        </table>
    </body>
</html>

我将运行Springboot并尝试访问URL。
http://localhost:8080/

image.png

被宣布无事。

2019年10月8日 添加补充

如果要连接到PostgreSQL

application.properties的内容如下。

spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/testdb
spring.datasource.username=testuser
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

然而,仅仅这样做会导致以下错误的发生。

Caused by: java.sql.SQLFeatureNotSupportedException: org.postgresql.jdbc.PgConnection.createClob() メソッドはまだ実装されていません。
    at org.postgresql.Driver.notImplemented(Driver.java:688) ~[postgresql-42.2.5.jar:42.2.5]
    at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1269) ~[postgresql-42.2.5.jar:42.2.5]

解决办法

将hibernate.properties文件创建在resources文件夹的直接下级(与application.properties文件相同的层级)上。

hibernate.jdbc.lob.non_contextual_creation = true

没问题,连接成功。

2019-10-08 23:37:42.626  INFO 5464 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2019-10-08 23:37:42.626  INFO 5464 --- [           main] org.hibernate.cfg.Environment            : HHH000205: Loaded properties from resource hibernate.properties: {hibernate.bytecode.use_reflection_optimizer=false, hibernate.jdbc.lob.non_contextual_creation=true}
2019-10-08 23:37:42.876  INFO 5464 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2019-10-08 23:37:43.485  INFO 5464 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-10-08 23:37:43.641  INFO 5464 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-10-08 23:37:43.657  INFO 5464 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2019-10-08 23:37:43.891  INFO 5464 --- [           main] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000421: Disabling contextual LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
2019-10-08 23:37:43.907  INFO 5464 --- [           main] org.hibernate.type.BasicTypeRegistry     : HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType@2e590b
2019-10-08 23:37:44.289  INFO 5464 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-10-08 23:37:47.675  INFO 5464 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
2019-10-08 23:37:47.686  INFO 5464 --- [           main] com.example.SecurityExampleApplication   : Started SecurityExampleApplication in 9.322 seconds (JVM running for 10.28)
广告
将在 10 秒后关闭
bannerAds