spring data jpa 简介
JPA
(Java Persistence API
)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR 338,这些接口所在包为javax.persistence
,详细内容可参考https://github.com/javaee/jpa-spec) 官网 [https://spring.io/projects/spring-data-jpa#overview]
JPA的出现主要是为了简化持久层开发以及整合ORM技术,结束Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA是在吸收现有ORM框架的基础上发展而来,易于使用,伸缩性强。总的来说,JPA包括以下3方面的技术:
- ORM映射元数据: 支持XML和注解两种元数据的形式,元数据描述对象和表之间的映射关系
- API: 操作实体对象来执行CRUD操作
-
查询语言: 通过面向对象而非面向数据库的查询语言(
JPQL
)查询数据,避免程序的SQL语句紧密耦合
Springboot 整合spring data jpa
1.添加pom.xml 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.对数据库连接进行配置
在application.porperties 进行配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://mysql.abc.co:3309/
spring.datasource.username=root
spring.datasource.password=pass123
3.使用 jpa

ShotController :springboot 的controller层
ShotService: springboot 的service层
Shot:数据库 Model
ShorRepository: jpa的接口,通过这个接口jpa 动态代理完成对数据库的读写
Shot 代码
package com.sboot.jpa.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
@Entity()
@Table(name = "shot")
public class Shot implements Serializable {
@javax.persistence.Id
@Column( name="shot_id")
private Integer id;
@Column(name="shot_name")
private String shotName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getShotName() {
return shotName;
}
public void setShotName(String shotName) {
this.shotName = shotName;
}
}
ShotRepository 代码
package com.sboot.jpa.repository;
import com.sboot.jpa.model.Shot;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ShotRepository extends JpaRepository<Shot,Integer> { //继承JpaRepository 接口, Shot为基于的实体,Integer 为主键类型
}
可以使用 这样就可以使用 JpaRepository接口中方法。 如果想要添加方法,可以
1. 在ShotRepository 中安装JPA的规则添加方法,规则如下表

如 List<Shot> findByShotName(String shotName); jpa通过动态代理的方式,就会自动根据实现接口的该方法
2. 用hql 语句,如
@Query("select shot from Shot shot where shot.shotName=?1")
List<Shot> findByShotName(String shotName);
注意 Shot 不是数据库的表名
3. 用sql 语句,如
@Query( value="select * from shot where shot.shot_name=?1" ,nativeQuery=true)
List<Map> dffindByShotName(String shotName);
和hql不同的是,在@Query注解里增加 nativeQuery=true
问题
- 使用 shotRepository.getOne(id); 需要在实体Shot 上添加@JsonIgnoreProperties(value = { "hibernateLazyInitializer"}),当然也可以使用 Optional<Shot> shot=shotRepository.findById(id); shot.get(); 代替。则不需要加@JsonIgnoreProperties(value = { "hibernateLazyInitializer"})
网友评论