欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate_day04_jpa入门

程序员文章站 2022-06-12 19:29:23
...

概述

  • Java Persistence API,是SUN公司推出的一套基于ORM的规范,hibernate框架中提供了JPA的实现
  • JPA是通过注解的方式来描述 对象和表的映射关系

明确

  • JPA是一套ORM规范(算是一个接口),hibernate实现了JPA规范(算是一个实现类)
  • hibernate中有自己的独立ORM操作数据库方式,也有JPA规范实现的操作数据库方式
  • 在数据库增删改查操作中,我们hibernateJPA的操作都要会

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:主键由数据库自动生成(主要是自动增长型)

hibernate_day04_jpa入门

SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列

hibernate_day04_jpa入门

hibernate_day04_jpa入门

AUTO:主键由程序控制

hibernate_day04_jpa入门

@Column

作用

  • 指定实体类属性和数据库表之间的对应关系

属性

  • name:指定数据库表的列名称

属性的取值

  • unique:是否唯一  

  • nullable:是否可以为空

  • inserttable:是否可以插入

  • updateable:是否可以更新

  • columnDefinition: 定义建表时创建此列的DDL

  • secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字

 

入门案例

jar包

  • hibernate的环境(16个包)

hibernate_day04_jpa入门

  • JPA的环境(1个包)
    • hibernate-entitymanager-5.0.7.Final.jar

hibernate_day04_jpa入门

约束位置

hibernate_day04_jpa入门

 在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();
	}

}

 

相关标签: hibernate