这里我使用了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: 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: 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: properties.hibernate.temp.use_jdbc_metadata_defaults: false database-platform: org.hibernate.dialect.PostgreSQL9Dialect
最终的yml连接数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 spring: datasource: 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
最后读取数据成功: