JPA--java操做数据库框架

1.JPA

1.1.什么是JPA

JPA是JPAJPA开发效率高,运行效率低php

         (2)JDBC开发效率低,运行效率高(更接近底层,代码繁琐)java

         (3)JPA兼容各类数据库(方便移植)mysql

         (4)JPA有内置缓存(性能在必定程度上有所优化)sql

         (5)JPA直接面向持久对象操做数据库

         (6)JPA不能干涉SQL的生成缓存

1.4.ORM概念

Object Relational Mapping, 对象关系映射安全

ORM 就是经过将Java对象映射到数据库表,经过操做Java对象,就能够完成对数据表的操做app

2.JPA程序搭建

2.1.建立一个普通Maven项目

2.2.在pom.xml中配置须要的jar包

2.3.引入persisten.xml文件

2.4.配置persisten.xml

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> <!-- 持久化单元,能够有多个 RESOURCE_LOCAL:本地的事物 JTA:分布式系统要使用的事物 --> <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL"> <properties> <!--四个链接数据库的属性--> <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3307/jpa"/> <property name="hibernate.connection.username" value="root"/> <property name="hibernate.connection.password" value="zy214214~"/> <!--方言属性:要操做的数据库,根据不一样的方言拼接不一样的SQL--> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> <!--可选属性--> <!--自动生成表 create-drop:删 → 建 → 执行CRUD → 删 create:删 → 建 → 执行CRUD update:没有表则建表 有表则在原来表的基础上修改表结构(只加不减,不应类型) validate:验证(只验证domain中已有的数据) none:什么都不作 --> <property name="hibernate.hbm2ddl.auto" value="create"/> <!--是否在控制台显示sql--> <property name="hibernate.show_sql" value="true"/> <!--格式化sql:sql在控制台显示的格式--> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence> 

2.5.domain配置

/** * @Entity 表示由一个jpa管理的持久对象,对应数据库中的一张表 * @Table 设置表名 */ @Entity @Table(name = "t_employee") public class Employee { /** * @Id 表示主键 * @GeneratedValue 表示主键自动递增 */ @Id @GeneratedValue private Long id; private String name; private String password; // getter/setter略 } 

3.CRUD

3.1.基本操做流程

         (1)获取EntityManagerFactory实体化管理工厂对象(传入持久化单元名)dom

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");
(2)经过EntityManagerFactory对象获取实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
3增删改须要提交事务

// 执行CRUD
// 提交事务
entityManager.getTransaction().commit();
分布式

// 事物提交失败,回滚 entityManager.getTransaction().rollback();
4)关闭资源(实体管理对象)
// 关闭实体管理对象 entityManager.close();

3.2.新增

// 执行新增操做
entityManager.persist(employee);

3.3.删除

// 若是数据库有数据
if (employee != null) {
    // 执行删除操做
    entityManager.remove(employee);
}

3.4.查找单条数据

// 执行查询操做
return entityManager.find(Employee.class, id);

3.5.查找全部数据

// 执行查询操做  // 须要写一个jpql语句  // 简写1 // String jpql = "select o from Employee o"; // 简写2 // String jpql = "from Employee"; // (推荐写法) String jpql = "select x from cn.meco.jpa.domain.Employee x"; // 获取query对象 Query query = entityManager.createQuery(jpql); // 获取List集合 return query.getResultList();

3.6.修改

employeeDao.update(employee);

 

// 执行修改操做
entityManager.merge(employee);

4.重要API

4.1.Persisten

  • 解析相应的核心配置文件
  • 建立EntityManagerFactory对象

4.2.EntityManagerFactory

线程安全对象,重量级对象

一个应用程序对应一个EntityManagerFactory:一个数据库(1:1:1

(1)数据库配置信息它里面有一个链接池(自己就重,建立与销毁太费时间)

         (2)二级缓存(查询缓存,...)

         (3)预约义的JPQL语句(JPQL,SQL)

         (3)全部实体及关系

4.3 EntityManager

         (1)轻量级对象

         (2)线程不安全

         (3)提供CRUD

         (4)内置一级缓存

一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID

4.4. EntityTransaction

  • EntityManager只有这一个事务
  • 若是多个系统/多个数据库 使用JTA

5.映射细节

5.1 .@Column

// 在表中列名为pid
private Long id;

5.2.@Lob

大文本,能够装不少数据

5.3.@Transient

         临时属性(JPA不会管理这个属性)

5.4.@Temporal时间设置

年月日,时分秒

年月日

时分秒

相关文章
相关标签/搜索