JPA的使用

本文详细介绍了Java Persistence API (JPA)的基本概念及其在Hibernate框架中的应用,包括依赖配置、核心配置文件persistence.xml的设置、EntityManager对象的获取,以及通过JPA进行增删查改等常见数据库操作的方法。

JPA是Java Persistence API的简称,中文名Java持久层API,是Java持久化的一套标准和规范(ORM),而Hibernate就是对JPA规范的具体实现。

一,依赖

<!-- hibernate -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.6.Final</version>
</dependency>

<!-- mysql(数据库) -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.0.7</version>
</dependency>

二,核心配置文件persistence.xml

注意:需要放到META-INF文件夹下

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
    <!-- 配置单元 可以配置多个单元  通过该名称指定加载对应的配置信息 -->
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <!-- 属性 --><!-- 数据源和对应的扩展属性 -->
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>
            <property name="hibernate.show_sql" value="true"/>
            
            <!-- 自动生成ddl的策略 create create-drop update validate-->
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
        </properties>
    </persistence-unit>
</persistence>

三,获取EntityManager对象

这里封装了一个工具类

通过EntityManagerFactory创建EntityManager对象

EntityManagerFactory是线程安全的,只创建一次

EntityManager是非线程安全的,每次使用时创建

package demo.jpa.util;

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

/**
 * JAP工具类
 * @author xiaohui
 *
 */
public class JPAUtil {
    
    /**
     * EntityManager工厂对象
     */
    private static EntityManagerFactory emf;
    
    static {
        emf = Persistence.createEntityManagerFactory("persistenceUnit");
    }
    
    private JPAUtil() {}
    
    /**
     * 创建EntityManager对象
     * @return
     */
    public static EntityManager createEntityManager() {
        return emf.createEntityManager();
    }
}

四,增删查改操作

1,增 persist()

/**
     * 保存
     */
    @Test
    public void save() {
        EntityManager em = null;
        EntityTransaction transation = null;
        try {
            em = JPAUtil.createEntityManager();
            transation = em.getTransaction();
            //开启事务
            transation.begin();
            
            User u = new User();
            u.setName("test");
            u.setPassword("123");
            em.persist(u);
            
            //提交事务
            transation.commit();
            em.close();
        } catch (Exception e) {
            
            //回滚事务
            transation.rollback();
            e.printStackTrace();
        }
    }

2,删 remove()

/**
     * 删除
     */
    @Test
    public void delete() {
        EntityManager em = null;
        EntityTransaction transation = null;
        try {
            em = JPAUtil.createEntityManager();
            transation = em.getTransaction();
            //开启事务
            transation.begin();
            
            User u = em.find(User.class, 1);
            if(u!=null)
                em.remove(u);
            
            //提交事务
            transation.commit();
            em.close();
        } catch (Exception e) {
            //回滚事务
            transation.rollback();
            e.printStackTrace();
        }
    }

3,改 merge() 

/**
     * 更新
     */
    @Test
    public void update() {
        EntityManager em = null;
        EntityTransaction transation = null;
        try {
            em = JPAUtil.createEntityManager();
            transation = em.getTransaction();
            //开启事务
            transation.begin();
            
            User u = new User();
            u.setId(1);
            u.setName("tom");
            u.setPassword("123");
            em.merge(u);
            
            //提交事务
            transation.commit();
            em.close();
        } catch (Exception e) {
            //回滚事务
            transation.rollback();
            e.printStackTrace();
        }
    }

4,查

①查询单条记录 find()

/**
     * 查询单条记录
     */
    @Test
    public void selectOne() {
        EntityManager em = null;
        try {
            em = JPAUtil.createEntityManager();
            
            User user = em.find(User.class, 1);
            if(user!=null)
                System.out.println(user.getName());
            
            em.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

①jpql查询 createQuery()

/**
     * 查询多条记录通过jpql语句(hql)查询
     */
    @Test
    @SuppressWarnings("unchecked")
    public void selectListByCreateQuery() {
        EntityManager em = null;
        try {
            em = JPAUtil.createEntityManager();
            
            String jpql = "select u from User u where u.id = ?1 ";
            Query query = em.createQuery(jpql,User.class);
            query.setParameter(1, 1);//参数类型必须和实体类属性一致
            query.setFirstResult(0);
            query.setMaxResults(10);
            List<User> list = query.getResultList();
            System.out.println(list.size());
            
            em.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

②sql查询 createNativeQuery()

/**
     * 查询多条记录通过sql语句查询
     */
    @Test
    @SuppressWarnings("unchecked")
    public void selectListByCreateNativeQuery() {
        EntityManager em = null;
        try {
            em = JPAUtil.createEntityManager();
            
            String sql = "select * from user where id = ?1 ";
            Query query = em.createNativeQuery(sql, User.class);
            query.setParameter(1, "1");
            query.setFirstResult(0);
            query.setMaxResults(10);
            List<User> list = query.getResultList();
            System.out.println(list.size());
            
            em.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值