0 懒加载概念
①懒加载(load on demand)是一种独特而又强大的数据获取方法,是指程序推迟访问数据库,这样做可以保证有时候不必要的访问数据库,因为访问一次数据库是比较耗时的。
②当我们查询一个对象的时候,默认情况下,返回的只是该对象的普通属性,当用户去使用对象属性时,才会向数据库发出再一次的查询,这种现象称为lazy加载现象。
1在Student.hbm.xml中配置关闭懒加载方式:
<class name="com.test.domain.Student" table="STUDENT" lazy="false" schema="SCOTT">
2 Hibernate.initialize(代理对象)
显示的初始化代理对象Hibernate.initialize((new Student()).getStudcourses());
3 OpenInView—通过过滤器Filter实现
原理:
缺点是:session关闭会延时
Filter文件,不需要在web.xml中配置filter
public class MyFilter extends HttpServlet implements Filter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
Session session = null;
Transaction ts = null;
try {
session = HibernateUtil.getCurrentSession();
ts = session.beginTransaction();
// 整个请求完成,才会执行doFilter方法
arg2.doFilter(arg0, arg1);
ts.commit();
} catch (Exception e) {
if(ts!=null) {
ts.rollback();
}
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
HibernateUtil.closeCurrentSession();
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
HibernateUtil工具类文件
以OpenInView为后缀的配合上边的Filter使用
public final class HibernateUtil {
private static SessionFactory sessionFactory = null;
// 线程局部模式
private static ThreadLocal<Session> threadLoacal = new ThreadLocal<Session>();
private HibernateUtil() {}
static {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
// 获取全新的session
public static Session openSession() {
return sessionFactory.openSession();
}
// 获取和线程关联的session
public static Session getCurrentSession() {
Session session = threadLoacal.get();
// 判断是否得到
if(session==null) {
session = sessionFactory.openSession();
// 将session放入threadLocal
threadLoacal.set(session);
}
return session;
}
public static void closeCurrentSession() {
Session session = getCurrentSession();
if(session!=null && session.isOpen()) {
session.close();
threadLoacal.set(null);
}
}
// 根据id返回对象的方法
public static Object findById(Class clazz, java.io.Serializable id) {
Session session = null;
Transaction ts = null;
Object obj = null;
try {
session = openSession();
ts = session.beginTransaction();
obj = session.load(clazz, id);
ts.commit();
} catch (Exception e) {
if(ts!=null) {
ts.rollback();
}
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
return obj;
}
// 根据id返回对象的方法
public static Object findByIdOpenInView(Class clazz, java.io.Serializable id) {
Session session = getCurrentSession();
Object obj = session.load(clazz, id);
return obj;
}
// 返回至多一个对象
public static Object uniqueQuery(String hql, String[] paras) {
Session session = null;
Object obj = null;
try {
session = openSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
obj = query.uniqueResult();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
return obj;
}
/// 分页
public static List executeQueryByPage(String hql, String[] paras, int pageSize, int pageNow) {
Session session = null;
List list = null;
try {
session = openSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
///
query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
list = query.list();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
return list;
}
/// 分页
public static List executeQueryByPageOpenInView(String hql, String[] paras, int pageSize, int pageNow) {
Session session = getCurrentSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
///
query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
List list = query.list();
return list;
}
/// 查询接口
public static List executeQuery(String hql, String[] paras) {
Session session = null;
List list = null;
try {
session = openSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
list = query.list();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
return list;
}
/// 查询接口
public static List executeQueryOpenInView(String hql, String[] paras) {
Session session = getCurrentSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
List list = query.list();
return list;
}
/// 修改和删除 批量sql
public static void executeUpdate(String hql, String[] paras) {
Session session = null;
Transaction ts = null;
try {
session = openSession();
ts = session.beginTransaction();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
query.executeUpdate();
ts.commit();
} catch (Exception e) {
if(ts!=null) {
ts.rollback();
}
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
}
/// 修改和删除 批量sql
public static void executeUpdateOpenInView(String hql, String[] paras) {
Session session = getCurrentSession();
Query query = session.createQuery(hql);
if(paras!=null && paras.length>0) {
for(int i=0; i<paras.length; i++) {
query.setString(i, paras[i]);
}
}
query.executeUpdate();
}
// 添加
public static void save(Object obj) {
Session session = null;
Transaction ts = null;
try {
session = openSession();
ts = session.beginTransaction();
session.save(obj);
ts.commit();
} catch (Exception e) {
if(ts!=null) {
ts.rollback();
}
e.printStackTrace();
throw new RuntimeException(e.getMessage());
} finally {
if(session!=null && session.isOpen()) {
session.close();
}
}
}
// 添加
public static void saveOpenInView(Object obj) {
Session session = getCurrentSession();
session.save(obj);
}
}