hibernate_day04_jpa入门
程序员文章站
2022-06-12 19:29:23
...
概述
- Java Persistence API,是SUN公司推出的一套基于ORM的规范,hibernate框架中提供了JPA的实现
- JPA是通过注解的方式来描述 对象和表的映射关系
明确
- JPA是一套ORM规范(算是一个接口),hibernate实现了JPA规范(算是一个实现类)
- hibernate中有自己的独立ORM操作数据库方式,也有JPA规范实现的操作数据库方式
- 在数据库增删改查操作中,我们hibernate和JPA的操作都要会
hibernate和JPA方法
操作 | hibernate中的方法 | JPA的方法 | 说明 |
保存 | save(Object entity) | persist(Object entity) |
共同点:都是把临时态对象转成了持久态 区别: 提供者不一样: save方法是hibernate提供的 persist方法是JPA规范提供的 在没有事务的情况下: save会去数据库中保存,hibernate提供了一个内置的事务来执行 persist什么都不会做 |
更新 | update(Object entity) | merge(Object entity) |
Hibernate和jpa都可以利用快照机制,不调用任何方法去更新。 Update方法在更新时,如果遇到一级缓存已经包含了一个相同OID的对象会报错。merge则可以执行成功 |
删除 | delete(Object entity) | remove(Object entity) | 删除一个实体 |
查询一个操作 |
get(Class clazz,Serailizable id) |
find(Class clazz,Serailizable id) | 立即加载 |
load(Class clazz,Serailizable id) | getReerence(Class clazz,Serailizable id) | 延迟加载 | |
查询所有 | Query:使用HQL语句查询 | Query:使用JPQL语句查询 | 查询语句的形式不一样 |
查询返回唯一结果 | uniqueResult() | getSingleResult() | 查询都是返回一个唯一的结果 |
一对一注解
@Entity
作用
-
指定当前类是实体类
-
写上此注解用于在创建SessionFactory/EntityManager时,加载映射配置
@Table
作用
-
指定实体类和表之间的对应关系
属性
-
name:指定数据库表的名称
@Id
作用
-
指定当前字段是主键
@GeneratedValue
作用
-
指定主键的生成方式
属性
-
strategy :指定主键生成策略
属性可取的值
IDENTITY:主键由数据库自动生成(主要是自动增长型)
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列
AUTO:主键由程序控制
@Column
作用
-
指定实体类属性和数据库表之间的对应关系
属性
-
name:指定数据库表的列名称
属性的取值
-
unique:是否唯一
-
nullable:是否可以为空
-
inserttable:是否可以插入
-
updateable:是否可以更新
-
columnDefinition: 定义建表时创建此列的DDL
-
secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字
入门案例
jar包
- hibernate的环境(16个包)
- JPA的环境(1个包)
- hibernate-entitymanager-5.0.7.Final.jar
约束位置
在src下面的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">
<!-- 要求:在根标签下必须要有一个持久化的单元 (要有一个数据库的连接信息) -->
<persistence-unit name="aaa">
<properties>
<!-- 数据库的连接配置 -->
<!-- 必选 5 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql:///crm"></property>
<property name="hibernate.connection.username" value="root"></property>
<property name="hibernate.connection.password" value="root"></property>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"></property>
<!-- 可选 -->
<property name="hibernate.connection.provider_class"
value="org.hibernate.connection.C3P0ConnectionProvider"></property>
<property name="hibernate.show_sql" value="true"></property>
<property name="hibernate.format_sql" value="true"></property>
<property name="hibernate.hbm2ddl.auto" value="update"></property>
</properties>
</persistence-unit>
</persistence>
实体类
package com.itheima.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* @ClassName: Customer
* @Description:jpa的所有的注解都在一个叫javax.persistence包下
* @author jsz
* @date 2018年8月20日
*/
@Entity // 指定当前类是实体类,写上此注解用于在创建SessionFactory/EntityManager时,加载映射配置
@Table(name = "cst_customer") // 指定实体类和表之间的对应关系
public class Customer {
@Id // 指定当前字段是主键
@Column(name = "cust_id")
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定主键的生成方式
private Long cust_id;
@Column(name = "cust_name")
private String cust_name;
@Column(name = "cust_source")
private String cust_source;
@Column(name = "cust_industry")
private String cust_industry;
@Column(name = "cust_level")
private String cust_level;
@Column(name = "cust_address")
private String cust_address;
@Column(name = "cust_phone")
private String cust_phone;
public Customer() {
}
public Customer(Long cust_id, String cust_name) {
this.cust_id = cust_id;
this.cust_name = cust_name;
}
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public String getCust_source() {
return cust_source;
}
public void setCust_source(String cust_source) {
this.cust_source = cust_source;
}
public String getCust_industry() {
return cust_industry;
}
public void setCust_industry(String cust_industry) {
this.cust_industry = cust_industry;
}
public String getCust_level() {
return cust_level;
}
public void setCust_level(String cust_level) {
this.cust_level = cust_level;
}
public String getCust_address() {
return cust_address;
}
public void setCust_address(String cust_address) {
this.cust_address = cust_address;
}
public String getCust_phone() {
return cust_phone;
}
public void setCust_phone(String cust_phone) {
this.cust_phone = cust_phone;
}
@Override
public String toString() {
return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_source=" + cust_source
+ ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_address=" + cust_address
+ ", cust_phone=" + cust_phone + "]";
}
}
测试类
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import org.junit.Test;
import com.itheima.domain.Customer;
public class Demo01 {
@Test
public void test01() throws Exception {
// 获取实体管理器工厂
EntityManagerFactory managerFactory = Persistence.createEntityManagerFactory("aaa");
// 创建一个实体管理器
EntityManager manager = managerFactory.createEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Customer c1 = new Customer();
c1.setCust_name("张三");
// 添加用户
manager.persist(c1);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
}
抽取工具类
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* JPA的工具类:
* 它里面要做的事情和hibernate的工具类是一样的
* 1、创建EnitytManagerFactory(就相当于Hibernate的SessionFactory)
* 2、使用工厂生产一个EntityManager,并返回。(就相当于Hibernate的Session)
*
*/
public class JPAUtils {
private static EntityManagerFactory factory;
/**
* 初始化实体管理器工厂
*/
static{
factory = Persistence.createEntityManagerFactory("aaa");
}
/**
* 返回一个实体管理器
* @return
*/
public static EntityManager getEntityManager(){
return factory.createEntityManager();
}
}
修改测试类
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import org.junit.Test;
import com.itheima.domain.Customer;
import com.itheima.utils.JPAUtils;
public class Demo01 {
/**
* @MethodName:test01
* @Description:添加用户
* @throws Exception
*/
@Test
public void test01() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Customer c1 = new Customer();
c1.setCust_name("张三");
// 添加用户
manager.persist(c1);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test02
* @Description:查询一条记录
* @throws Exception
*/
@Test
public void test02() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Customer c1 = manager.getReference(Customer.class, 1l);
System.out.println(c1);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test03
* @Description:修改用户姓名
* @throws Exception
*/
@Test
public void test03() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Customer c1 = manager.find(Customer.class, 1l);
c1.setCust_name("李四");
manager.merge(c1);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test04
* @Description:删除一条记录
* @throws Exception
*/
@Test
public void test04() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Customer c1 = manager.find(Customer.class, 1l);
manager.remove(c1);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test05
* @Description:查询所有数据
* @throws Exception
*/
@Test
public void test05() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("from Customer");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test06
* @Description:模糊查询
* @throws Exception
*/
@Test
public void test06() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("from Customer where cust_name like ?");
query.setParameter(1, "b%");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test07
* @Description:分页查询
* @throws Exception
*/
@Test
public void test07() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("from Customer");
query.setFirstResult(0);// 设置
query.setMaxResults(3);// 设置每页显示的记录数
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test08
* @Description:查询某一列的值
* @throws Exception
*/
@Test
public void test08() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("select cust_name from Customer");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test09
* @Description:投影查询
* @throws Exception
*/
@Test
public void test09() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query qr = manager.createQuery("select new Customer(cust_id,cust_name) from Customer");
List<Customer> list = qr.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test10
* @Description:排序查询
* @throws Exception
*/
@Test
public void test10() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("from Customer order by cust_id desc");
List<Customer> list = query.getResultList();
for (Customer customer : list) {
System.out.println(customer);
}
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
/**
* @MethodName:test11
* @Description:聚合查询
* @throws Exception
*/
@Test
public void test11() throws Exception {
// 创建一个实体管理器
EntityManager manager = JPAUtils.getEntityManager();
// 开启事务
EntityTransaction tx = manager.getTransaction();
tx.begin();
Query query = manager.createQuery("select count(*) from Customer ");
Object obj = query.getSingleResult();
System.out.println(obj);
// 提交事务
tx.commit();
// 关闭资源
manager.close();
}
}
下一篇: 1、Redis安装以及五种基本数据类型