hibernate_day04_jpa入门

概述

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

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

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值