spring-data-jpa orm思想和hibernate以及jpa的概述和jpa的基本操作(1)

orm思想

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

  2. 建立两个映射关系:

    实体类和表的映射关系
    实体类中属性和表中字段的映射关系
    不再重点关注:sql语句

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

hibernate框架介绍

Hibernate是一个开放源代码的对象关系映射框架,
它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架

JPA规范

jpa规范,实现jpa规范,内部是由接口和抽象类组成

jpa的基本操作

案例:是客户的相关操作(增删改查)
客户:就是一家公司
客户表:

 /*创建客户表*/
CREATE TABLE cst_customer (
  cust_id bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  cust_name varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  cust_source varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  cust_industry varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  cust_level varchar(32) DEFAULT NULL COMMENT '客户级别',
  cust_address varchar(128) DEFAULT NULL COMMENT '客户联系地址',
  cust_phone varchar(64) DEFAULT NULL COMMENT '客户联系电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

jpa操作的操作步骤

  1. 加载配置文件创建实体管理器工厂
    Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
    createEntityMnagerFactory(持久化单元名称)

    EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
    

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

  2. 根据实体管理器工厂,创建实体管理器
    EntityManagerFactory :获取EntityManager对象
    方法:createEntityManager

    EntityManager em = factory.createEntityManager();
    

    内部维护的很多的内容

    • 内部维护了数据库信息,
    • 维护了缓存信息
    • 维护了所有的实体管理器对象
    • 再创建EntityManagerFactory的过程中会根据配置创建数据库表
    • EntityManagerFactory的创建过程比较浪费资源

    特点:线程安全的对象
    多个线程访问同一个EntityManagerFactory不会有线程安全问题
    如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?

    思路:创建一个公共的EntityManagerFactory的对象,静态代码块的形式创建EntityManagerFactory

  3. 创建事务对象,开启事务
    EntityManager对象:实体类管理器

     EntityTransaction tx = em.getTransaction();
     
    
     presist : 保存
     merge  : 更新
     remove : 删除
     find/getRefrence : 根据id查询
    

    Transaction 对象 : 事务

     tx.begin();
     begin:开启事务
     commit:提交事务
     rollback:回滚
    

    4.增删改查操作
    5.提交事务
    6.释放资源

搭建环境的过程

  1. 创建maven工程导入坐标

  2. 需要配置jpa的核心配置文件
    *位置:配置到类路径下的一个叫做 META-INF 的文件夹下
    *命名:persistence.xml

     <?xml version="1.0" encoding="UTF-8"?>
     <persistence xmlns="http://java.sun.com/xml/ns/persistence"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
          version="2.0">
      <!--配置持久化单元
     name:持久化单元名称
     transaction-type:事务类型
          RESOURCE_LOCAL:本地事务管理
          JTA:分布式事务管理 -->
     <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
     <!--配置JPA规范的服务提供商 -->
    	 <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
     <properties>
         <!-- 数据库驱动 -->
         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
         <!-- 数据库地址 -->
         <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
         <!-- 数据库用户名 -->
         <property name="javax.persistence.jdbc.user" value="root" />
         <!-- 数据库密码 -->
         <property name="javax.persistence.jdbc.password" value="111111" />
    
         <!--jpa提供者的可选配置:
         我们的JPA规范的提供者为hibernate,所以jpa的核心配置中兼容hibernate的配
         hibernate.hbm2ddl.auto
             create程序执行时,创建数据库表(如果有表,删除表)
             update程序执行时,创建数据库表(如果有表,不创建表)
             none不会创建任何数据库表(数据库有表,可以正常运行,没有表则报错)
         -->
         <property name="hibernate.show_sql" value="true" />
         <property name="hibernate.format_sql" value="true" />
         <property name="hibernate.hbm2ddl.auto" value="" />
     </properties>
    
  1. 配置实体类和表,类中属性和表中字段的映射关系

     package cn.itcast.domain;
     import javax.persistence.*;
     /**
      * 客户的实体类
      *      配置映射关系
      *   1.实体类和表的映射关系
      *      @Entity:声明实体类
      *      @Table : 配置实体类和表的映射关系
      *          name : 配置数据库表的名称
      *   2.实体类中属性和表中字段的映射关系
      */
     @Entity
     @Table(name = "cst_customer")
     public class Customer {
     	 @Id
     	 @GeneratedValue(strategy = GenerationType.IDENTITY)
     	 @Column(name = "cust_id")
     	 private int custId; //客户的主键
     
         @Column(name = "cust_name")
         private String custName;//客户名称
     
         @Column(name="cust_source")
         private String custSource;//客户来源
     
         @Column(name="cust_level")
         private String custLevel;//客户级别
     
         @Column(name="cust_industry")
         private String custIndustry;//客户所属行业
     
         @Column(name="cust_phone")
         private String custPhone;//客户的联系方式
     
         @Column(name="cust_address")
         private String custAddress;//客户地址
     }
    

    @Id:声明主键的配置
    @GeneratedValue:配置主键的生成策略
    strategy

    1. GenerationType.IDENTITY :自增,mysql
      底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
    2. GenerationType.SEQUENCE : 序列,oracle
      底层数据库必须支持序列
    3. GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
    4. GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略

    @Column:配置属性和字段的映射关系
    name:数据库表中字段的名称

  2. 保存客户到数据库中

    • persist : 保存

        @Test
        public void testSave(){
            EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
            EntityManager em = factory.createEntityManager();
            EntityTransaction tx = em.getTransaction();
            tx.begin();
            Customer customer = new Customer();
            customer.setCustName("传智播客");
            customer.setCustIndustry("教育");
            em.persist(customer);
            tx.commit();
            em.close();
            factory.close();
            }
      
    • merge : 更新

    • remove : 删除

    • find/getRefrence : 根据id查询

  3. jpql查询
    sql:查询的是表和表中的字段
    jpql:查询的是实体类和类中的属性
    jpql和sql语句的语法相似

    • 查询全部

      String jpql = "FROM cn.itcast.domain.Customer";
      //query才是真正执行jpql的对象
      Query query = em.createQuery(jpql);
      //发送查询,并封装结果集
      List list = query.getResultList();
      
    • 分页查询

      String jpql = "from  Customer";
      Query query = em.createQuery(jpql);
      query.setFirstResult(0);
      query.setMaxResults(2);
      
    • .统计查询

      String jpql = "select count(custId) from  Customer";
      Query query = em.createQuery(jpql);
      Object count = query.getSingleResult();
      System.out.println("总记录数:"+count);
      
    • 条件查询

       String jpql = "from  Customer where custName like ?";
       Query query = em.createQuery(jpql);
       //第一个参数:占位符的索引位置(从1开始)
       //第二个参数:取值
       query.setParameter(1,"????-%");
       //发送查询,并封装结果集
       List list = query.getResultList();
      
    • 排序

      String jpql = "FROM cn.itcast.domain.Customer order by custId desc";
      Query query = em.createQuery(jpql);
      List list = query.getResultList();
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值