JPA
一.概述:jpa为一套接口,hibernate是实现(所有的orm框架都可以实现jpa接口)
二.Jpa的环境搭建:
Hibernate框架的环境的16个包+hibernate-entitymanager-5.0.7.Final.jar(共17个包)
-
JavaBean头
@Entity
@Table(name=”cst_customer”)
-
主键头
@Id
@Column(name=”cust_id”)
@GeneratedValue(Strategy=GenerationType.IDENTITY)
-
其它字段属性
@Column(name=”表中字段名”)
-
数据库核心配置文件persistence.xml要求放在src下面的META-IN文件夹下
找约束头(
第24-26行)
<persistence>
<persistence-unitname=”mysql”>
<properties>
<propertyname=”” value=””/>
数据库的驱动
地址
用户名
密码
使用数据库的方言
C3p0(告诉数据库使用的c3p0连接池)
(以上几步基本是固定的)
控制台显示sql语句
将显示格式化
让hibernate在数据库自动生成映射表(一般使用update)
</properties>
</persistence-unit>
</persistence>
三.JAP的api
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("mysql");
EntityManager em = managerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
//增删改查操作
//persist();=save();
//remove();=delete();
//merge();=update();
//find();=get();
tx.commit();
em.close();
针对单表的批量查询操作
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("mysql");
EntityManager em=managerFactory.createEntityManager();
EntityTransactiontx = em.getTransaction();
tx.begin();
//全查
Query query =em.createQuery(“from Customer”);
List<Customer>list = query.getRestultList();
for(Customercustomer:list){
syso(customer);
}
//条件查 ps:hibernate中占位符从0开始,jpa中从1开始
//聚合查
Query query = em.createQuery(“select count(*)from Customer”);
Object obj = query.getSingleResult();// 相当于uniqueResult
Syso(obj);
四.通过注解配置一对多
以Customer与Linkman为例
Customer方:
@OneToMany(targetEntity=Linkman.class, MappedBy=”customer”)
privateSet<Linkman> linkmans = new HashSet<>();
Linkman方:
@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name=”wj_id”, referencedColumnName=”cust_id”) //name指定外键字段名 referencedColumnName指向多方的主键字段名
privateCustomer customer;
ps:targetEntity指定另一方的字节码文件
MappedBy自己在对方中的属性名,出现在哪一方,就代表不去维护外键了
Cascade=CascadeType.All级联保存与删除
CascadeType.PERSIST 级联保存
CascadeType.REMOVE 级联删除
五.通过注解配置多对多
以User与Role为例
User方:
@ManyToMany(targetEntity=Role.class, cascade=CascadeType.All)
@JoinTable(name=”sys_user_role”,
JoinColumns={
@JoinColumn(name=”user_id”,referencedColumnName=”user_id”)
//name自己在中间表的外键字段名
//referencedColumnName指向自己的主键字段名
},inverseJoinColumns={
@JoinColumn(name=”role_id”,referencedColumnName=”role_id”)
//name对方在中间表的外键字段名
//referencedColumnName指向对方的主键字段名
})
PrivateSet<Role> roles = new HashSet<>();
Role方:
@ManyToMany(targetEntity=User.class, mappedBy=”roles”)
// targetEntity另一方的字节码文件
// mappedBy自己在另一方的集合属性名,出现在哪一方,就代表不去维护外键了
perviteSet<User> users = new HashSet<>();