1.什么是JPA
(1) 1. JPA是Java Persistence API的简称
(2) 2. JPA是java持久化规范 【jpa就是一个规范】
(3) 3. ORM Object Relational Mapping【对象关系映射】
2.Hibernate和JPA的关系
Hibernate 是对JPA规范的实现,是一个轻量级的框架
3.JPA优点与缺点
优点
1. 程序员操作很简单,代码简单 entityManager.persist(employee);
2. 直接面向持久对象操作
3. 提供世界级数据缓存(现在几乎所有的ORM框架的缓存都是学的Hibernate)
一级缓存,二级缓存,查询缓存(空间换速度)
4. 数据库移植性很强,很少的修改(通过配置方言搞定)
把各种数据库抽取了一个方言接口
不同数据库实现一个方言接口,如果换了数据库,必须修改方言实现,驱动jar文件,连接数据库信息。
缺点
1.不能干预sql语句的生成
2.一个项目中,如果对sql语句的优化要求比较高,不适合用JPA(不过可以使用JPA对原生sql的支持来解决)
3.如果一张表中有上亿级别的数据量,也不适合用JPA,其实也不适合用jdbc(可以使用数据库读写分离,分库分表方案解决)。
4.创建第一个JPA项目
重点
(1)pom.xml文件的配置【重点配置依赖文件】
</dependency>
<!-- hibernate对于jpa的支持包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.8.Final</version>
</dependency>
<!-- mysql的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- junit的测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<finalName>pss</finalName>
<plugins>
<plugin>
<!-- Maven的编译插件-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
注意: 配置结束以后检查相应的包是否出现,没有相应的jar包就刷新并联网
(2)persistance.xml 【核心配置文件】
<persistence-unit name="cn.itsource.jpa" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 必须配置4个连接数据库属性 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.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>
5.CRUD功能的实现
(1)save
这里首先抽取工具类
public class JpaUtil {
private static EntityManagerFactory entityManagerFactory;
/*将实体管理工厂在类加载的时候就创建
*
* 这样可以更方便的获取实体对象
* */
static {
try{
entityManagerFactory = Persistence.createEntityManagerFactory("cn.itsource.jpa");
}catch(Exception e){
throw new RuntimeException("读取文件异常");
}
}
public static EntityManager get(){
return entityManagerFactory.createEntityManager();
}
}
save功能 【 .persist(T) 】
User u = new User();
u.setName("二狗");
//获得事务对象
EntityTransaction transaction = entityManager.getTransaction();
//开启事务
transaction.begin();
//调用添加方法
entityManager.persist(u);
//提交事务
transaction.commit();
//关闭实体对象
entityManager.close();
update 【 merge(T) 】
User u = new User();
u.setId(1);
u.setName("老弟");
//获取事务
EntityTransaction transaction = entityManager.getTransaction();
//开启事物
transaction.begin();
//调用方法实现修改功能 merge(T)
entityManager.merge(u);
//提交事务
transaction.commit();
//关闭实体
entityManager.close();
delete 【 remove(T) 】
//注意,删除操作前需要与 xx 发生关系 所以需要先find
//获取实体,事务,开启事务
User u = new User();
u.setId(1);
entityManager.getTransaction().begin();
//先查询
User user = entityManager.find(User.class, 1);
//如果能插寻到数据 在删除 remove
if(user!=null){
entityManager.remove(user);
}
entityManager.getTransaction().commit();
entityManager.close();
findall 【 createQuery(jpql,User.class); 】
/*需求,查询所有表中的 数据*/
jpql:JPA的查询语言,类似于sql
1.里面不能出现表名,列名,只能出现java的类名,属性名
2.出现的sql关键字是一样的意思,
3.不能写select * 要写select 别名
String jpql = "select u from User u";
//调用查询全部的方法 createQuery(jpql);
Query query = entityManager.createQuery(jpql,User.class);
List<User>list = query.getResultList();
//遍历list获取表中的每一条数据
for (User user : list) {
System.out.println(user);
}
queryone 【 .find(User.class, 3); 】
/*需求,通过主键获取一条数据*/
User user = entityManager.find(User.class, 3);
System.out.println(user);
entityManager.close();
6.持久类映射配置
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; //要求:主键,使用数据库的自动生成策略
@Column(length = 20,nullable=false,unique = true,name = "username")
private String name; //要求:varchar(20),数据库名称为username,不能为空,唯一
private String password;
@Column(insertable = false,columnDefinition = "int(11) default'25'")
private Integer age = 25; //要求:默认值是25,在插入数据时不允许覆盖(添加数据时不操作该字段)
private Boolean sex;// 数据库没有布尔类型,bit对象
@Column(columnDefinition = "decimal(19,2) ")
private BigDecimal salary;// 19,2
@Column(updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;//包含年月日时分秒,不允许修改
@Temporal(TemporalType.DATE)
private Date birthday;//包含年月日
@Temporal(TemporalType.TIME)
private Date time;//包含时分秒
@Lob
private String text;//这是一个大文本
@Transient
private String temp;//这一个字段不要同步到数据库