【java框架】JPA(1)--JPA⼊门
1. JPA认识
JPA是Java Persistence API的简称,它是Sun公司在充分吸收现有ORM框架(Hibernate)的基础上,开发⽽来的⼀个Java EE 5.0平台标准的开源的对象关系映射(ORM)规范。
Hibernate与JPA的关系:
Hibernate是⼀个开放源代码的对象关系映射(ORM)框架,它对JDBC进⾏了⾮常轻量级的对象封装,将POJO与数据库表建⽴映射关系,是⼀个全⾃动的ORM框架,Hibernate可以⾃动⽣成SQL语句,⾃动执⾏,使Java程序员可以随⼼所欲地使⽤⾯向对象思维来操纵数据库。⽽JPA是Sun官⽅提出的Java持久化规范,⽽JPA是在充分吸收Hibernate、TopLink等ORM框架的基础上发展⽽来的。
总结⼀句话就是:JPA是持久化的关系映射规范、接⼝API,⽽Hibernate是其实现。
1.1. JPA的优缺点
优点:
①操作代码很简单,插⼊—persist、修改—merge、查询—find、删除—remove;
②直接⾯向持久化对象操作;
③提供了世界级的数据缓存:包括⼀级缓存、⼆级缓存、查询缓存;
④切换数据库移植性强,对应各种数据库抽取了⼀个⽅⾔配置接⼝,换数据库只需修改⽅⾔配置、驱动jar包、数据库连接4个信息即可。缺点:
①不能⼲预SQL语句的⽣成;
②对于SQL优化效率要求较⾼的项⽬,不适合使⽤JPA;
③对于数据量上亿级别的⼤型项⽬,也不适合使⽤JPA。
2. ⼿动创建⼀个Hello World的JPA项⽬
2.1. 导⼊JPA项⽬所需jar包
这⾥作为学习使⽤Hibernate 4.3.8的版本jar包,即JPA2.1版本为例进⾏项⽬jar包的构建:
导⼊项⽬所需要的Hibernate的jar包分为三类:
① Hibernate所必需的jar包:
⽬录路径位置:\hibernate-release-4.3.8.Final\lib\required
导⼊如下图所⽰jar包集合:
②还需要导⼊JPA⽀持的jar包,⽬录路径:\hibernate-release-4.3.8.Final\lib\jpa与数据库Mysql连接驱动jar包;
2.2. 配置核⼼配置⽂件l
配置⽂件必需放在项⽬的classpath⽬录的资源⽂件resources\META-INF⽬录下(JPA规范要求);
<persistence xmlns="java.sun/xml/ns/persistence" xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="java.sun/xml/ns/persistence java.sun/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<!--持久化单元 name:和项⽬名称对应-->
<persistence-unit name="cn.yif.jpa01" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 必须配置4个连接数据库属性:配置信息可以在project/etc/hibernate.properties中到 -->
<property name="tion.driver_class" value="sql.jdbc.Driver"/>
<property name="tion.url" value="jdbc:mysql:///jpa01_0307"/>
<property name="tion.username" value="root"/>
<property name="tion.password" value="admin"/>
<!-- 必须配置1个数据库⽅⾔属性 -->
<!-- 实现跨数据库关键类 :查询MySQLDialect的getLimitString⽅法 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <!-- 可选配置 -->
<!-- 是否⾃动⽣成表 -->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!-- 是否显⽰sql -->
<property name="hibernate.show_sql" value="true"/>
<!-- 格式化sql -->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
2.3.创建持久化Domain类Employee
package cn.yif.domain;
import javax.persistence.*;
//@Entity表⽰该类是由jpa管理的持久化对象,对应数据库中的⼀张表
@Entity
//@Table表⽰对应数据库的表名
@Table(name = "t_employee")
public class Employee {
//@Id是必须的注解,表⽰对应数据库的主键
@Id
//@GeneratedValue表⽰主键的⽣成策略,多数都是使⽤AUTO
//@GeneratedValue默认不配置也是AUTO
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
//@Column表⽰如果数据库列名与属性名不⼀致,需要配置
@Column(name = "e_name")
private String name;
@Column(name = "e_age")
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Employee{" +
java的基本框架"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.4.创建Junit4测试类代码
import cn.yif.domain.Employee;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JPAHelloTest {
@Test
public void testInsertEmpByJPA(){
Employee employee = new Employee();
employee.setName("⾼伟翔");
employee.setAge(34);
// 对应配置⽂件⾥⾯的persistence-unit name="cn.yif.jpa01"
// 通过持久化类创建⼀个实体类管理⼯⼚
EntityManagerFactory entityManagerFactory = ateEntityManagerFactory("cn.yif.jpa01");
//创建⼀个实体管理类,可以实现CRUD
EntityManager entityManager = ateEntityManager();
//由entityManager来开启事务
EntityTransaction transaction = Transaction();
transaction.begin();
//持久操作CRUD 写⼊persist
entityManager.persist(employee);
// 提交事务
transactionmit();
//关闭资源
entityManager.close();
entityManagerFactory.close();
}
}
通过以上的步骤,就可以在创建的jpa01_0307数据库⾥⾯由JPA⾃动创建⼀张t_employee表并插⼊⼀条数据:
3. 实现完整的JPA CRUD流程
3.1.抽取JPAUtil类
package cn.yif.utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* ⼯具类:单例模式/静态单例模式静态⽅法
*/
public class JPAUtil {
// 私有化这个构造器,不让其它⼈创建这个类
private JPAUtil(){}
// 实体管理⼯⼚
/
/ 注意:EntityManagerFactory这个类是线程安全
private static EntityManagerFactory entityManagerFactory;
/**
* 静态代码块,类加载的时候就会执⾏⾥⾯的代码,只会执⾏⼀次
*/
static{
try {
entityManagerFactory = ateEntityManagerFactory("cn.yif.jpa01");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("拿到EntityManagerFactory运⾏时出错:"+e.getMessage());
}
}
// 拿到⼀个EntityManager对象
// 每次拿EntityManager都需要重新创建(EntityManager不是线程安全的对象,每次使⽤都重新创建⼀次)
public static EntityManager getEntityManager(){
ateEntityManager();
}
public static void close(EntityManager entityManager){
//关闭资源
entityManager.close();
entityManagerFactory.close();
}
}
4. l中hibernate.hbm2ddl.auto属性值配置
如上,hibernate.hbm2ddl.auto属性的value值⼀共有4种配置:create-drop、create、update、validate。下⾯来解释这四种不同配置场景的区别与作⽤:
① create-drop
create-drop作⽤:先删除表,在创建表,最后再删除表;
注意:必须执⾏entityManagerFactory.close()代码才会最后删除表,执⾏drop表功能
② create
create作⽤:先删除表,在创建表。
③ update
update作⽤:
如果数据库中没有当前JPA持久化的表就根据最新映射来创建表;
如果数据库已经有表了,则不会删除原来表的任何结构,只会新增列;
注意如果是表⾥⾯没有这个属性,映射信息domain类中有,则会增加这个属性
④ validate
validate作⽤:
如果数据库中表不存在或者domain类中的属性⼤于数据库表中的字段,会抛出异常;
会验证映射信息domain类与数据库表中的对应字段,如果⼀⼀对应或者映射⼩于数据库表中的字段,不会抛出异常
5. 单表映射配置细节
5.1.持久类domain映射配置细节
5.1.1. ⽇期与时间类型格式
①⽇期与时间格式配置
使⽤@Temporal注解配置:
@Temporal(TemporalType.TIMESTAMP)
默认配置,会设置数据库表的时间格式为:“yyyy-MM-dd hh:mm:ss"
@Temporal(TemporalType.DATE)
会设置数据库表的时间格式为:”yyyy-MM-dd"
@Temporal(TemporalType.TIME)
会设置数据库表的时间格式为:“hh:mm:ss”
持久类domain配置
@Temporal(TemporalType.TIMESTAMP)
private Date createTime; // 创建时间:格式--"yyyy-MM-dd hh:mm:ss"(年--⽉--⽇--时--分--秒)
@Temporal(TemporalType.DATE)
private Date brithday; // ⽣⽇:格式--"yyyy-MM-dd"(年--⽉--⽇)
@Temporal(TemporalType.TIME)
private Date classTime; // 上课时间:格式--"hh:mm:ss""(时--分--秒)
具体设置格式如下:
5.1.2. ⽂本长度与长⽂本类型
domain类对应普通表中的长度如果不配置长度,默认vachar字段类型在数据库表中的长度会给到255,⽐较占⽤空间,我们可以通过JPA注解配置来指定固定的length长度值。
普通String类属性字段长度配置:
@Column(name = "t_name", length = 20)
@Column(name = "pwd", length = 100)
在@Column注解上加上length长度配置,即可指定数据库表中varchar字段的长度;
长⽂本类型属性字段配置:
在对应domain类的属性上加上注解@Lob,对应这个字段在数据库中就会被设置成longtext类型,能储存⼤⽂本。
持久类domain配置
@Lob // 设置为长⽂本类型
private String Intro; // 个⼈简介:长⽂本类型
5.1.3. 属性约束设置
⾮空约束:
配置@Column(nullable = false)
唯⼀约束:
配置@Column(unique = true)
5.1.4. 其他映射配置
①临时属性配置:Transient(临时属性—该属性在持久化对象上有,但是不会写⼊数据库);
@Transient
private String temp;
②设置是否能更新able:@Column(updatable=false),表⽰添加的时候会进⾏添加,但是修改的时候不能修改(了解就⾏,⼀般不⽤);
③设置是否能添加able:@Column(insertable=false),表⽰添加的时候不能操作,但是修改的时候可以操作修改(了解就⾏,⼀般不⽤);
④⾃定义持久类domain属性规则:@Column(columnDefinition=”int check(age > 18)”),Mysql不⽀持这个规则,Oracle才⽀持(了解就⾏,Mysql数据库⽤不了)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论