import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
- Hibernate的工具类
*/
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
}
测试工具类
Transaction(数据库事务)
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzheng.hibernate.demo01.Customer;
import com.itzheng.hibernate.utils.HibernateUtils;
/*
- Hibernate工具类的一个测试
*/
public class HibernateDemo02 {
@Test
// 保存客户
public void demo01() {
//获取到数据库的链接
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();//创建数据库事务对象开启事务
Customer customer = new Customer();//自定义与数据库匹配的类
customer.setCust_name(“王小东”);
session.save(customer);
tx.commit();//提交事务
session.close();
}
@Test
// 查询:
public void demo02() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();// 创建数据库事务对象开启事务
// 使用get方法来进行查询
/*
-
Customer customer = session.get(Customer.class, 1l);
-
System.out.println(customer);
-
System.out.println(“===========================”);
*/
// 使用load方法查询
Customer customer = session.load(Customer.class, 1l);//发送SQL语句
System.out.println(customer);
tx.commit();// 提交事务
session.close();
}
}
三、Session:类似Connection对象是链接对象(实现Hibbernate和数据库建立连接)
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。
但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
Session代表的是Hibernate与数据库的链接对象。不是线程安全 (Session对象不可以定义为全局变量)使用该对象的时候必须为局部变量
Session是与数据库交互的一个桥梁
1、Session的API
可以到Hibernate的API文档当中找到关于Session的介绍
A、保存方法:
Serializable save(Object obj);
Serializable id = session.save(customer);
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzheng.hibernate.demo01.Customer;
import com.itzheng.hibernate.utils.HibernateUtils;
/*
- Hibernate工具类的一个测试
*/
public class HibernateDemo02 {
@Test
// 保存客户
public void demo01() {
//获取到数据库的链接
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();//创建数据库事务对象开启事务
Customer customer = new Customer();//自定义与数据库匹配的类
customer.setCust_name(“王小东”);
session.save(customer);
tx.commit();//提交事务
session.close();
}
}
B、查询的方法:
T get(Class c,Serializable id);
T load(Class c,Serializable id);
测试代码:
使用get方法来查询
使用load方法来查询
—》get方法和load方法的区别?使用Debug分别测试get方法和load方法
get方法
采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询
查询后返回的是真实对象本身
查询一个找不到的对象的时候会返回null
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzheng.hibernate.demo01.Customer;
import com.itzheng.hibernate.utils.HibernateUtils;
/*
- Hibernate工具类的一个测试
*/
public class HibernateDemo02 {
@Test
// 查询:
public void demo02() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();// 创建数据库事务对象开启事务
// 使用get方法来进行查询
Customer customer = session.get(Customer.class, 1l);
System.out.println(customer);
System.out.println(“===========================”);
tx.commit();// 提交事务
session.close();
}
}
load方法
采用的是延迟加载(lazy懒加载),执行到这行代码的时候不会发送SQL语句,当真正使用该对象的时候才会发送SQL语句
获取其id的时候也不会发送SQL语句,但是获取其他属性的时候就会发生SQL语句
load方法查询后返回的是 代理对象。
使用的是这个包产生的代理,利用javassist技术产生的代理。
查询一个找不到的对象的时候会返回对象找不到的异常(ObjectNotFoundException)
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.itzheng.hibernate.demo01.Customer;
import com.itzheng.hibernate.utils.HibernateUtils;
/*
- Hibernate工具类的一个测试
*/
public class HibernateDemo02 {
@Test
// 查询:
public void demo02() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();// 创建数据库事务对象开启事务
// 使用load方法查询
Customer customer = session.load(Customer.class, 1l);//发送SQL语句
System.out.println(customer);
tx.commit();// 提交事务
session.close();
}
}
C、修改方法
void update(Object obj);
第一种修改方式(覆盖所有的值,包括没有修改的值,如果没有设置,则会被赋予null)
public void demo03() {
Session session = HibernateUtils.openSession();// 获取数据库的链接
Transaction transaction = session.beginTransaction();// 开启事务
// 1、创建对象进行修改 只是修改一个的话其他没有设置对应的值会别默认覆盖为null
Customer customer = new Customer();
customer.setCust_id(1l);
customer.setCust_name(“王村”);
session.update(customer);
transaction.commit();// 提交事务
session.close();// 关闭链接
}
第二种修改方式(先查询然后再修改)
// 修改操作
public void demo03() {
//session可以理解为是将数据放入到session对象当中
Session session = HibernateUtils.openSession();// 获取数据库的链接
Transaction transaction = session.beginTransaction();// 开启事务
// 1、创建对象进行修改 只是修改一个的话其他没有设置对应的值会别默认覆盖为null
/*
-
Customer customer = new Customer(); customer.setCust_id(1l);
-
customer.setCust_name(“王村”); session.update(customer);
*/
// 先查询,在修改(一般推荐使用先查询再修改的方式)
Customer customer = session.get(Customer.class, 1l);//先将数据库当中对应id的数据查询出来方到customer对象当中
customer.setCust_name(“王小键”);//将对应的数据存放到查询到的对象当中
session.save(customer);//再次将该对象放入到数据库当中
transaction.commit();// 提交事务
session.close();// 关闭链接
}
D、删除方法
void delete(Object obj);
第一种删除方式
// 删除操作
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//直接创建对象,删除
Customer customer = new Customer();
customer.setCust_id(1l);
session.delete(customer);//删除对应id的数据
//直接创建再删除
tx.commit();
session.close();
}
第二种删除方式
// 删除操作
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//直接创建对象,删除
/*
-
Customer customer = new Customer(); customer.setCust_id(1l);
-
session.delete(customer);//删除对应id的数据
*/
//先查询再删除
Customer customer = session.get(Customer.class, 2l);//将数据当中的数据与Customer字节码文件进行匹配
session.delete(customer);//删除查询到的customer对象
tx.commit();
session.close();
}
E、保存或更新
void saveOrUpdate(Object obj);
第一种没有设置id(保存)
会单纯的实现保存功能在已有的数据后面
@Test
// 保存
public void demo05() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer(); customer.setCust_name(“王菲”);
session.saveOrUpdate(customer);
transaction.commit();
session.close();
}
设置id并且是数据表当中已有的id(会实现更新该数据)
会覆盖对应的数据如果没有设置会覆盖为null
@Test
// 更新
public void demo05() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_id(3l);
customer.setCust_name(“李芬”);
session.saveOrUpdate(customer);
transaction.commit();
session.close();
}
F、查询所有
void createQuery(“from Customer”);
// 查询所有
public void demo06() {
// 加载核心配置文件hibernate.cfg.cml
Configuration configuration = new Configuration().configure();
// 创建sessionFactory对象,类似于JDBC当中的连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 通过sessionFactory获取session对象,类似于我们JDBC中的Connection
Session session = sessionFactory.openSession();
// 手动开启事务
Transaction transaction = session.beginTransaction();
// 接收一个HQL:Hibernate Query Language 面向对象的查询语言
Query query = session.createQuery(“from Customer”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
System.out.println(“====================================”);
// 同时也可以使用SQL语句
SQLQuery createSQLQuery = session.createSQLQuery(“select * from cst_customer”);
List<Object[]> list2 = createSQLQuery.list();
for (Object[] objects : list2) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();// 提交事务
session.close();// 关闭链接池
}
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。
Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA
中的UserTransaction、甚至可以是CORBA
事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Hibernate当中去管理事务的对象。
对应文档当中的方法
常用方法:
1、commit():提交事务
2、rollback ():回滚事务
以下API在运行的时候需要配置好核心文件当中
<?xml version="1.0" encoding="UTF-8"?>com.mysql.jdbc.Driver
jdbc:mysql:///hibernate_day02
root
root
org.hibernate.dialect.MySQLDialect
true
true
update
org.hibernate.connection.C3P0ConnectionProvider
5
20
120
3000
4
thread
以及准备好对应的工具类
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
}
一、Query
Query接口用于接收HQL,查询多个对象。
HQL:Hibernate Query Language :Hibernate查询语言。这种语言与SQL的语法及其类似,是一个面向对象的查询语言。
1、查询所有表当中信息
public class HibernateDemo5 {
@Test
// Query
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session活动Query接口
String hql = “from Customer”;
Query query = session.createQuery(hql);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
}
2、查询指定字符的数据(条件查询)
/*
- Hibernate的其他的API
*/
public class HibernateDemo5 {
@Test
// Query
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session活动Query接口
// String hql = “from Customer”;
String hql = “from Customer where cust_name like ?”;
Query query = session.createQuery(hql);
query.setParameter(0, “王%”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
}
分页查询
/*
- Hibernate的其他的API
*/
public class HibernateDemo5 {
@Test
// Query
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session活动Query接口
//分页查询
String hql = “from Customer”;
Query query = session.createQuery(hql);
//设置分页
query.setFirstResult(0);//相当于MySQL当中limit的第一个参数
query.setMaxResults(3);
//query.setParameter(0, “王%”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
}
改变初始值
@Test
// Query
public void demo01() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session活动Query接口
//分页查询
String hql = “from Customer”;
Query query = session.createQuery(hql);
//设置分页—》会根据不同的数据库切换SQL语句
query.setFirstResult(3);//相当于MySQL当中limit的第一个参数
query.setMaxResults(3);
//query.setParameter(0, “王%”);
List list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
二、Criteria
Criteria:QBC(Query By Criteria);
更加面向对象的一种查询方式。
@Test
// Criteria
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session获得Criteria接口
Criteria criteria = session.createCriteria(Customer.class);// 返回
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
条件查询
@Test
// Criteria
public void demo02() {
Session session = HibernateUtils.getCurrentSession();
Transaction transaction = session.beginTransaction();
// 通过Session获得Criteria接口
Criteria criteria = session.createCriteria(Customer.class);//先获取到criteria的Customer对象
//criteria.add(Restrictions.like(“cust_name”, “王%”));//设置对应的查询的条件
criteria.add(Restrictions.like(“cust_name”, “王”,MatchMode.START));//在这里上下这两种设置条件的方式实现的功能一致
List list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
transaction.commit();
}
分页查询