JPA(一):JPA快速入门

一、JPA简介

    JPA(Java Persistence API,中文名 java 持久化层 API)是 sum 公司制定的ORM框架的规范,是一组操作数据库的接口。Hibernate、TopLink(现已捐献给Eclipse社区,改名为EclipseLink)以及OpenJPA等ORM框架提供了JPA的实现。sum公司制定JPA ORM规范有两个原因:其一为了简化java对数据库的开发,其二为了整合ORM技术,实现天下归一。Hibernate的创始人参与了JPA规范的制定,所以JPA与Hibernate的API非常的相像,从功能上讲,JPA就是Hibernate功能的一个子集。下面我们将使用Hibernate来作为JPA的实现编写代码。

二、JPA与JDBC对比

    JPA是为了代替JDBC对数据库的开发,那么他跟JDBC对比有哪些优势呢?我们通过它们各自的优缺点来进行比较:

1、JDBC的优缺点

优点:

    1)直接操作数据库,性能最高(前提你要是数据库的高手,如果处理不好,性能会比JPA更低)。

缺点:

    1)操作复杂(重复代码较多)。

    2)数据库移植修改较多(具体为各数据库 主键生成方式 和 分页查询 不同)

    3)面向sql语句编程,而不是对象。

    4)需要自己处理性能优化(如实现缓存),对新手来说难度较大。

2、JPA的优缺点

优点:

    1)操作简单(调用已实现的API)

    2)数据库移植方便(使用方言)

    3)面向对象编程,使不懂sql的也能对数据库进行操作

    4)优化较好(实现了优秀的数据缓存)

缺点:

    1)无法干涉sql语句的生成,性能不可控。

    2)一个项目中对sql语句要求比较高的,不适合使用JPA(不过可以使用JPA对原生sql的支持)

    3)有上亿级别的数据量,不适合使用JPA,也不适合使用JDBC。(可以使用数据库读写分离、分库分表)

总结:对数据库的优化不熟悉的适合使用JPA,对性能要求较高的适合使用JDBC。

三、JPA快速入门

    从现在开始,我们进入这次的主题,如何使用JPA快速的开发数据访问层呢?

1、加入JAR包

非maven项目jar包下载:

    1)这里我们选用Hibernate作为JPA的实现,首先下载Hibernate,Hibernate里有JPA所需要的jar包

    hibernate4.3.11

    将下载下来的压缩文件解压后,将 lib\require 目录和 lib\jpa 目录下的所有jar文件拷贝到项目的lib目录下,这些为必须要加的 jar 文件。其它jar文件看需求而定。

    2)数据库驱动(使用mysql数据库)

    mysql-connector-java

maven项目添加依赖:

    1)Hibernate依赖

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>4.3.5.Final</version>
</dependency>

    2)mysql Driver依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
</dependency>

2、配置核心配置文件persistence.xml

    persistence.xml是配置JPA必不可少的文件,该文件用来配置数据库连接的信息、具体的JPA的实现框架、JPA实现框架的基本属性、添加持久化类。该文件必须放在classPath目录下的MATE-INF文件夹下

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="jpa_Hibernate">
        <!--配置jpa的实现产品,写 javax.persistence.spi.PersistenceProvider 的实现类-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <properties>
            <!--连接数据库的基本信息-->
            <!--1、数据库驱动-->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <!--2、连接数据库的url-->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
            <!--3、数据库用户名-->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <!--4、数据库密码-->
            <property name="javax.persistence.jdbc.password" value="root"/>

            <!-- 配置 jpa 实现框架的基本属性(这里用的是 Hibernate)-->
            <!--1、数据库方言-->
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
            <!--2、建表策略-->
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <!--3、是否在控制台打印sql语句-->
            <property name="hibernate.show_sql" value="true"/>
            <!--4、打印sql语句之后是否格式化打印-->
            <property name="hibernate.format_sql" value="true"/>

        </properties>
    </persistence-unit>
</persistence>

3、编写实体类并配置映射信息

import javax.persistence.Table;
import javax.persistence.Entity;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Table(name = "t_student")
@Entity
public class Student {
    @GeneratedValue(strategy = GenerationType.AUTO )
    @Id
    private Integer id;

    @Basic
    @Column(length = 20)
    private String name;

    @Basic
    @Column(length = 5)
    private String sex;

    @Basic
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                '}';
    }
}

上面使用了注解的方式,将实体类映射为数据库中的表。JPA配置实体类的基本注解:

@Entity:写在实体类声明语句之前,将该类映射到指定的数据表。(表名默认为类名小写)

@Table:写在类声明语句之前,与@Entity注解并列使用,可用于配置 标注的类映射到数据库的 表名。

@Id:写在属性声明语句或getter方法之前(该注解必须要有),使被标注的属性映射为数据库中表的主键。

@GeneratedValue:与@Id属性同写在属性声明语句后getter方法之前(必须写在一起,不能一个写在属性声明语句之前,另一个写在getter方法之前),指定主键生成策略。

@Column:写在属性声明语句或getter方法之前,该注解定义了将成员属性映射到关系表中的哪一列和该列的结构信息。

@Basic:写在属性声明语句或getter方法之前,表示一个简单的属性到数据表字段的映射,当加入@Entity注解时,系统默认给每一个属性都加了@Basic注解,可省略。

4、使用JPA API完成数据库的持久化操作

import com.xuych.entity.Student;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class Test{

    public static void main(String[] args){
//        1、获取EntityManagerFactory对象
        String persistenceUnitName = "jpa_Hibernate";//persistence.xml中<persistence-unit name="jpa_Hibernate">标签的name属性值
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName);

//        2、获取EntityManager对象
        EntityManager entityManager = entityManagerFactory.createEntityManager();

//        3、获取EntityTransaction对象
        EntityTransaction transaction = entityManager.getTransaction();

//        4、开启事务
        transaction.begin();

//        5、做持久化操作
        Student student = new Student();
        student.setName("张三");
        student.setSex("男");
        student.setAge(30);

        //保存数据
        entityManager.persist(student);

//        6、提交事务
        transaction.commit();

//        7、关闭 EntityManagerFactory 和 EntityManager
        entityManager.close();
        entityManagerFactory.close();
    }

}

执行main方法将像数据库保存一条记录,主要是调用了 EntityManager的 persist(Object object); 方法,对应的删除、修改、查询的方法分别为:remove(Object object)、merge(Object object)、find(Class<T> aClass,  Object object)。更多有关JPA的知识,将在下一篇博客细说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值