一、Configuration配置对象
1、构造方法
new Configuration() hibernate将自动加载 hibernate.properties文件(hibernate.properties文件必须存放在类路径(src)下)
2、提供方法
configure() 将加载src下的hibernate.cfg.xml
3、手动加载配置文件
//手动加载指定配置文件
config.addResource("com/san/a_hello/User.hbm.xml");
//手动加载指定类,对应映射文件User->User.hbm.xml
config.addClass(User.class);
二、SessionFactory 工厂
1、SessionFactory工厂
(1)SessionFactory 相当于java web连接池,用于管理所有session
(2)获得方式:config.buildSessionFactory()
(3)sessionFactory hibernate缓存配置信息 (数据库配置信息、映射文件,预定义HQL语句 等)
(4)SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题
2、与本地线程绑定
<property name="hibernate.current_session_context_class">thread</property>
3、创建SessionFactory代码
package com.san.b_api;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class Sessionfactory_test {
//详解SessionFactory对象
public static void main(String[] args) {
//1.加载配置
Configuration conf=new Configuration().configure();
//2.根据Configuration配信息,创建SessionFactory
SessionFactory sessionFactory=conf.buildSessionFactory();
//3.获取session
Session session = sessionFactory.openSession();
//getCurrentSession 获得与当前线程绑定的session对象
//调用getCurrentSession方法需要加一个配置:
//<property name="hibernate.current_session_context_class">thread</property>
Session session2=sessionFactory.getCurrentSession();
}
}
三、Session 会话
1、Session会话
(1)Session 相当于 JDBC的 Connection – 会话
(2)通过session操作PO对象 –增删改查
(3)session单线程,线程不安全,不能编写成成员变量
(4)session api:
save 保存
update 更新
delete 删除
get 通过id查询,如果没有 null
load 通过id查询,如果没有抛异常
createQuery(“hql”) 获得Query对象
createCriteria(Class) 获得Criteria对象
四、Transaction 事务
1、Transaction事务
(1)开启事务 beginTransaction()
(2)获得事务 getTransaction()
(3)提交事务:commit()
(4)回滚事务:rollback()
2、实现代码
public void fun1(){
Configuration conf=new Configuration().configure();
SessionFactory sf=conf.buildSessionFactory();
Session session=sf.openSession();
//打开事务
Transaction ts=session.beginTransaction();
//获得已经打开的事务
session.getTransaction();
//提交事务
ts.commit();
//回滚事务
ts.rollback();
//关闭资源
session.close();
sf.close();
}
五、Query 对象
1、Query对象
(1)hibernate执行hql语句
(2)hql语句:hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。区分大小写
(3)获得 session.createQuery(“hql”)
2、方法
(1)list() 查询所有
(2)uniqueResult() 获得一个结果。如果没有查询到返回null,如果查询多条抛异常
(3)setFirstResult(int) 分页,开始索引数startIndex
(4)setMaxResults(int) 分页,每页显示个数 pageSize
3、实现代码
public class Query_test {
public static void main(String[] args) {
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3 获得session
Session session = sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
//----------------------
Query query=session.createQuery("from com.san.a_hello.User");
//分页
//指定结果从第几个开始拿
query.setFirstResult(2);
//指定拿几个结果
query.setMaxResults(2);
List<User> list=query.list();
System.out.println(list);
//----------------------
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
}
六、Criteria 对象
1、Criteria对象
(1)QBC(query by criteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作
(2)获得方式:Criteria criteria = session.createCriteria(User.class);
2、实现代码
public void fun1(){
//加载配置文件
Configuration conf=new Configuration().configure();
//根据Configuration配置信息创建SessionFactory
SessionFactory sf=conf.buildSessionFactory();
//获得Session
Session session=sf.openSession();
//打开事务
Transaction ts = session.beginTransaction();
Criteria criteria=session.createCriteria(com.san.a_hello.User.class);
//查找name属性为王五的人
criteria.add(Restrictions.eq("name","王五"));
//Restrictions.gt(propertyName, value) 大于
//Restrictions.ge(propertyName, value) 大于等于
//Restrictions.lt(propertyName, value) 小于
//Restrictions.le(propertyName, value) 小于等于
//Restrictions.like(propertyName, value) 模糊查询,注意:模糊查询值需要使用 %
//要写criteria.uniqueResult(),否则报错
User user=(User)criteria.uniqueResult();
//提交事务
ts.commit();
//关闭资源
session.close();
sf.close();
}
七、工具类
1、工具类
(1)封装配置文件读取操作
(2)封装Sessionfactroy创建操作
(3)封装session获得操作
2、实现代码
public class HibernateUtils {
private static SessionFactory sf;
static{
//1加载配置
Configuration conf = new Configuration().configure();
//2 根据Configuration 配置信息创建 SessionFactory
sf = conf.buildSessionFactory();
//
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("虚拟机关闭!释放资源");
sf.close();
}
}));
}
public static org.hibernate.Session openSession(){
//3 获得session
Session session = sf.openSession();
return session;
}
public static org.hibernate.Session getCurrentSession(){
//3 获得session
Session session = sf.getCurrentSession();
return session;
}
public static void main(String[] args) {
System.out.println(openSession());
}
}