第一种是单独使用hibernate的分页,从session中得到query接口,设置开始的结果集,和查询的个数,来分页。或者查询所有的结果集的list,采用list方法的截取功能。不过这种方法效率太低,根本不会是用这种方法。
public List<Student> findAll() {
String hql = "FROM Student";
Query q =HibernateUtils.getSession().createQuery(hql);
List list = q.list();
returnlist;
}
public List<Student> findByPage1(int pageNow) {
List list = findAll();
list = list.subList((pageNow-1)*pagesize),pageNow*pagesize);
returnlist;
}
public List<Student> findByPage2(int pageNow) {
List list = null;
String hql = "FROM Student ";
Query q =HibernateUtils.getSession().createQuery(hql);
q.setFirstResult((pageNow-1)*pagesize);
q.setMaxResults(pagesize);
list = q.list();
returnlist;
}
这里一些代码示例中,为了代码简洁,有的地方就没判断了,比如最后一页显示不满足pagesize条数时候会报错,需要自己修改下代码。
第二种是使用继承hibernateDAOSupport类来实现dao的方式,看到一篇很好描述HibernateDaoSupport类使用的例子,特此在这和大家分享一下
1、 继承了HibernateDaoSupport类的类获取session时,已不可用SessionFactory.OpenSessioon的形式来获 取Session了,由于HibernateDaoSupport本身已有获取session的方法getSession(),所以直接用Session se=this.getSession();来获取,
2、 在依据hql获取用户信息时,继承了HibernateDaoSupport类的类中不能在使用Query类了,而是用List<Ssh> list = this.getHibernateTemplate().find(hql);形式来获取实体类集合
实例:
- public String print(int id) {
- Session se =this.getSession();//获取Session对象
- String hql = "from Ssh where id=" + id;
- //依据hql获取实体集合,此处不要用Query类来实现
- List<Ssh> list = this.getHibernateTemplate().find(hql);
- String a = list.get(0).getName();
- return a;
- }
第三种就是使用HibernateCallback 代码如下
public List findAllByPage( final int pageNow, final int pageSize){
List list = (List) getHibernateTemplate().execute(
new HibernateCallback() {
int size=pageNow*pageSize-pageSize;
public Object doInHibernate(Session session)
throws HibernateException {
Query q =session.createQuery("from Author order by author_id");
q.setFirstResult(size);
q.setMaxResults(pageSize);
List cats = q.list();
return cats;
}
});//内部类,返回一个List
return list;
}
用Struts标签代替for循环的例子:
- <s:bean name= "org.apache.struts2.util.Counter"id= "counter" >
- <s:param name="first" value="1" />
- <s:param name="last" value="10" />
- <s:iterator>
- counter:<s:property value="current-1"/>
- </s:iterator>
- </s:bean>
其中first属性指定循环起始值,last指定循环终止值,其它相关属性可以查看org.apache.struts2.util.Counter类源码。在下面迭代器中输入循环的当前值,即:current-1
这里是我分页的例子,需要的时候修改下使用:
<s:beanname="org.apache.struts2.util.Counter"id="counter">
<s:paramname="first"value="1"/>
<s:paramname="last"value="#request.pageNums"/>
<s:iftest="#request.pageNow!=1"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageUp"/>"><上一页</a></s:if>
<s:iterator>
<ahref="student/show?pageNow=<s:property/>">[<s:property/>]</a>
</s:iterator>
<s:iftest="#request.pageNow!=#request.pageNums"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageDown"/>">下一页></a></s:if>
</s:bean>
hibernate的部分知识:
添加ja项目对hibernate的支持就不详细说了,添加jar包,hibernate.xml的配置文件,POJO(javabean+bean.hbm.xml)
Hibernate的crud步骤:
得到configuration,得到sessionFactory,得到session,得到事物,crud操作,事物提交,关闭session。代码如下:
Configuration cfg = newConfiguration().configure();
SessionFactorysf = cfg.buildSessionFactory();
Sessionsession = sf.openSession();
session.beginTransaction();
session.save(u);
session.getTransaction().commit();
session.close();
如果要hibernate生成数据库表的话:
Configuration cfg = new Configuration().configure();
SchemaExport se = new SchemaExport(cfg);
se.create(true, true); 这样就能将数据库实体生成相应的表了。
这里也说下hibernate的实体的三种状态吧
瞬态:新建出来的实体的对象,没有存到数据库去,数据库中没有对应的实体记录。
持久态:存入数据库中,接受session的管理
游离态:由于session的关闭或者其他原因,脱离session的管理,但数据库中又相应的实体记录。
下面拿来一段网上的三张状态的描述:
Hibernate三种状态之一:临时状态(Transient):用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;
Hibernate三种状态之二:持久化状态(Persistent):已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;
Hibernate三种状态之三:游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;
Hibernate三种状态中游离对象和临时对象异同:
两者都不会被Session关联,对象属性和数据库可能不一致;
游离对象由持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;
Hibernate和SQL的关系:
在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库;
有时候面试笔试会问到或者考到这个问题。就是get()load()之间到底是什么区别。
get(),采用get方法加载数据库中的数据,如果不存在,返回null
load(),延迟加载,在执行load方法的时候不会发出sql语句,只是返回一个CGLIB代理对象,只有在真正第一次使用查询出对象的时候才发出SQL语句查询数据库;采用load方法加载数据库中的数据,如果不存在,则抛出异常
Query接口的使用:
1,Query查询所有记录:
Query query = session.createQuery("fromUser");
2,Query的分页:
//设置从的几条开始查询
query.setFirstResult(3);
//设置查询多少条
query.setMaxResults(2);
hibernate的实体类映射文件的配置主键:
<generator class="native" />设置主键的自动增长
class="native/uuid/identity/sequence"
native----Hibernate完成的数字自增1,2,3...
uuid----生成一个32位的字符串
identity----sqlserver的自增
sequence----oracle的自增(1,2,...)
assigned----手动分配主键
采用<composite-id></composite-id>设置联合主键
<property/>标签将普通属性映射成表字段
name
column
length
type(指定数据库中该字段的类型:一般情况下不需要指定)
updatetrue|false 该字段不会出现在update的Sql语句中
inserttrue|false
unique 唯一性
not-null 是否为空
实体类的设计原则(POJO):
1,实现一个默认的无参的构造方法
2,提供一个标识属性
3,使用非final的类(影响预加载)
4,为持久化字段声明访问器(提供get和set方法)
Struts标签代替for循环:
分页的例子:
<s:beanname="org.apache.struts2.util.Counter"id="counter">
<s:paramname="first"value="1"/>
<s:paramname="last"value="#request.pageNums"/>
<s:iftest="#request.pageNow!=1"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageUp"/>"><上一页</a></s:if>
<s:iterator>
<ahref="student/show?pageNow=<s:property/>">[<s:property/>]</a>
</s:iterator>
<s:iftest="#request.pageNow!=#request.pageNums"><ahref="student/show?pageNow=<s:propertyvalue="#request.pageDown"/>">下一页></a></s:if>
</s:bean>
Hibernate的工具类
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
publicclass HibernateUtils {
privatestatic Sessionsess =null;
privatestatic SessionFactorysf = null;
static {
Configurationcfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
publicstatic Session getSession() {
sess =sf.openSession();
returnsess;
}
publicstaticvoid release(Object o){
if(oinstanceof Session) {
((Session)o).close();
}
sf.close();
}
}
Hibernate单独框架的crud和分页操作代码:
publicclass StudentDAOImpl{
static Sessionsess =null;
publicvoid add(Student s) {
sess = HibernateUtils.getSession();
sess.save(s);
System.out.println("save(s)");
HibernateUtils.release(sess);
}
publicvoid deleteBySno(String sno) {
sess = HibernateUtils.getSession();
Student s = (Student) sess.get(sno, Student.class);
sess.delete(s);
HibernateUtils.release(sess);
}
publicvoid deleteAll() {
sess = HibernateUtils.getSession();
Query query = sess.createQuery("fromStudent");
Iterator iter = query.list().iterator();
while(iter.hasNext()) {
sess.delete(iter.next());
}
HibernateUtils.release(sess);
}
publicvoid edit(Student s) {
sess = HibernateUtils.getSession();
sess.update(s);
HibernateUtils.release(sess);
}
public Student findByName(String name) {
Student s = null;
sess = HibernateUtils.getSession();
Query query = sess.createQuery("fromStudent s where s.name = name");
List list = query.list();
Iterator iter = list.iterator();
while(iter.hasNext()) {
s = (Student) iter.next();
}
HibernateUtils.release(sess);
return s;
}
public Student findBySno(String sno) {
Student s = null;
sess = HibernateUtils.getSession();
Query query = sess.createQuery("fromStudent s where s.sno = sno");
List list = query.list();
Iterator iter = list.iterator();
while(iter.hasNext()) {
s = (Student) iter.next();
}
HibernateUtils.release(sess);
return s;
}
publicstatic List<Student> findAll() {
List list = null;
String hql = "FROM Student ";
Query q =HibernateUtils.getSession().createQuery(hql);
list = q.list();
returnlist;
}
publicstatic List<Student> findByPage(int pageNow) {
List list = null;
String hql = "FROM Student ";
Query q =HibernateUtils.getSession().createQuery(hql);
q.setFirstResult(pageNow*10);
q.setMaxResults(pagesize);
list = q.list();
returnlist;
}
publicstaticint getRowNums() {
returnfindAll().size();
}
staticintpagesize = 10;
intRowNums ;
intpageNums ;
publicstaticint getPageNums() {
returngetRowNums()/pagesize ==0?getRowNums()/pagesize:getRowNums()/pagesize+1;
}
}
与spring集成后的hibernate增删改查和分页:
publicclass StudentDAOImplextends HibernateDaoSupportimplements StudentDAO{
privateintpagesize = 10;//每页显示十条,固定死
publicint getRowNums() {//得到记录条数
return findAll().size();
}
publicint getPageNums() {//得到页数
return getRowNums()/pagesize ==0?getRowNums()/pagesize:getRowNums()/pagesize+1;
}
publicvoid add(Student s) {
getHibernateTemplate().save(s);
}
publicvoid deleteBySno(String sno) {
getHibernateTemplate().delete(findBySno(sno));
}
publicvoid deleteAll() {
getHibernateTemplate().deleteAll(findAll());
}
publicvoid edit(Student s) {
getHibernateTemplate().update(s);
}
public Student findByName(String name) {
return (Student)getHibernateTemplate().find("from Student s where s.name = ?", name).get(0);
}
public Student findBySno(String sno) {
return (Student)getHibernateTemplate().find("from Student s where s.sno = ?", sno).get(0);
}
public List<Student> findAll() {
return(List<Student>)getHibernateTemplate().find("from Student");
}
public List<Student> findByPage(int pageNow) {
List list = null;
String hql = "FROM Student ";
Session session=this.getSession();
Query query =session.createQuery(hql);
query.setFirstResult((pageNow-1)*pagesize);
if(pageNow==getPageNums()){
query.setMaxResults(getRowNums()-(pageNow-1)*pagesize);
} else {
query.setMaxResults(pagesize);
}
list = query.list();
session.close();
returnlist;
}
/* public List<Student>findByPage(finalint pageNow) {
return this.getHibernateTemplate().executeFind(newHibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
String hql = "from Student";
Query query = session.createQuery(hql);
query.setFirstResult((pageNow-1)*pagesize);
if(pageNow==getPageNums()) {
query.setMaxResults(getRowNums()-(pageNow-1)*pagesize);
} else {
query.setMaxResults(pagesize);
}
List list = query.list();
return list;
}
});
}*/
/*public List<Student> findByPage(int pageNow) {
List list = findAll();
if(pageNow==getPageNums()) {
list = list.subList(pageNow*10-9, getRowNums()-1);
} else {
list = list.subList(pageNow*10-9,pageNow*10);
}
return list;
}*/
}