JPA概述
JPA概念: Java Persist API.是Sun公司发布的规范. 规范了面向对象操作数据库的规则.JPA规范很大程度上参考了Hibernate设计.Hibernate也第一时间宣布支持JPA规范.
JPA搭建
- 导包
hibernate required中的所有包,数据库驱动包,jpa包
- 实体(注解映射)
@Entity
@Table(name="cst_customer")
public class Customer {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="cust_id")
private Long cust_id;
@Column
private String cust_name;
...
//一对多,放弃关系维护
@OneToMany(targetEntity=LinkMan.class,mappedBy="customer")
private Set<LinkMan> linkmen=new HashSet<>();
@Entity
@Table(name="cust_linkman")
public class LinkMan {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="lkm_id")
private Long lkm_id;
@Column
private String lkm_name;
...
//多对一
@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name="lkm_cust_id",referencedColumnName="cust_id")
private Customer customer;
- 创建Jpa主配置文件
<!--
persistence-unit : 配置主配置文件的根元素,可以出现多个.当项目需要连接多个数据库时,可以分别配置每个数据库的连接信息.
name:给当前的配置起个名字. 读取配置时根据名字读取
entityManagerFactory = Persistence.createEntityManagerFactory("abc");
transaction-type : 事务管理方式
RESOURCE_LOCAL: 本地事务,普通事务
jta: jta规范事务
-->
<persistence-unit name="abc" transaction-type="RESOURCE_LOCAL">
<!-- jpa规范的实现厂商属性,hibernate键值对属性 -->
<properties>
<!-- 配置使用c3p0连接池 -->
<!-- <property name="hibernate.connection.provider_class"
value="org.hibernate.connection.C3P0ConnectionProvider" ></property>
<property name="hibernate.c3p0.max_size" value="2"></property> -->
<!-- 数据库的连接信息 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/crm"/>
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="123456" />
<!-- 指定方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 生成DDL的策略 -->
<property name="hibernate.hbm2ddl.auto" value="update" />
<!-- 是否显示SQL语句 -->
<property name="hibernate.show_sql" value="true" />
<!-- 是否格式化SQL语句 -->
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
封装工具类
public class JPAUtils {
private static EntityManagerFactory emf=null;
static{
//创建EntityManagerFactory
emf = Persistence.createEntityManagerFactory("abc");
}
//获取entityManager
public static EntityManager getEntiryManager(){
//创建entityManager
EntityManager em = emf.createEntityManager();
return em;
}
}
Jpa api操作
- 增
- 查
立即查询,没有任何查询策略的应用
- 改
//先查后改
Customer c = em.find(Customer.class, 1L);
c.setCust_name("黑马程序员");
第二种更改方式
Customer c = new Customer(); //瞬时状态
c.setCust_id(1L); //游离
c.setCust_name("传智博客"); //游离
Customer merge=em.merge(c); //持久化状态
- 删
- JPQL使用
JavaPersistQueryLanguage JPA查询语言,JPQL与HQL语法一致
多对多类型映射
多对多不维护关系方
用户类添加维护关系
@ManyToMany(targetEntity=Role.class)
@JoinTable(name="sys_user_role",joinColumns=@JoinColumn(name="user_id",referencedColumnName="user_id"),
inverseJoinColumns=@JoinColumn(name="role_id",referencedColumnName="role_id"))
基本操作
- 添加多对多数据
//创建用户
User u = new User();
u.setUser_name("李四");
//创建角色
Role r = new Role();
r.setRole_name("教师");
Role r2 = new Role();
r2.setRole_name("行政");
//添加关系
u.getRoles().add(r);
u.getRoles().add(r2);
//保存
em.persist(u);
em.persist(r);
em.persist(r2);
- 移除关系
//获取用户
User u = em.find(User.class, 1L);
//获取角色
Role r = em.find(Role.class, 2L);
u.getRoles().remove(r);
- 添加关系
//获取用户
User u = em.find(User.class, 1L);
//获取角色
Role r = em.find(Role.class, 4L);
//添加角色
u.getRoles().add(r);