`

试着用zk结合hibernaet实现分页查询

阅读更多

原文:http://www.iteye.com/topic/285373

Zk是一个direct RIA框架。它借用了xul来描述界面,在xul的基础上做了一些扩展,改了一个名字叫zul,不使用

javascript也能做出类似extjs那样的界面来。我一开始觉得只是把javascript替换成xml意义不是太大,因为没有哪个美工

会用zul来做界面,说到底最终界面还是要靠程序员来做的,但是换个角度用 extjs那样的方式来不可以避免把很多逻辑带

入到界面中来,这点zk的zul就要好些,正如zk宣传的那样,不需要java,javascript也能做出RIA的界面来。Zk的另一个好

处就是把ajax前后台通讯部分也用事件的方式封装起来了,这比用extjs好多了,不用自己再搞一套了前后台机制了。
    看完《ZK开发手册》 ,也跟着做了一些例子,测试了一下与spring、hibernate集成都没有问题。于是,开始尝试用zk

的listbox来做一个结合spring+hibernate的分页数据显示。刚一动手就遇到了麻烦,zul在控件中显示数据的方式主要有三

种:
      1、用EL表达式作为zul标签的属性;
      2、为zul控件指定model;
      3、通过注释进行数据绑定;
为了在数据库查询的时候实现分页,无法使用第1种方式,这种方式listbox是对forEach属性EL表达式中的list进行迭代来

创建 listitem,有多少数据就创建多少个listitem,只有数据条数大于每页显示的数据条数并且listbox的

mold=“paging”时才能分页,而数据库查询每页需要显示多少数据才从数据库中取多少数据,显然第1种方式无法使用。本

来第2种方式是java开发人员最熟悉的方式,几乎和swing一样,但是这种方式需要写一个org.zkoss.zul.ListitemRenderer

的实现类,在这个类里用java代码的方式定义每行的显示样式,这样混用zul和java的来定制界面不是理想的方式。
    那现在只剩下第3种方式,这种方式是现在最为流行注释方式,就是对zul的标记用进行注释来把数据绑定到zul控件

上,这里的注释不是通用的xml注释<!-- ... -->而是一些特殊的zul标记和@开头的特殊属性例如model="@{userList}"表示

用@{userList}对model这个属性进行了注释(这个地方有点奇怪)。用注释绑定数据的代码如下:

Xml代码 复制代码
  1. <listbox id="userListBox" mold="paging" model="@{userList}"  
  2.                 selectedItem="@{selectedUser}">  
  3.         <listhead>  
  4.             <listheader label="登陆名" sort="auto" />  
  5.             <listheader label="中文名" sort="auto" />  
  6.         </listhead>  
  7.   
  8.         <listitem self="@{each=user}">  
  9.             <listcell label="@{user.loginname}" />  
  10.             <listcell label="@{user.truename}" />  
  11.         </listitem>  
  12. </listbox>  
<listbox id="userListBox" mold="paging" model="@{userList}"
				selectedItem="@{selectedUser}">
		<listhead>
			<listheader label="登陆名" sort="auto" />
			<listheader label="中文名" sort="auto" />
		</listhead>

		<listitem self="@{each=user}">
			<listcell label="@{user.loginname}" />
			<listcell label="@{user.truename}" />
		</listitem>
</listbox>

 用注释方式的数据绑定与直接用EL设置listbox的model属性对listbox来说都是把一个实现了org.zkoss.zul.ListModel

接口的对象赋值给listbox的model属性,唯一的区别就是注释方式还可以给listitem、listcell绑定数据,也就是说数据绑

定可以迭代 model并把每个model中的每个元素都与对应的listcell进行数据绑定,对应使用EL设置model的方式来说做同

样的事情还需要实现org.zkoss.zul.ListitemRenderer接口 。

    把数据和listbos绑定在一起只是第1步,接下要用hibernate实现对数据库进行分页查询了。
    要想分页查询最初的想法是监听listbox的 onPage之类的事件来实现分页,但是很遗憾我没有试验成功,哪位tx搞出来

给我留个言分享一下。注释数据绑定可以自动地把一个 java.util.List构造成ListModel的实现类,上面代码中的userList

就是一个java.util.List,实现分页查询的第二条思路就是从list下手,自己写一个能够使用hibernate实现分页的list,我

正是这样做的。
    当然不是从头开始写一个list的实现类而是采用Proxy模式把通过Hibernate查询出来的list对象包裹一下,首先需要通

过hibernate查询出一个list来作为被代理的对象,这个list保存了本页要显示的数据,如果每页显示20条数据,那么这个

list的长度就是20,接着需要当前页最后一条记录序号保存起来,最后重写get方法,根据最后记录序号、每页显示条数判

断是否需要分页以及是向前翻页还是向后翻页。get方法的代码如下:

Java代码 复制代码
  1. @Override  
  2. public Object get(int index) {   
  3.         if(index>=last||index<=last-limit*2){   
  4.             this.fullData(index, limit);   
  5.             index = 0;   
  6.             if(list.size()==0)   
  7.                 return null;   
  8.             else  
  9.                 return list.get(index);   
  10.         }else{   
  11.             index = index-(last-limit);   
  12.             if(list.size()==0)   
  13.                 return null;   
  14.             else  
  15.                 return list.get(index);   
  16.         }   
  17. }  
@Override
public Object get(int index) {
       	if(index>=last||index<=last-limit*2){
        	this.fullData(index, limit);
        	index = 0;
        	if(list.size()==0)
        		return null;
        	else
        	    return list.get(index);
        }else{
        	index = index-(last-limit);
        	if(list.size()==0)
        		return null;
        	else
        	    return list.get(index);
        }
}

 其中list就是被代理的对象,last就是最后一条记录的序号,limit是每页显示的记录数,fullData是具体执行分页查询的方

法。调用get时传入记录下标index如果大于等于最后一条记录的序号(记录序号是从1开始计数的)那么就向后翻页,如果

index小于等于上一页起始记录序号,那么需要向后翻页,不管是向后翻页还是向前翻页都需要重新查询从index到

index+limit的记录。数据实际上是放在被代理的list中的,要从被代理的list取出数据,那么下标始终是从0开始,所以需

要把这里传入的index转化成0开始的相对下标,下面就是进行转化的代码

Java代码 复制代码
  1. index=index-(last-limit);  
index=index-(last-limit);

如果仅仅是对全表数据进行分页显示,这样做完全没有问题,但实际工作往往是需要对数据进行过滤的,也就是说这个分页

的list需要能够保证分页的时候能够执行带过滤条件的分页查询,所以这个分页list中用list来保存hibernate的Criterion对

象,在fullData新建一个criteria把这些Criterion都加进去。下面是fullData的代码:

Java代码 复制代码
  1. public void fullData(int start, int limit) {   
  2.     this.last = start + limit;   
  3.     this.limit = limit;   
  4.     list = new ArrayList(limit);   
  5.     SessionFactory sf = (SessionFactory) SpringUtil   
  6.             .getBean("sessionFactory");   
  7.     Session session = sf.openSession();   
  8.     Criteria criteria = session.createCriteria(clazz);   
  9.     for (Criterion crierion : listCriteria) {   
  10.         criteria.add(crierion);   
  11.     }   
  12.     criteria.setFirstResult(start);   
  13.   
  14.   
  15.     criteria.setMaxResults(start + limit);   
  16.     List result = criteria.list();   
  17.     if (result != null) {   
  18.         Iterator iterator = result.iterator();   
  19.         while (iterator.hasNext()) {   
  20.             list.add(iterator.next());   
  21.         }   
  22.     }   
  23.   
  24.     session.close();   
  25. }  
	public void fullData(int start, int limit) {
		this.last = start + limit;
		this.limit = limit;
		list = new ArrayList(limit);
		SessionFactory sf = (SessionFactory) SpringUtil
				.getBean("sessionFactory");
		Session session = sf.openSession();
		Criteria criteria = session.createCriteria(clazz);
		for (Criterion crierion : listCriteria) {
			criteria.add(crierion);
		}
		criteria.setFirstResult(start);


		criteria.setMaxResults(start + limit);
		List result = criteria.list();
		if (result != null) {
			Iterator iterator = result.iterator();
			while (iterator.hasNext()) {
				list.add(iterator.next());
			}
		}

		session.close();
	}

 fullData还有一个重要的作用就是初始化被代理的list,这段代码都是hibernate的操作。
      下面就把完整的代码贴出来,实体类就不贴附件里有代码。

   1、memberList.zul

Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>   
  3. <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="./demo"?>   
  4. <window id="demo">   
  5.        
  6.     <zscript language="javascript" src="memberList.js">   
  7.     </zscript>   
  8.     <groupbox id="main" mold="3d" width="100%">   
  9.         <caption label="View">   
  10.             <button label="新 增" height="18px"  
  11.                 onClick="newUserWin.doModal();" />   
  12.             <button label="查 询" height="18px"  
  13.                 onClick="queryUserWin.doModal();" />   
  14.             <button label="修 改" height="18px"  
  15.                 onClick="updateUserWin.doModal();" />   
  16.         </caption>   
  17.         <window id="userWin">   
  18.             <listbox id="userListBox" mold="paging"  
  19.                 model="@{memberList}" selectedItem="@{selectedMember}">   
  20.                 <listhead>   
  21.                     <listheader label="登陆名" sort="auto" />   
  22.                     <listheader label="中文名" sort="auto" />   
  23.                     <listheader label="注册日期" sort="auto" />   
  24.                 </listhead>   
  25.   
  26.                 <listitem self="@{each=member}">   
  27.                     <listcell label="@{member.loginname}" />   
  28.                     <listcell label="@{member.truename}" />   
  29.                     <listcell label="@{member.registDate}" />   
  30.                 </listitem>   
  31.             </listbox>   
  32.         </window>   
  33.     </groupbox>   
  34.   
  35.     <window id="newUserWin" visible="false" width="480px">   
  36.         <groupbox mold="3d" width="100%">   
  37.             <caption label="新增用户"></caption>   
  38.             <grid>   
  39.                 <rows>   
  40.                     <row>   
  41.                         <label value="帐 号" />   
  42.                         <textbox id="user_loginname"  
  43.                             value="@{member.loginname}" constraint="/.{2,4}/:长度在2,4之间" />   
  44.                     </row>   
  45.                     <row>   
  46.                         <label value="用户名" />   
  47.                         <textbox id="user_truename"  
  48.                             value="@{member.truename}" />   
  49.                     </row>   
  50.                     <row>   
  51.                         <label value="密 码" />   
  52.                         <textbox id="user_password"  
  53.                             value="@{member.password}" />   
  54.                     </row>   
  55.                 </rows>   
  56.             </grid>   
  57.             <separator />   
  58.             <hbox spacing="10px">   
  59.                 <space bar="false" spacing="10px" />   
  60.                 <button label="确 定" onClick="save()" />   
  61.                 <button label="取 消"  
  62.                     onClick="newUserWin.setVisible(false);" />   
  63.             </hbox>   
  64.         </groupbox>   
  65.     </window>   
  66.     <window id="queryUserWin" visible="false" width="480px">   
  67.         <groupbox mold="3d" width="100%">   
  68.             <caption label="查询用户"></caption>   
  69.             <grid>   
  70.                 <rows>   
  71.                     <row>   
  72.                         <label value="帐 号" />   
  73.                         <textbox id="query_loginname" />   
  74.                     </row>   
  75.                     <row>   
  76.                         <label value="用户名" />   
  77.                         <textbox id="query_truename" />   
  78.                     </row>   
  79.                 </rows>   
  80.             </grid>   
  81.             <separator />   
  82.             <hbox spacing="10px">   
  83.                 <space bar="false" spacing="10px" />   
  84.                 <button label="查 询" onClick="javascript:query();" />   
  85.                 <button label="取 消"  
  86.                     onClick="queryUserWin.setVisible(false);" />   
  87.             </hbox>   
  88.         </groupbox>   
  89.     </window>   
  90.     <window id="updateUserWin" visible="false" width="480px">   
  91.         <groupbox mold="3d" width="100%">   
  92.             <caption label="修改用户"></caption>   
  93.             <grid>   
  94.                 <rows>   
  95.                     <row>   
  96.                         <label value="帐 号" />   
  97.                         <textbox value="@{selectedUser.loginname}" />   
  98.                     </row>   
  99.                     <row>   
  100.                         <label value="用户名" />   
  101.                         <textbox value="@{selectedUser.truename}" />   
  102.                     </row>   
  103.                     <row>   
  104.                         <label value="密 码" />   
  105.                         <textbox value="@{selectedUser.password}" />   
  106.                     </row>   
  107.   
  108.                 </rows>   
  109.             </grid>   
  110.             <separator />   
  111.             <hbox spacing="10px">   
  112.                 <space bar="false" spacing="10px" />   
  113.                 <button label="确 定" onClick="javascript:update();" />   
  114.                 <button label="取  消"  
  115.                     onClick="updateUserWin.setVisible(false);" />   
  116.             </hbox>   
  117.         </groupbox>   
  118.     </window>   
  119. </window>  
<?xml version="1.0" encoding="UTF-8"?>
<?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="./demo"?>
<window id="demo">
	
	<zscript language="javascript" src="memberList.js">
	</zscript>
	<groupbox id="main" mold="3d" width="100%">
		<caption label="View">
			<button label="新 增" height="18px"
				onClick="newUserWin.doModal();" />
			<button label="查 询" height="18px"
				onClick="queryUserWin.doModal();" />
			<button label="修 改" height="18px"
				onClick="updateUserWin.doModal();" />
		</caption>
		<window id="userWin">
			<listbox id="userListBox" mold="paging"
				model="@{memberList}" selectedItem="@{selectedMember}">
				<listhead>
					<listheader label="登陆名" sort="auto" />
					<listheader label="中文名" sort="auto" />
					<listheader label="注册日期" sort="auto" />
				</listhead>

				<listitem self="@{each=member}">
					<listcell label="@{member.loginname}" />
					<listcell label="@{member.truename}" />
					<listcell label="@{member.registDate}" />
				</listitem>
			</listbox>
		</window>
	</groupbox>

	<window id="newUserWin" visible="false" width="480px">
		<groupbox mold="3d" width="100%">
			<caption label="新增用户"></caption>
			<grid>
				<rows>
					<row>
						<label value="帐 号" />
						<textbox id="user_loginname"
							value="@{member.loginname}" constraint="/.{2,4}/:长度在2,4之间" />
					</row>
					<row>
						<label value="用户名" />
						<textbox id="user_truename"
							value="@{member.truename}" />
					</row>
					<row>
						<label value="密 码" />
						<textbox id="user_password"
							value="@{member.password}" />
					</row>
				</rows>
			</grid>
			<separator />
			<hbox spacing="10px">
				<space bar="false" spacing="10px" />
				<button label="确 定" onClick="save()" />
				<button label="取 消"
					onClick="newUserWin.setVisible(false);" />
			</hbox>
		</groupbox>
	</window>
	<window id="queryUserWin" visible="false" width="480px">
		<groupbox mold="3d" width="100%">
			<caption label="查询用户"></caption>
			<grid>
				<rows>
					<row>
						<label value="帐 号" />
						<textbox id="query_loginname" />
					</row>
					<row>
						<label value="用户名" />
						<textbox id="query_truename" />
					</row>
				</rows>
			</grid>
			<separator />
			<hbox spacing="10px">
				<space bar="false" spacing="10px" />
				<button label="查 询" onClick="javascript:query();" />
				<button label="取 消"
					onClick="queryUserWin.setVisible(false);" />
			</hbox>
		</groupbox>
	</window>
	<window id="updateUserWin" visible="false" width="480px">
		<groupbox mold="3d" width="100%">
			<caption label="修改用户"></caption>
			<grid>
				<rows>
					<row>
						<label value="帐 号" />
						<textbox value="@{selectedUser.loginname}" />
					</row>
					<row>
						<label value="用户名" />
						<textbox value="@{selectedUser.truename}" />
					</row>
					<row>
						<label value="密 码" />
						<textbox value="@{selectedUser.password}" />
					</row>

				</rows>
			</grid>
			<separator />
			<hbox spacing="10px">
				<space bar="false" spacing="10px" />
				<button label="确 定" onClick="javascript:update();" />
				<button label="取  消"
					onClick="updateUserWin.setVisible(false);" />
			</hbox>
		</groupbox>
	</window>
</window>

 注意zul文件开头处理指令variable-resolver指定了org.zkoss.zkplus.spring.DelegatingVariableResolver来处理

EL中的变量,使用这个类可以在EL中直接使用spring定义的bean id,例如

      <variables mService="${memberService}" />

就是引用spring ApplictionContext中id为memberService的bean来定义名为mService的变量。init指令初始化了

org.zkoss.zkplus.databind.AnnotateDataBinderInit,这个类用来就是用来实现数据绑定的,至于是怎么实现的我

也不太清楚,只知道初始化后就可以使用数据绑定了。

   2、memberList.js

Java代码 复制代码
  1. var member  = new com.liyuan.spore.entity.Member();   
  2. var memberList = memberService.queryAllUser();   
  3. var selectedMember = memberList.get(0);   
  4. function save(){   
  5.   if(memberService.userIsExist(member.loginname)){   
  6.      memberService.saveNewUser(member);   
  7.      newUserWin.setVisible(false);   
  8.   }else  
  9.      throw new WrongValueException(user_loginname, "账号已存在!");   
  10. }   
  11. function query(){   
  12.   var loginname=queryUserWin.getFellow("query_loginname").value;   
  13.   var truename=queryUserWin.getFellow("query_truename").value;   
  14.   var queryUser  = new com.liyuan.spore.entity.Member();   
  15.   if(!"".equals(loginname))   
  16.      queryUser.setLoginname("%"+loginname+"%");   
  17.   if(!"".equals(truename))   
  18.      queryUser.setTruename("%"+truename+"%");   
  19.   ulist = main.getFellow("userWin").getFellow("userListBox");   
  20.   newList = new org.zkoss.zkplus.databind.BindingListModelList(memberService.query(queryUser),true);           
  21.   ulist.setModel(newList);   
  22.   selectedMember = newList.getElementAt(0);   
  23.   queryUserWin.setVisible(false);   
  24. }   
  25. function update(){   
  26.   memberService.modify(selectedUser);   
  27. }  
var member  = new com.liyuan.spore.entity.Member();
var memberList = memberService.queryAllUser();
var selectedMember = memberList.get(0);
function save(){
  if(memberService.userIsExist(member.loginname)){
     memberService.saveNewUser(member);
     newUserWin.setVisible(false);
  }else
     throw new WrongValueException(user_loginname, "账号已存在!");
}
function query(){
  var loginname=queryUserWin.getFellow("query_loginname").value;
  var truename=queryUserWin.getFellow("query_truename").value;
  var queryUser  = new com.liyuan.spore.entity.Member();
  if(!"".equals(loginname))
     queryUser.setLoginname("%"+loginname+"%");
  if(!"".equals(truename))
     queryUser.setTruename("%"+truename+"%");
  ulist = main.getFellow("userWin").getFellow("userListBox");
  newList = new org.zkoss.zkplus.databind.BindingListModelList(memberService.query(queryUser),true);        
  ulist.setModel(newList);
  selectedMember = newList.getElementAt(0);
  queryUserWin.setVisible(false);
}
function update(){
  memberService.modify(selectedUser);
}

第2行,调用memberService.queryAllUser()获取一个可以分页的list在memberList.zul中又通过注释的方式把数据绑

定到了listbox上。这里的memberService是直接通过org.zkoss.zkplus.spring.DelegatingVariableResolver引用

的spring ApplicationContext中定义的bean。

   3、MemberService

Java代码 复制代码
  1. package com.liyuan.spore.zkdemo;   
  2.   
  3. import java.math.BigDecimal;   
  4. import java.util.List;   
  5. import org.hibernate.Criteria;   
  6. import org.hibernate.Query;   
  7. import org.hibernate.Session;   
  8. import org.hibernate.SessionFactory;   
  9. import org.hibernate.criterion.Example;   
  10. import org.hibernate.criterion.Projections;   
  11. import org.hibernate.criterion.Restrictions;   
  12. import org.springframework.beans.factory.annotation.Autowired;   
  13. import org.springframework.beans.factory.annotation.Qualifier;   
  14. import org.springframework.context.annotation.Scope;   
  15. import org.springframework.stereotype.Service;   
  16. import org.springframework.transaction.annotation.Propagation;   
  17. import org.springframework.transaction.annotation.Transactional;   
  18. import com.liyuan.spore.entity.Member;   
  19.   
  20. @Service("memberService")   
  21. @Scope("request")   
  22. public class MemberService {   
  23.     private SessionFactory sessionFactory;   
  24.   
  25.     @Autowired  
  26.     public void setSessionFactory(@Qualifier("sessionFactory")   
  27.     SessionFactory sessionFactory) {   
  28.         this.sessionFactory = sessionFactory;   
  29.     }   
  30.   
  31.     @Transactional(readOnly = true, propagation = Propagation.REQUIRED)   
  32.     public PagingList queryAllUser() {   
  33.         Session session = sessionFactory.getCurrentSession();   
  34.         Query query = session.createSQLQuery("select count(*) from T_MEMBER");   
  35.         BigDecimal size = (BigDecimal) query.uniqueResult();   
  36.         PagingList plist = new PagingList(Member.class, size.intValue());   
  37.         plist.fullData(020);   
  38.         return plist;   
  39.     }   
  40.   
  41.     @Transactional(readOnly = true, propagation = Propagation.REQUIRED)   
  42.     public boolean userIsExist(String loginname) {   
  43.         Session session = sessionFactory.getCurrentSession();   
  44.         List list = session.createCriteria(Member.class).add(   
  45.                 Restrictions.eq("loginname", loginname)).list();   
  46.         return list.isEmpty();   
  47.   
  48.     }   
  49.   
  50.     @Transactional(readOnly = false, propagation = Propagation.REQUIRED)   
  51.     public void saveNewUser(Member user) {   
  52.         Session session = sessionFactory.getCurrentSession();   
  53.         session.save(user);   
  54.     }   
  55.   
  56.     @Transactional(readOnly = true, propagation = Propagation.REQUIRED)   
  57.     public PagingList query(Member user) {   
  58.         Session session = sessionFactory.getCurrentSession();   
  59.   
  60.         Example example = Example.create(user);   
  61.         example.enableLike();   
  62.         example.excludeZeroes();   
  63.         example.excludeNone();   
  64.         Criteria criteria = session.createCriteria(Member.class);   
  65.         criteria.setProjection(Projections.rowCount()).add(example);   
  66.         Integer size = (Integer) criteria.uniqueResult();   
  67.         PagingList plist = new PagingList(Member.class, size.intValue());   
  68.         plist.addCriterion(example);   
  69.         plist.fullData(020);   
  70.         return plist;   
  71.   
  72.     }   
  73.   
  74.     @Transactional(readOnly = false, propagation = Propagation.REQUIRED)   
  75.     public void modify(Member user) {   
  76.         Session session = sessionFactory.getCurrentSession();   
  77.         session.update(user);   
  78.     }   
  79. }  
package com.liyuan.spore.zkdemo;

import java.math.BigDecimal;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.liyuan.spore.entity.Member;

@Service("memberService")
@Scope("request")
public class MemberService {
	private SessionFactory sessionFactory;

	@Autowired
	public void setSessionFactory(@Qualifier("sessionFactory")
	SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
	public PagingList queryAllUser() {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createSQLQuery("select count(*) from T_MEMBER");
		BigDecimal size = (BigDecimal) query.uniqueResult();
		PagingList plist = new PagingList(Member.class, size.intValue());
		plist.fullData(0, 20);
		return plist;
	}

	@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
	public boolean userIsExist(String loginname) {
		Session session = sessionFactory.getCurrentSession();
		List list = session.createCriteria(Member.class).add(
				Restrictions.eq("loginname", loginname)).list();
		return list.isEmpty();

	}

	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void saveNewUser(Member user) {
		Session session = sessionFactory.getCurrentSession();
		session.save(user);
	}

	@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
	public PagingList query(Member user) {
		Session session = sessionFactory.getCurrentSession();

		Example example = Example.create(user);
		example.enableLike();
		example.excludeZeroes();
		example.excludeNone();
		Criteria criteria = session.createCriteria(Member.class);
		criteria.setProjection(Projections.rowCount()).add(example);
		Integer size = (Integer) criteria.uniqueResult();
		PagingList plist = new PagingList(Member.class, size.intValue());
		plist.addCriterion(example);
		plist.fullData(0, 20);
		return plist;

	}

	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void modify(Member user) {
		Session session = sessionFactory.getCurrentSession();
		session.update(user);
	}
}

这段代码没有什么好解释的。

   4、PagingList.java

Java代码 复制代码
  1. package com.liyuan.spore.zkdemo;   
  2.   
  3. import java.util.AbstractList;   
  4. import java.util.ArrayList;   
  5.   
  6. import java.util.Iterator;   
  7. import java.util.LinkedList;   
  8. import java.util.List;   
  9. import java.util.ListIterator;   
  10.   
  11. import org.hibernate.Criteria;   
  12. import org.hibernate.Session;   
  13. import org.hibernate.SessionFactory;   
  14. import org.hibernate.criterion.Criterion;   
  15. import org.zkoss.zkplus.spring.SpringUtil;   
  16.   
  17. public class PagingList extends AbstractList implements java.io.Serializable {    </
    分享到:
    评论

相关推荐

    ZK MVC与MVVM模式联合实现动态分页

    ZK中利用paging组件, 结合MVC与MVVM两种模式,实现大量数据的动态分页。

    ZK树的递归实现

    ZK树的递归实现

    源码:zk-SNARKs实战:使用circom和snarkjs实现简单版的Tornado

    该源代码对应本人博文《zk-SNARKs实战:使用circom和snarkjs实现简单版的Tornado(含源码)》,如要看该文章,可直接在百度中根据题目搜索

    zk使用curator实现分布式锁

    zookeeper通过使用curator实现分布式锁来保证数据的一致性。 zookeeper通过使用curator实现分布式锁来保证数据的一致性。

    zk+jsp实现登录、注册、修改密码小例子

    ZK是一个深受欢迎的开源AJAX框架, 只需少許的编程, 就能丰富网络应用程序界面。 觉得zk不错,用它写个小例子。

    zk+spring+hibernate例子

    主要介绍了zk+spring+hibernate的使用方法 早期使用的是 hibernate的配置文件 后来 被改成了 引用注释的方式 老的绑定文件也没有删除,sql下面由数据库文件 导入mysql就可以,不错的教学例子 学习起来很简单

    使用JMeter对ZK性能测试时需要安装的插件

    使用方法: 1.解压后classes\foo\jmtest目录 直接覆盖在 被测的ZK平台对应目录中(WEB-INF下)。 2.修改zk.xml文件,添加下面内容(WEB-INF下) &lt;system-config&gt; &lt;id-generator-class&gt;foo.jmtest....

    ZK框架学习总结

    ZK框架是一个用JAVA实现的简单但是功能强大的表现层框架。它包括了一个基于Ajax的事件驱动引擎、这也是它的最大特色。可以做到没有JavaScript,只通过ZUML(ZK User Interface Markup Language)这种标识语言即可做到...

    zk入门.web框架

    zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架

    车票管理系统ZK实现

    ZK实现的简单车票管理系统,如果你的课程设计是这个的话,让你完成课程设计

    zk框架zk7api

    zk后台api很全的,对于学习ZK很有用的。

    zk-bin-6.5.0.zip

    zk-6.5.0.zip ZK 6.5.0 Sep 12, 2012 * Features ZK-447: The file upload allows users to drag and drop local files (HTML5) ZK-1241: ZK Client Widget support swipe event for tablet/mobile device ZK-...

    ZK开发手册 ZK开发手册

    ZK开发手册 ZK开发手册 ZK开发手册 ZK开发手册 ZK开发手册

    zk 合并表头.docx

    zk页面实现复杂表头的方法, 合并表头的方法,还有代码的例子,zk页面实现复杂表头的方法, 合并表头的方法,还有代码的例子

    zk_lock:用zk实现的分布式锁

    zk_lock 用zk实现的分布式锁 实现分布式锁 保留线程中断特性 保留条件锁特性 同一进程内多线程竞争,进行本地排队 支持本地排队优先执行策略

    zk:redis分布式锁.zip

    里面包含zk的分布式锁,包括原生客户端API的方式,以及框架的方式。还有red is的原生客户端API方式,以及框架的方式

    ZK 6.5.0版本全面文档,供专业开发,学习 zk-mvvm-book ,ZK 8.0.0 Client-side Reference

    ZK 8.0.0端参考 ZK 8.0.0组件开发的必需品 ZK 8.0.0组件引用 ZK 8.0.0配置参考 ZK 8.0.0开发人员的参考 ZK 8.0.0风格定制指南 ZK 8.0.0 ZUML参考 zk-mvvm-book

    zk目录树设计

    zk框架,实现手动添加树的节点,在开发的过程中可以方便开发人员的使用

    最新版 ZK SRC

    最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC最新版 ZK SRC

Global site tag (gtag.js) - Google Analytics