Spring Boot连接PostgresSql数据库

标签: 无 分类: 未分类 创建时间:2019-11-15 10:53:37 更新时间:2024-11-12 12:53:37

这里我使用了postgresql数据库,使用了hibernate作为orm工具。至于myBatis和hibrenate的区别,可以查看参考文章,至于如何使用mybatis,以后有时间再慢慢的研究相关的例子,现在先用hibrenate搭建一个基础的应用。

1.添加jpa依赖

1
2
3
4
<dependency>  
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2.添加postgresql依赖

1
2
3
4
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>

3.编写application.properties文件或者是application.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
## default connection pool
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5

## PostgreSQL
spring.datasource.url=jdbc:postgresql://localhost:5432/【postgres】?useSSL=false
spring.datasource.username=postgres
spring.datasource.password=password

#drop n create table again, good for testing, comment this in production
# 关于这个配置说明可以查看:https://www.cnblogs.com/talo/articles/1662244.html
spring.jpa.hibernate.ddl-auto=create

其中【postgres】为数据库名称。或者是application.yml文件(使用出错,请查看最后更新yml):

1
2
3
4
5
6
7
8
9
10
11
12
spring:
datasource:
## default connection pool
hikari:
connection-timeout: 20000
maximum-pool-size: 5
url: jdbc:postgresql://localhost:5432/【postgres】?useSSL=false
data-username: postgres
data-password: 1q2w3e4r
jpa:
hibernate:
ddl-auto: update

关于ddl-auto的说明:

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

4.新建数据库表

这一步就省略好了,用navicat可视化创建,应该挺方便的。

5.新建@Entity实体类,自动生成set,get方法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.proheng.gis.Entity;
import javax.persistence.*;
@Entity
@Table(name = "pipelineproperty")
public class Pipelineproperty {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String number="";//线段编号
private String format=""; //规格
private String i_h_material=""; //内保温层材料
private String i_h_thickness=""; //内保温层厚度
private String o_h_material=""; //外保温层材料
private String o_h_thickness=""; //外保温层厚度
private String o_p_material=""; //外保护层材料
private String o_p_format=""; //外保护层规格
}

6.新建接口,继承自JpaRepository,这样这个PipelinepropertyRep就有了增删改查的能力。

1
2
3
4
5
6
7
package com.proheng.gis.Reposities;

import com.proheng.gis.Entity.Pipelineproperty;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PipelinepropertyRep extends JpaRepository<Pipelineproperty,Long> {
}

7.通过Autowired,使用这个接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping(value = "/api",produces = "application/json;charset=UTF-8")
public class ApiCtrl {
private final Logger logger= LoggerFactory.getLogger(ApiCtrl.class);

@Autowired
private PipelinepropertyRep pipelinepropertyRep;

@RequestMapping("getPipelineProperty")
public List<Pipelineproperty> getPipelineProperty(){
return pipelinepropertyRep.findAll();
}
}

8.有些文章会说在controller层和jpa层,还有一层时service层,方便对访问接口的分离,这个根据需要处理,这里仅仅简单的说明如何使用jpa。

问题
(1) 出现:Failed to bind properties under ‘’ to com.zaxxer.hikari.HikariDataSource

是因为在pom中没有提供postsgres依赖

(2) 出现密码未提供

这个需要将用户名密码写在hikari属性下,而不是datasource属性下,如下:

1
2
3
4
5
6
7
8
9
10
11
12
spring:
datasource:
## default connection pool
hikari:
connection-timeout: 20000
maximum-pool-size: 5
username: postgres
password: 1q2w3e4r
url: jdbc:postgresql://localhost:5432/hdxs
jpa:
hibernate:
ddl-auto: update

(3) java.sql.SQLFeatureNotSupportedException: 这个 org.postgresql.jdbc.PgConnection.createClob() 方法尚未被实作

解决方法是关闭use_jdbc_metadata_defaults特性检测(这是低版本的问题,springboot版本升级到2.3.1.RELEASE就不会有这个问题了):

1
2
3
4
5
6
spring:
jpa:
# Disable feature detection by this undocumented parameter. Check the org.hibernate.engine.jdbc.internal.JdbcServiceImpl.configure method for more details.
properties.hibernate.temp.use_jdbc_metadata_defaults: false
# Because detection is disabled you have to set correct dialect by hand.
database-platform: org.hibernate.dialect.PostgreSQL9Dialect

最终的yml连接数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
## default connection pool
hikari:
connection-timeout: 20000
maximum-pool-size: 5
username: postgres
password: 1q2w3e4r
url: jdbc:postgresql://localhost:5432/hdxs
jpa:
hibernate:
ddl-auto: update
properties:
hibernate.temp.use_jdbc_metadata_defaults: fase

最后读取数据成功:

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。