JPA入门

作者: 小杨小杨神采飞杨 | 来源:发表于2020-05-07 22:21 被阅读0次

ORM思想:

主要的目的:使得操作实体类就想操作数据库表一样
实现方式:建立两个映射关系

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

最终效果:使得与数据库的数据交互不在重点关注sql语句

hibername框架简介:

hibername是一个对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库建立了映射关系,是一个全自动封装的ORM框架,hibername可以自动生成sql语句,自动执行,使得程序员无需关注sql语句,随心所欲的调用hibername提供的方法以面向对象的思维进行开发,了解,因为SpringDataJpa底层使用了hibername框架

JPA规范

就像JDBC的规范一样,由官方制定,内部由接口和抽象类组成,不同的厂家根据规范进行不同的实现,我们在使用时,只需要指定对应厂家即可,JPA也是一种规范,有多种实现,SpringDataJpa也只是一种实现方式

JPA规范
JPA规范

JPA基本操作

使用注解或者一点点代码调用JPA规范暴露出来的接口或者抽象类,底层有hibernate实现数据库的交互

以案例入手,快速入门JPA
案例需求:学生表的CRUD操作
1)、环境搭建
创建maven工程,导入依赖

    <dependencies>
        <!--Junit测试相关依赖-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--hibernate对jpa的支持依赖-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.12.Final</version>
        </dependency>
        <!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.14</version>
        </dependency>
        <!--log4j日志的依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--mysql8的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
    </dependencies>

配置jpa的核心配置文件,要求在resources文件夹下创建META-INF文件夹,在内部创建名为persistence.xml的配置文件


文件结构

之后可以右键查看模板创建文件


查看模板
找到jpa的模板,复制黏贴即可
jpa模板

配置详细内容

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <!--配置持久化单元:persistence-unit
        name:持久化单元名称,可自定义
        transaction-type:事务管理方式
            RESOURCE_LOCAL:本地事务管理,当数据表集中在本地的数据库中,需要用此方式管理
            JTA:分布式事务管理,当数据表分布在不同的数据库中,需要用此方式管理
    -->
    <persistence-unit name="jpa01" transaction-type="RESOURCE_LOCAL">
        <!--jpa的实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!--数据源
                用户名、密码、驱动、数据库地址
            -->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="123456"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/student?useUnicode=true&amp;characterEncoding=utf8&amp;serverTimezone=GMT"/>
            <!--可选配置:jpa实现方(hibernate)的一些配置
                在控制台显示生成的sql语句
                自动创建数据库表行为:hibernate.hbm2ddl.auto:
                    create:程序运行时创建表,若表已存在,先删除在创建
                    update:程序运行时创建表,若存在则更新数据
                    none:程序运行时不会创建表
            -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>
    </persistence-unit>
</persistence>

编写数据表对应的实体类

/**
 * 配置映射关系:
 *  实体类和表的映射关系
 *  实体类中属性和表中字段的映射关系
 */
@Data
@Entity //声明此类是一个实体类
@Table(name = "student_info") //实体类和表的映射关系
public class student {
    @Id //设置主键
    @GeneratedValue(strategy = GenerationType.IDENTITY) //设置主键自增
    @Column(name = "sid") //实体类中属性和表中字段的映射关系
    private int sid; //设置主键自增则该主键类型必须为int
    @Column(name = "sname")
    private String sname;
    @Column(name = "sage")
    private int sage;
    @Column(name = "ssex")
    private String ssex;

    public student() {
    }

    public student(String sid, String sname, int sage, String ssex) {
        this.sid = sid;
        this.sname = sname;
        this.sage = sage;
        this.ssex = ssex;
    }
}

2)、测试CRUD操作

public class test {
    /**
     * jpa的操作步骤
     * 1、加载配置文件创建工厂类(实体管理器类工厂)
     * 2、通过实体管理器类工厂创建实体管理器类
     * 3、获取事务对象,开启事务
     * 4、完成CRUD操作
     * 5、提交事务(或回滚事务)
     * 6、释放资源
     */
    @Test
    public void test01() {
        //1、加载配置文件创建工厂类(实体管理器类工厂)
        EntityManagerFactory jpa01 = Persistence.createEntityManagerFactory("jpa01");
        //2、通过实体管理器类工厂创建实体管理器类
        EntityManager em = jpa01.createEntityManager();
        //3、获取事务对象,开启事务
        EntityTransaction tx = em.getTransaction(); //获取事务对象
        tx.begin(); //开启事务
        //4、创建实体类对象,完成CRUD操作
        student stu = new student(); //设置主键自增则创建的实体类不需要设置主键属性
        stu.setSname("小杨JPA");
        stu.setSage(1);
        stu.setSsex("男");
        em.persist(stu); //保存操作
        //5、提交事务(或回滚事务)
        tx.commit();
        //6、释放资源
        em.clear();
        jpa01.close();
    }
}
测试结果
成功的创建了表,使用create的注意点,因为每次启动都会删除原来的表创建新的表,则表中的数据永远都只会是最新一次执行的CRUD操作的结果 update

相关文章

网友评论

      本文标题:JPA入门

      本文链接:https://www.haomeiwen.com/subject/yjftnhtx.html