JPA--java操作数据库框架

1.JPA

1.1.什么是JPA

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

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

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

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

         (5)JPA直接面向持久对象操作

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

1.4.ORM概念

Object Relational Mapping, 对象关系映射

ORM 就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作

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实体化管理工厂对象(传入持久化单元名)

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时间设置

年月日,时分秒

年月日

时分秒

猜你喜欢

转载自www.cnblogs.com/kingofjava/p/10761647.html