• JPA案例


    ORM

    什么是ORM:

    对象关系映射(Object Relational Mapping,简称ORM)是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。

    ORM思想

    主要目的:操作实体类就相当于操作数据库表

    建立两个映射关系:

    • 实体类和表的映射关系
    • 实体类中性和表中字段的映射关系

    不再重点关注: SQL语句

    实现了ORM思想的框架:mybatis,hibernate

    JPA规范

    使用JPA规范完成数据库操作,底层需要hibernate作为其实现类完成数据持久化工作。

    JPA基本操作 >>案例:客户的增删改查

     

     创建maven工程导入坐标

     1 <properties>
     2         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     3         <project.hibernate.version>5.0.7.Final</project.hibernate.version>
     4     </properties>
     5 
     6     <dependencies>
     7         <dependency>
     8             <groupId>junit</groupId>
     9             <artifactId>junit</artifactId>
    10             <version>4.12</version>
    11             <scope>test</scope>
    12         </dependency>
    13 
    14         <dependency>
    15             <groupId>org.hibernate</groupId>
    16             <artifactId>hibernate-entitymanager</artifactId>
    17             <version>${project.hibernate.version}</version>
    18         </dependency>
    19 
    20         <dependency>
    21             <groupId>org.hibernate</groupId>
    22             <artifactId>hibernate-c3p0</artifactId>
    23             <version>${project.hibernate.version}</version>
    24         </dependency>
    25 
    26         <dependency>
    27             <groupId>log4j</groupId>
    28             <artifactId>log4j</artifactId>
    29             <version>1.2.17</version>
    30         </dependency>
    31 
    32         <dependency>
    33             <groupId>mysql</groupId>
    34             <artifactId>mysql-connector-java</artifactId>
    35             <version>5.1.6</version>
    36         </dependency>
    37         <dependency>
    38             <groupId>org.projectlombok</groupId>
    39             <artifactId>lombok</artifactId>
    40             <version>1.18.8</version>
    41         </dependency>
    42 
    43     </dependencies>

    JPA的核心配置:persistent.xml内容

     

    配置persistent-unit节点:持久化单元

    <persistence-unit name="" transaction-type="RESOURCE_LOCAL"></persistence-unit>
    • name:持久化单元名称
    • transaction-type:事务处理方式
    1. JTA:分布式事务管理(不同的表分散在不同数据库,一个数据库一个链接)
    2. RESOURCE_LOCAL:本地事务管理(多个表存在一个数据库中)

    jpa的实现方式

    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

     数据库信息

    • 用户名:javax.persistence.jdbc.user
    • 密码:javax.persistence.jdbc.password
    • 驱动:javax.persistence.jdbc.driver
    • 数据库地址:javax.persistence.jdbc.url
    1 <properties>
    2             <property name="javax.persistence.jdbc.user" value="root"></property>
    3             <property name="javax.persistence.jdbc.password" value="123456"></property>
    4             <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"></property>
    5             <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"></property>
    6         </properties>

    配置jpa实现方(hibernate)的配置信息

    • 显示sql:false | true
    <property name="hibernate.show.sql" value="true"></property>  
    •  自动创建数据库表:hibernate.hbm2ddl.auto
    <property name="hibernate.hbm2ddl.auto" value="create"></property>
    1.  create:程序运行时创建数据库表(如果有表,先删除表再创建)
    2. update:程序运行时不会创建表(如果有表,不会创建表)
    3. none:不会创建表

    编写客户的实体类

     1 package cn.itcast.domain;
     2 
     3 import lombok.Data;
     4 
     5 @Data
     6 public class Customer {
     7 
     8     private Long custid;//客户的主键
     9     private String custname;//户名称
    10     private String custsource;//客户来源
    11     private String custlevel;//客户级别
    12     private String custindustry;//客户所属行业
    13     private String custphone;//客户的联系方式
    14     private String custaddress;//容户地址
    15 
    16 }

     小知识(@Data)添加lombok依赖,即可实现setter和getter方法

    使用ipa注解配置映射关系

    • @Entity:声明实体类
    • @Table:配宣实体类和表的映关系

    name:配置数据库表的名称

    @Entity
    @Table(name ="cst_customer")
    • @Id:声明主键的配置
    • @GenneratedValue:配置主键的生成策略

    GennerationType.IDENTITY:自增

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long custid;//客户的主键
    • @Column:配置属性和字段的映射关系

    name属性:数据库表中字段名称

    @Column(name = "cust_name")
    private String custname;//客户名称

     JPA操作步骤

     1 public class JpaTest {
     2     @Test
     3     public void testSave() {
     4         //1.加载配置文件创建工厂(实体理器工厂)对象
     5         EntityManagerFactory factory= Persistence.createEntityManagerFactory("myJpa");
     6         //2.通过实体管理器工厂获取实体管理器
     7         EntityManager em=factory.createEntityManager();
     8         //3,获取事务对家,开启事务
     9         EntityTransaction tx=em.getTransaction();//获取事务对象
    10         tx.begin();//开启事务
    11         //4.完成增删改查操作,保存一个客户到数据库中
    12         Customer customer = new Customer();
    13         customer.setCustname("传智");
    14         customer.setCustindustry("教育");
    15         //保存
    16         em.persist(customer);
    17         //5.提交事务
    18         tx.commit();
    19         //6.释放资源
    20         em.close();
    21         factory.close();
    22     }
    23 }
    1.  加载配置文件创建实体管理器工厂

       persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)

      createEntityManagerFactory(持久化单元名称)

    作用:创建实体管理器工厂

      2.根据实体管理器工厂

      EntityManagerFactory:获取EntityManager对象

    方法:createEntityManager

    内部维护了数据库信息、缓存信息,所有的实体管理器对象,在创建EntityManagerFactory的过程中会根据配置创建数据库表

     特点:线程安全

        多个线程访问同一个EntityManagerFactory不会有线程安全问题

    EntityManagerFactory的创建过程比较浪费资源,可以先创建一个工具类,通过静态代码块的方式,当程序第一次访问此工具类时,创建一个公共的EntityManagerFactory对象,从而解决资源浪费和耗时问题

      

     1 package cn.itcast.utils;
     2 
     3 import javax.persistence.EntityManager;
     4 import javax.persistence.EntityManagerFactory;
     5 import javax.persistence.Persistence;
     6 
     7 public class JpaUtils {
     8     private static EntityManagerFactory factory;
     9 
    10     static {
    11         //1.加载配置文件,创建EntityManagerFactory对象
    12         factory = Persistence.createEntityManagerFactory("myJpa");
    13     }
    14 
    15     /*
    16      * 获取entityManager对象
    17      * 第一次访问getEntityManager方法,经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象
    18      * 第二次访问getEntityManager方法,直接通过一个已经创建好的factory对象,创建EntityManager对象
    19      */
    20     public static EntityManager getEntityManager() {
    21         return factory.createEntityManager();
    22     }
    23 }

      3.创建事务对象,开启事务

      > > 借助entityManager对象:实体类管理器

      方法:

    • beginTransaction:创建事务对象,开启事务
    • presist: 保存
    • merge:更新
    • remove:删除
    • find / getRefrence:根据id查询

      使用find方法查询(立即加载):

        1.查询的对象就是当前客户对象本身

        2.在调用find方法的时候,就会发送sq1语句查询数据库

       使用getReference方法查询 >>最常用( 懒加载 

        1.获取的对象是一个动态代理对象
        2.调用getReference方法不会立即发送sq1语句查询数据库
        3.当调用查询结果对象的时候,才会发送查询的sq1语句:什么时候用,什么时候发送sql语句去数据库查询

      Transaction对象:事务

    • begin:开启事务
    • commit:提交事务
    • rollback:回滚事务

      4.增删改查操作(查询)

      5.提交事务

     1 @Test
     2     public void testFind(){
     3         //1.通过工具类获取entityManager
     4         EntityManager entityManager = JpaUtils.getEntityManager();
     5         //2.开启事务
     6         EntityTransaction tx = entityManager.getTransaction();
     7         tx.begin();
     8         //3.增删改查,字节码>>查询出的对象想封装成什么对象,就填写谁的字节码, 1l >>表示长整形的1
     9         Customer customer = entityManager.find(Customer.class,1l);
    10         System.out.println(customer);
    11         //4.提交事务
    12         tx.commit();
    13         //5.释放资源
    14         entityManager.close();

     

  • 相关阅读:
    指针
    《算法图解》3
    《算法图解》2
    Python缩进
    linux_01_seq_shuf_sort
    centos yum 切换阿里源
    Python csv 跳过第一行 去除表头 读取文件内容
    C语言结构体内存分析
    shell csv导入mysql ERROR 1292 (22007) at line 1: Incorrect datetime value: '' for column 解决方案
    代码实现:数据结构之数组当中唯一的k个数 k=1,2
  • 原文地址:https://www.cnblogs.com/xiaozhongfeixiang/p/11451784.html
Copyright © 2020-2023  润新知