Hibernate学习笔记
Hibernate使用XML文档来维护Java类和关系数据库表之间的映射关系。这样通过Hibernate可以吧信息从SQL数据库中提取出来,在将它转换成Java对象。
一、Hibernate开发
1.生成和数据库相关的接口类和xml配置文件——对底层数据库
用Eclipse插件MiddleGenIDE帮助生成关于数据表的文件。将产生User.java和User.hbm.xml。其中java文件包括对数据表中各个属性的定义和set,get操作。xml文件包含对这个队形的映射文件。如下图为xml文件,其中generator是用来告诉Hibernate使用底层数据库是主键的生成方式,native为在数据库中自增加的方式
2.创建持久化类,即对数据库接口的实现——对底层数据库实现
在Hibernate中每一个session都有两个状态:瞬时状态和持久化状态。当new一个user类之后,此时就为瞬时状态若要现在需要对user数据表进行相关操作。就需要调用save()方法将其持久化,只有这样在JVM之后这个数据对象还能够存在。当调用delete之后就回到瞬时状态了。
二、常用的Hibernate操作
1.select(查询类似)
public User select(String username){
Session session =null;
User record =null;
try {
session = HibernateSessionFactory.currentSession();//用工厂模式对session进行管理,SessionFactory是线程安全的
//如何保证线程安全呢?在java中连接数据库依赖的是java.sql.Connection,在Hibernate中Hibernate Session对Connection进行了一层高级封装。一个Session对应了一个Connection,要实现延迟加载必须保证是同一个session并且从头到尾都是一个session.
//在java中一个请求是一个线程,tomcat采用线程池机制,当有一个http请求的时候,随机从线程池中取出一个线程对象去处理。要保证请求使用同一个session就需要对线程进行绑定。在java中用ThreadLocal实现对线程的绑定。
Query query = session.createQuery("from User where username=?");//使用问号参数,注意参数是从0开始计数的
query.setString(0, username.trim());
record = (User) query.uniqueResult();//查询只有一个结果。若结果是个集合 query.list()
query = null;
} catch (HibernateException e) {
// TODO: handle exception
throw e;
}finally{
HibernateSessionFactory.closeSession();
}
return record;
}
2.Insert
public Integer insert(User record){
Session session=null;
Transaction tx=null;//采用事务
Integer id=null;
try {
session=HibernateSessionFactory.currentSession();
tx=session.beginTransaction();
session.save(record);//由瞬时化变为持久化
id=record.getId();
tx.commit();//注意提交
} catch (HibernateException e) {
// TODO Auto-generated catch block
throw e;
}finally{
if(tx!=null){
tx.rollback();
}
HibernateSessionFactory.closeSession();
}
return id;
}
3.条件查询Criteria(可以取代HQL)
public Page list(String username, int pageSize, int pageNo) {
Session session = null;
Page pager = null;
try {
session = HibernateSessionFactory.currentSession();
// 创建查询条件
Criteria criteria = session.createCriteria(Address.class);
criteria.add(Restrictions.eq("username", username));//Restriction用于在在查询中指定各种约束条件
// 取得总数
int rowCount = ((Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult()).intValue();//setProjection投影操作
criteria.setProjection(null);
// 取得当前页
int startIndex = pageSize * (pageNo - 1);
// 设置排序条件
criteria.addOrder(Order.asc("username"));
criteria.setFirstResult(startIndex);
criteria.setMaxResults(pageSize);
List<?> result = criteria.list();
pager = new Page(pageSize, pageNo, rowCount, result);
} catch (HibernateException e) {
pager = new Page(pageSize, pageNo, 0, new ArrayList<Object>());
throw e;
} finally {
HibernateSessionFactory.closeSession();
}
return pager;
}