标签:res system pack 静态代码块 文件 driver one 电话 XML
主要目的:
操作实体类就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中的属性和表中字段的映射关系
不在关注sql语句
常见的orm框架:Mybatis(ibatis)、Hibernate、Jpa
JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。
JPA规范本质上就是一种ORM规范,注意不是ORM框架——因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。

JPA和Hibernate的关系就像JDBC和JDBC驱动的关系,JPA是规范,Hibernate除了作为ORM框架之外,它也是一种JPA实现。JPA怎么取代Hibernate呢?JDBC规范可以驱动底层数据库吗?答案是否定的,也就是说,如果使用JPA规范进行数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。
在java工程的src路径下创建一个名为META-INF的文件夹,在此文件夹下创建一个名为persistence.xml的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--需要配置一个persistence-unit节点 name:持久化单元 transaction-type:事务管理方式
RESOURCE_LOCAL:本地事务管理
jpa:分布式事务管理-->
<persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
<!--jpa的实现方式-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!--加载配置文件-->
<property name="persistenceXmlLocation" value="classpath:/META-INF/persistence.xml"/>
<!--数据库信息-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://192.168.2.100:3306/ytkj?serverTimeZone=UTC"/>
<property name="javax.persistence.jdbc.username" value="root"/>
<property name="javax.persistence.jdbc.password" value="123456"/>
<!--可选的配置:配置jpa实现方的配置信息,也就是hibernate的配置信息
显示sql hibernate.show.sql true
自动创建数据库表 hibernate.hbm2ddl.auto
create:程序运行时创建表。若有表先删除表在创建表
update:程序运行时创建表。若有表不会创建表
none: 不会创建表
-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
编写实体类和数据库表的映射配置
package com.ytk.entity;
import javax.persistence.*;
import java.io.Serializable;
/**
* @Entity
* 作用:指定当前类是实体类。
* @Table
* 作用:指定实体类和表之间的对应关系。
* 属性:
* name:指定数据库表的名称
* @Id
* 作用:指定当前字段是主键。
* @GeneratedValue
* 作用:指定主键的生成方式。。
* 属性:
* strategy :指定主键生成策略。
* @Column
* 作用:指定实体类属性和数据库表之间的对应关系
* 属性:
* name:指定数据库表的列名称。
* unique:是否唯一
* nullable:是否可以为空
* inserttable:是否可以插入
* updateable:是否可以更新
* columnDefinition: 定义建表时创建此列的DDL
* secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点]
*
* 客户实体类
* 配置映射关系
* 实体类和表映射
* 实体类属性和表字段映射
*/
@Entity
@Table(name = "cst_customer")
public class Customer implements Serializable {
/**
* 声明主键配置
*/
@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;//客户电话
public Long getCustId() {
return custId;
}
public void setCustId(Long custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustSource() {
return custSource;
}
public void setCustSource(String custSource) {
this.custSource = custSource;
}
public String getCustIndustry() {
return custIndustry;
}
public void setCustIndustry(String custIndustry) {
this.custIndustry = custIndustry;
}
public String getCustLevel() {
return custLevel;
}
public void setCustLevel(String custLevel) {
this.custLevel = custLevel;
}
public String getCustAddress() {
return custAddress;
}
public void setCustAddress(String custAddress) {
this.custAddress = custAddress;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
@Override
public String toString() {
return "Customer{" +
"custId=" + custId +
", custName=‘" + custName + ‘\‘‘ +
", custSource=‘" + custSource + ‘\‘‘ +
", custIndustry=‘" + custIndustry + ‘\‘‘ +
", custLevel=‘" + custLevel + ‘\‘‘ +
", custAddress=‘" + custAddress + ‘\‘‘ +
", custPhone=‘" + custPhone + ‘\‘‘ +
‘}‘;
}
}
package com.ytk.utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* 解决实体管理器工厂的浪费资源和耗时问题
* 通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象
*
* 第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象
* 第二次方法getEntityManager方法:直接通过一个已经创建好的factory对象,创建EntityManager对象
*/
public class JpaUtils {
private static EntityManagerFactory factory;
static {
//1.加载配置文件,创建entityManagerFactory
factory = Persistence.createEntityManagerFactory("myJpa");
}
/**
* 获取EntityManager对象
*/
public static EntityManager getEntityManager() {
return factory.createEntityManager();
}
}
package com.ytkj.test;
import com.ytk.entity.Customer;
import com.ytk.utils.JpaUtils;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
/**
* jpa操作步骤
* 1.加载配置文件创建工厂对象
* 2.通过实体类工厂获取实体类管理器
* 3.获取事务对象,开启事务
* 4.完成crud
* 5.提交事务
* 6.释放资源
*
*/
public class JpaTest {
/**
* 保存
*/
@Test
public void testSave(){
//1.加载配置文件创建工厂对象
//EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");;
//2.通过实体类工厂获取实体类管理器
//EntityManager entityManager = factory.createEntityManager();
EntityManager entityManager = JpaUtils.getEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//完成crud
Customer customer=new Customer();
customer.setCustName("zhechaochao");
customer.setCustIndustry("it");
//保存
entityManager.persist(customer);
//5.提交事务
transaction.commit();
//6.释放资源
entityManager.close();
//factory.close();
}
/**
* 查询
* find
* getreference 懒加载
*/
@Test
public void findById(){
EntityManager entityManager = JpaUtils.getEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.find(Customer.class, 1L);
//Customer customer = entityManager.getreference(Customer.class, 1L);
//5.提交事务
transaction.commit();
System.out.println(customer);
}
/**
* 删除
* find
* getreference 懒加载
*/
@Test
public void delete(){
EntityManager entityManager = JpaUtils.getEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.find(Customer.class, 1L);
if (customer!=null){
entityManager.remove(customer);
}
//5.提交事务
transaction.commit();
}
/**
* 更新
* find
* getreference 懒加载
*/
@Test
public void updateById(){
EntityManager entityManager = JpaUtils.getEntityManager();
//3.获取事务对象,开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
Customer customer = entityManager.find(Customer.class, 1L);
customer.setCustPhone("110");
customer.setCustAddress("昆明");
if (customer!=null){
entityManager.merge(customer);
}
//5.提交事务
transaction.commit();
}
}
标签:res system pack 静态代码块 文件 driver one 电话 XML
原文地址:https://www.cnblogs.com/yscec/p/11986700.html