JPA是JPAJPA开发效率高,运行效率低php
(2)JDBC开发效率低,运行效率高(更接近底层,代码繁琐)java
(3)JPA兼容各类数据库(方便移植)mysql
(4)JPA有内置缓存(性能在必定程度上有所优化)sql
(5)JPA直接面向持久对象操做数据库
(6)JPA不能干涉SQL的生成缓存
Object Relational Mapping, 对象关系映射安全
ORM 就是经过将Java对象映射到数据库表,经过操做Java对象,就能够完成对数据表的操做app
<?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>
/** * @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略 }
(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();
// 执行新增操做
entityManager.persist(employee);
// 若是数据库有数据
if (employee != null) {
// 执行删除操做
entityManager.remove(employee);
}
// 执行查询操做
return entityManager.find(Employee.class, id);
// 执行查询操做 // 须要写一个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();
employeeDao.update(employee);
// 执行修改操做
entityManager.merge(employee);
线程安全对象,重量级对象
一个应用程序对应一个EntityManagerFactory:一个数据库(1:1:1)
(1)数据库配置信息它里面有一个链接池(自己就重,建立与销毁太费时间)
(2)二级缓存(查询缓存,...)
(3)预约义的JPQL语句(JPQL,SQL)
(3)全部实体及关系
(1)轻量级对象
(2)线程不安全
(3)提供CRUD
(4)内置一级缓存
一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID
// 在表中列名为pid
private Long id;
大文本,能够装不少数据
临时属性(JPA不会管理这个属性)
年月日,时分秒
年月日
时分秒