SpringData JPA
初识
简单应用
用JPA操作数据库的数据
pom.xml
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.7.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.0.7.Final</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
编写配置文件
配置文件放在resource目录中 META-INF 中 ,并且名称为 persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
需要配置persistence-uni节点
持久化单元:
name:持久化单元的名称
transaction-type:本地事务管理
-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!-- jpa的实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- 数据库信息-->
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="123456"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpatest"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<!-- 可选配置:配置jpa实现方的配置信息-->
<!--
hibernate.show_sql:是否显示sql
hibernate.hbm2ddl.auto: 自动创建表
create : 程序运行时创建表(如果有表,先删除后创建)
update : 程序运行时创建表,(如果有表,就不会创建)
none : 不会创建表
-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
</persistence>
编写实体类 使实体类与 数据表一一映射
import lombok.Data;
import lombok.ToString;
import javax.persistence.*;
/**
* @program: jpa
* @author: Mr-Jies
* @create: 2020-06-15 10:25
**/
/**
* 客户端的实体类
* 配置映射关系
* 1.实体类和表的映射关系
* @Entity : 声明实体类
* @Table : 配置实体类和表的映射关系
* name : 配置数据库表的名称
* 2.实体类中属性和表中字段的映射关系
*/
@Data
@Entity
@Table(name="cust_customer")
public class Customer {
/**
* @Id : 声明主键的配置
* @GeneratedValue : 主键生成策略
* GenerationType.IDENTITY 自增
* @Column : 配置属性和字段的映射关系
* name :数据库表中的字段名称
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cust_id")
private Long custId;
@Column(name = "cust_name")
private String custName;
@Column(name = "cust_source")
private String custSource;
@Column(name = "cust_industry")
private String custIndustry;
@Column(name = "cust_level")
private String custLevel;
@Column(name = "cust_address")
private String custAddress;
@Column(name = "cust_phone")
private String custPhone;
}
测试
/**
* 基本步骤:
* 1.加载配置文件创建工厂(实体类管理器工厂)对象
* 2.通过实体类管理器工厂获取实体类管理器
* 3.获取事务对象,开启事务
* 4.完成增删改查操作
* 5.事务提交
* 6.释放资源
*/
public class Test01 {
//保存一个实体对象
@Test
public void save(){
//1.加载配置文件创建工厂(实体类管理器工厂)对象
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJpa");
//2.通过实体类管理器工厂获取实体类管理器
EntityManager entityManager = entityManagerFactory.createEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//4.完成增删改查操作
Customer customer = new Customer();
customer.setCustName("小明");
customer.setCustIndustry("销售");
customer.setCustLevel("99");
customer.setCustPhone("1359648645");
entityManager.persist(customer);
//5.事务提交
transaction.commit();
//6.释放资源
entityManager.close();
entityManagerFactory.close();
}
}
主键生成策略
public enum GenerationType {
TABLE,
SEQUENCE,
IDENTITY,
AUTO
}
@GeneratedValue :
* GenerationType.IDENTITY 自增
* GenerationType.SEQUENCE 序列
* GenerationType.TABLE jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
* GenerationType.AUTO 由程序自动的帮助我们选择主键生成策略
JPA完成简单CRUD
persist(增加)
上面的test
find与getReference
/**
* find: 立即加载
* 1.查询的对象就是当前客户对象的本身
* 2.在调用find方法的时候就发送SQL语句查询数据库
*/
@Test
public void find(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.find(Customer.class, 1l);
System.out.println(customer);
entityManager.close();
}
/**
* getReference: 懒加载
* 1.获取的对象是一个动态代理对象
* 2.调用getReference方法不会立即发送SQL语句查询数据库
* * 只要当调用查询结果的时,才会发送SQL语句,什么时候用,就什么时候发送SQL语句查询数据库
*/
@Test
public void Reference(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 1l);
System.out.println(customer);
entityManager.close();
}
remove(删除)与merge(修改)
@Test
public void remove(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 1l);
entityManager.remove(customer);
transaction.commit();
entityManager.close();
}
@Test
public void update(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.getReference(Customer.class, 2l);
customer.setCustName("小白");
customer.setCustAddress("浙江");
entityManager.merge(customer);
transaction.commit();
entityManager.close();
}
}
JPA复杂查询(JPQL)
createQuery
- getSingleResult
- getResultList
@Test
public void query(){
EntityManager entityManager = JpaUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//使用jpql查询
// String jpql = "from com.wu.domain.Customer";
// String jpql = "select count(*) from com.wu.domain.Customer order by custId desc ";
String jpql = "from com.wu.domain.Customer order by custId desc ";
Query query = entityManager.createQuery(jpql);
List resultList = query.getResultList();
resultList.forEach(System.out::println);
transaction.commit();
entityManager.close();
}
分页
//使用jpql查询
String jpql = "from com.wu.domain.Customer order by custId desc ";
Query query = entityManager.createQuery(jpql);
//分页
query.setFirstResult(1);
query.setMaxResults(3);
List resultList = query.getResultList();
条件查询
//使用jpql查询
String jpql = "from com.wu.domain.Customer where custName like ?";
Query query = entityManager.createQuery(jpql);
//填充参数
query.setParameter(1,"小%");
List resultList = query.getResultList();
Spring Data JPA
Spring框架使用SpringData JPA
简单案例
- applicationContext.xml
分析
总结
接口方法查询
JPQL查询
- 单参数
- 多参数
- 更新操作
- SQL查询
- 方法名称查询
- 多条件查询
SpecificationExecutor动态查询
-
单条件
-
多条件
-
排序
-
分页
一对多
测试
此时会多出一条update语句,解决 放弃外键的维护权
- 级联操作
测试
多对多
测试
- 级联操作
对象导航查询
- 一对多 默认延迟加载
- 多对一 默认立即加载