一、hibernate CURD基本操作
package com.itheima.test;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itheima.domain.Customer;
import com.itheima.utils.HibernateUtil;
/**
*
*
* <p>Description: Hibernate的增删改查操作</p>
*/
public class HiberanteCRUDTest {
/**
* 测试保存
*/
@Test
public void testSave() {
Customer c = new Customer();
c.setCustName("hibernate customer");
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
session.save(c);
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
//
/**
* 根据id查询
*/
@Test
public void testFindOne() {
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
Customer c = session.get(Customer.class, 1L);
System.out.println(c);
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
//
//
//
//
//
/**
* 更新
*/
@Test
public void testUpdate() {
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
Customer c = session.get(Customer.class, 97L);
c.setCustAddress("北京");
c.setCustPhone("13111111111");
//执行更新
session.update(c);
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
//
//
/**
* 删除
* 注意:
* 它和我们之前的删除是有点不一样的,我们之前的删除是传入一个id就能实现删除功能
* 现在不行了,因为我们操作的思想变了,变成操作实体类相当于操作数据库表。
*/
@Test
public void testDelete() {
Customer c = new Customer();
c.setCustId(94L);
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
// Customer c1 = session.get(Customer.class, 97L);
//执行更新
session.delete(c);
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
//
//
/**
* 查询所有
*/
@Test
public void testFindAll() {
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
//创建的是hibernate的查询对象Query
Query query = session.createQuery("from Customer");//参数写的是HQL。Hibernate query language。它的特点和JPQL是相通的
//得到结果集
List list = query.list();
for(Object obj : list) {
System.out.println(obj);
}
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
//
//
/**
* 查询列表,带条件
*/
@Test
public void testFindByCondition() {
//1.定义对象
Session session = null;
Transaction tx = null;
try {
//获取对象
session = HibernateUtil.openSession();
//开启事务
tx = session.beginTransaction();
//执行操作
//创建的是hibernate的查询对象Query
//HQL的参数占位符是从0开始的
// Query query = session.createQuery("from Customer where custLevel = ? and custName like ? ");//参数写的是HQL。Hibernate query language。它的特点和JPQL是相通的
// //给参数占位符赋值
// query.setString(0, "23");
// query.setString(1, "%集%");
Query query = session.createQuery("from Customer where custLevel = :custLevel and custName like :custName ");//参数写的是HQL。Hibernate query language。它的特点和JPQL是相通的
// //给参数占位符赋值
query.setString("custLevel", "23");
query.setString("custName", "%集%");
//得到结果集
List list = query.list();
for(Object obj : list) {
System.out.println(obj);
}
//提交事务
tx.commit();
}catch(Exception e) {
//回滚事务
tx.rollback();
e.printStackTrace();
}finally {
//释放资源
session.close();
}
}
}
二、get和load方法的区别:
/**
*
* get和load方法的区别:
* 他们的作用都是根据id查询一个实体,但是有区别:
* 区别1:查询的时机不一样。
* get方法是:只要一触发方法,马上发起查询。一个是立即加载
* load方法是:什么时候使用什么时候发起查询。一个是延迟加载(按需加载)
*
* 区别2:返回的结果不一样
* get方法是:返回的是实体类对象
* load方法是:返回的是实体类的代理对象
*/
public class HibernateTestFindOne {
/**
*
*/
@Test
public void testFindOne1() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
Customer c = session.get(Customer.class, 1L);
System.out.println(c);
tx.commit();
session.close();
}
/**
*
*/
@Test
public void testFindOne2() {
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
Customer c = session.load(Customer.class, 1L);
System.out.println(c);
tx.commit();
session.close();
}
}
三、Hibernate中使用Connection对象
/**
*
* <p>Description: Hibernate中使用Connection对象</p>
*/
public class HibernateConnectionTest {
public static void main(String[] args) {
Session session = HibernateUtil.openSession();
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
System.out.println(connection.getClass().getName());
}
});
}
}
四、hibernate 和 和 JPA 中的方法对照
hibernate JPA
保存 save(Object entity) persist(Object entity)
更新操作 update (Object entity) merge (Object entity)
删除操作 delete (Object entity) remove (Object entity)
查询一个操作 get (Class clazz,Serializable id) find(Class clazz,Object id)
load(Class clazz,Serializable id) getReerence(Class clazz,Object id)
查询返回唯一结果操作 uniqueResult() getSingleResult()
查询所有操作Query: 使用 HQL 语句查询 Query: 使用 JPQL 查询