使用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/

被宣布无事。
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)