首页 > 技术文章 > JPA--java操作数据库框架

kingofjava 2019-04-24 12:19 原文

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

年月日,时分秒

年月日

时分秒

推荐阅读