SpringDataJpa(一) JPA概述

SpringDataJpa(一) JPA概述

1.orm思想

ORM(Object-Relational Mapping) 对象关系映射
主要目的: 实体类与数据库表建立关联,操作实体类就相当于操作数据库,不再重点关注sql语句,使得java程序员可以用面向对象的思维随心所欲的操纵数据库

  • 实体与数据库表的映射
  • 实体类中属性与表中字段的映射关系

实现了ORM思想的框架: Hibernate, Mybatis…

2.JPA 概述

JPA(Java Persistence API) java 持久化API, 是SUN公司推出的基于ORM思想的规范,内部有一些列接口和抽象类,没有实现类是一套规范

  • 市面上实现ORM思想的框架有很多,程序员要用哪个框架就要先学习框架的使用,太过麻烦,SUN公司为了统一,推出了JPA规范,Hibernate也是实现JPA规范的一个框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFvgrIzW-1581691813557)(./QQ截图20200214193708.png)]

JPA和Hibernate 的关系就像 JDBC 和JDBC 驱动的关系, JPA是接口,Hibernate是实现

3.JPA 入门CRUD

3_v1_搭建环境
  • 创建maven工程,导入依赖
  • 配置JPA 核心配置文件
  • 创建实体类
  • 配置实体类和表的映射
  • 测试CRUD 操作
3_v2_创建maven工程,导入依赖
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.hibernate.version>5.0.7.Final</project.hibernate.version>
    </properties>

    <dependencies>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate对jpa的支持包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- log日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- Mysql and MariaDB -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
    </dependencies
3_v3_配置jpa核心配置文件
  • 位置: 类路径下META-INF 文件夹下
  • 命名: persistence.xml
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EoXd3Jrg-1581691813561)(./QQ截图20200214223656.png)]
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <!--
        persistence-unit: 持久化单元
           name:持久化单元名称(自定义)
           transaction-type:事务管理的方式
               JTA: 分布式事务管理(表不在同一张数据库中)
               RESOURCE_LOCAL: 本地事务管理

    -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">

        <!--1.jpa 实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!--
              2.数据库信息配置
              驱动:javax.persistence.jdbc.driver
              url: javax.persistence.jdbc.url
              用户名:javax.persistence.jdbc.user
              密码:javax.persistence.jdbc.password
              characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
            -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>

            <!--
                3.可选配置,jpa实现方(本案例为hibernate)配置
                打印sql语句: hibernate_show_sql  true|false
                自动建表:hibernate.hbm2ddl.auto
                    create:  程序运行时创建表(如果表存在,先删除表,再重新创建表)
                    update:  程序运行时创建表(如果表存在,不创建)
                    none: 不创建表
            -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>

        </properties>


    </persistence-unit>
</persistence>

3_v4 编写实体类以及建立与表的映射

数据库表结构

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;

Customer 实体类
1.实体类与表的映射

  • @Entity: 指定当前类是实体类。
  • @Table:指定实体类和表之间的对应关系。
    • name: 指定要关联的数据库表的名称

2.实体类中属性与表中字段的映射

  • @Id: 指定当前字段是主键。
  • @GeneratedValue: 指定主键的生成方式
    • strategy: 生成策略
    • GenerationType.IDENTITY:  自增
      • 底层数据库必须支持自动增长 mysql
    • GenerationType.SEQUENCE:   序列
      • 底层数据库必须支持序列 oracle
    • GenerationType.TABLE:  jpa提供的一种机制,通过维护一张数据表的形式帮助我们完成主键自增
    • GenerationType.AUTO: 由程序自动的帮助我们选择主键生成策略
  • @Column: 指定实体类属性和数据库表字段之间的对应关系
    • name: 指定数据库表的字段名称。
    • unique: 是否唯一
    • nullable: 是否可以为空
    • inserttable: 是否可以插入
    • updateable: 是否可以更新
    • columnDefinition: 定义建表时创建此列的DDL
    • secondaryTable: 从表名。
/**
 *   1.实体类与表的映射
 *      @Entity: 声明实体类
 *      @Table: 配置实体类与表的映射关系
 *         name:表的名称
 *   2. 实体类中属性与表字段的映射
 *
 */
@Entity
@Table(name = "cst_customer")
public class Customer {

    /**
     *  配置主键映射
     *      @id: 声明该属性与表中的主键对应
     *      @GeneratedValue:  主键生成策略
     *      @Column: 与表中的哪个字段对应
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private Long custId;  //客户编号

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

    @Column(name = "cust_source")
    private String custSource;  //客户来源

    @Column(name = "custIndustry")
    private String custIndustry;  //客户所属行业

    @Column(name = "cust_level")
    private String custLevel;   //客户级别

    @Column(name = "cust_phone")
    private String custPhone;  //客户联系电话

    @Column(name = "cust_address")
    private String custAddress;  //客户地址
    
}
3_v5 测试CRUD

jpa 操作步骤:
      1.加载JPA核心配置文件,创建实体管理器工厂对象
      2.通过实体管理器工厂,创建实体管理器
      3.获取事务对象,开启事务
      4.完成增删改查操作
      5.提交事务(回滚事务)
      6.关闭资源

save 操作测试

/**
 * jpa 操作步骤:
 *     1.加载JPA核心配置文件,创建实体管理器工厂对象
 *     2.通过实体管理器工厂,创建实体管理器
 *     3.获取事务对象,开启事务
 *     4.完成增删改查操作
 *     5.提交事务(回滚事务)
 *     6.关闭资源
 */
public class JpaTest {

    @Test
    public void test_save(){
        //1.通过jpa 持久化名称加载配置类,创建实体管理器工厂对象
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myJpa");

        //2.通过实体管理器工厂创建实体管理器
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        //3.获取事务对象,开启事务
        EntityTransaction tx = entityManager.getTransaction();  //获取事务对象
        tx.begin();//开启事务

        //4.进行操作
        Customer customer = new Customer();
        customer.setCustName("haha");
        customer.setCustAddress("北京");

        //将对象数据保存到 数据库中
        entityManager.persist(customer);

        //5.提交事务
        tx.commit();

        //6.关闭资源
        entityManager.close();  //先关闭管理器
        entityManagerFactory.close();  //再关闭工厂
    }
}
发布了47 篇原创文章 · 获赞 7 · 访问量 2335

猜你喜欢

转载自blog.csdn.net/qq_43616898/article/details/104321376