您的位置:首页 > 其它

Hibernate在企业中的实战作用

2014-07-20 19:17 387 查看
实习也有一段时间了,今天对企业中Hibernate的实战作用作一个总结。

实际开发中在dao的设计上会有一个BaseDao<T>的接口,里面定义了实体的一些基本的操作,然后会有一个BaseDaoHibernate<T>的实现类来实现BaseDao<T>接口并且扩展了HibernateDaoSupport ,最后其它的一些实体比如UserDao ,BookDao 等等都会像下图那样设计成接口的形式,而它们的实现类UserDaoImpl,BookDaoImpl不仅继承了BaseDaoHibernate<T>还实现了UserDao
或 BookDao接口,这样一来很多实体通有的操作就不需要我们重复的去写,不仅增加了开发效率,同时程序的扩展性也得到了加强。

同时Service 和dao层分开,service负责业务逻辑的处理,而dao只管数据库的操作,这样是的层次更加清楚,代码也更加便于管理。

首先附上一张实际开发中的UML图:



下面给出一个具体的例子:

首先applicationContext.xml 文件中的配置信息,都是在另外的properties文件中得到的,比如jdbc.properties文件中有:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_extjs
jdbc.username=root
jdbc.password=xwjayw

hibernate.show_sql=true
hbm2ddl.auto=update
hibernate.format_sql=true


那么原来配置文件应该改写成:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 
<context:annotation-config></context:annotation-config>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<context:component-scan base-package="edu.hue.jk"></context:component-scan>

<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:jdbc.properties</value>   <!--使用指定的properties文件的位置  -->
</property>
</bean>
<!-- xml 中数据源的信息都是从配置文件中得到,有助于信息的维护 -->
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="packagesToScan">
<list>
<value>edu.hue.jk.bean</value>
</list>
</property>
<property name="hibernateProperties">
<!-- 从配置文件中得到各种属性的值,更改的时候只需要改变配置文件从的值即可 -->
<props>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hbm2ddl.auto">${hbm2ddl.auto}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
</props>
</property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="baseDaoHibernate" class="edu.hue.jk.baseDaoHibernate.BaseDaoHibernate">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
<bean id="bookDao" class="edu.hue.jk.daoImpl.BookDaoImpl">
<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>
</beans>

首先由BaseDao<T> 定义了一些实体的通有的操作:

import java.io.Serializable;
import java.util.List;
/***
* BaseDao 接口中定义了所以实体都有的基本操作
* @author dell
*
* @param <T>     使用泛型增加通用性
*/
public interface BaseDao<T> {
// 根据Id 得到实体
T get(Class<T> entityClazz,Serializable id);
//保存实体
void save(T entity);
//更新实体
void update(T entity);
//删除实体
void delete(T entity);
// 根据Id 删除实体
void delete(Class<T> entityClazz,Serializable id);
//得到所有的实体
List<T> findAll(Class<T> entityClazz);
// 得到实体所有的记录
long getCount(Class<T> entityClazz);
}

然后BaseDaoHinernate<T> :

import java.io.Serializable;
import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import edu.hue.jk.baseDao.BaseDao;
/**
* 使用HibernateTemplate 实现接口中的方法,是操作更加方便
* 实现BaseDao接口中的所有方法,同时可以根据需要增加新的方法,比如分页查询
* @author dell
*
* @param <T>
*/
@Repository("baseDaoHibernate")
public class BaseDaoHibernate<T> extends HibernateDaoSupport implements BaseDao<T> {

// 得到实体
public T get(Class<T> entityClazz, Serializable id) {
return getHibernateTemplate().get(entityClazz, id);

}
//保存实体
public void save(T entity) {
getHibernateTemplate().save(entity);

}
//修改实体
public void update(T entity) {
getHibernateTemplate().update(entity);
}
// 删除实体
public void delete(T entity) {
getHibernateTemplate().delete(entity);
}
// 根据主键修改实体
public void delete(Class<T> entityClazz, Serializable id) {
delete(get(entityClazz, id));
}
// 得到所有实体
public List<T> findAll(Class<T> entityClazz) {

return getHibernateTemplate().find("from "+entityClazz.getSimpleName() +" en");
}
// 得到所有实体的数目
public long getCount(Class<T> entityClazz) {
List list=getHibernateTemplate().find("select Count(*) from "+entityClazz.getSimpleName()+" en");
if(list!=null && list.size()==1)
return (Long)list.get(0);

return 0;
}

然后看具体的Dao 这里以BookDao为例:

import edu.hue.jk.baseDao.BaseDao;

import edu.hue.jk.bean.Book;

public interface BookDao extends BaseDao<Book> {

}

BookDaoImpl BookDao 的具体实现:

import org.springframework.stereotype.Repository;

import edu.hue.jk.baseDaoHibernate.BaseDaoHibernate;

import edu.hue.jk.bean.Book;

import edu.hue.jk.dao.BookDao;

@Repository("bookDao")

public class BookDaoImpl extends BaseDaoHibernate<Book> implements BookDao {

}

BookService:

import java.io.Serializable;
import java.util.List;

import edu.hue.jk.bean.Book;

public interface BookService {
// 根据Id 得到实体
public Book get(Class<Book> entityClazz,Serializable id);
//保存实体
void save(Book entity);
//更新实体
void update(Book entity);
//删除实体
void delete(Book entity);
// 根据Id 删除实体
void delete(Class<Book> entityClazz,Serializable id);
//得到所有的实体
List<Book> findAll(Class<Book> entityClazz);
// 得到实体所有的记录
long getCount(Class<Book> entityClazz);
}

Service 的具体实现:

@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
@Resource(name="bookDao")
private BookDao bookDao;

public Book get(Class<Book> entityClazz, Serializable id) {
return bookDao.get(entityClazz, id);
}

public void save(Book entity) {
bookDao.save(entity);
}

public void update(Book entity) {
bookDao.update(entity);
}

public void delete(Book entity) {
bookDao.delete(entity);
}

public void delete(Class<Book> entityClazz, Serializable id) {
bookDao.delete(entityClazz, id);

}

public List<Book> findAll(Class<Book> entityClazz) {
return bookDao.findAll(entityClazz);
}

public long getCount(Class<Book> entityClazz) {
return bookDao.getCount(entityClazz);
}

}

就这样每增加一个实体都让上面的顺序执行,并不需要我们为每一个Entity 去写增删查改的方法,同时如果某个Dao需要增加特殊的方法,直接在接口里面写方法然后实现就行了,这样使得程序的扩展性和可维护性打打提高。

结合Extjs 我做了一个小的demo 关于一张book 的增删查改 练习一下,同时也增加Ext 的使用

首先附上我的功能 增删查改的页面 :



增加书本:



修改书本信息:选择下拉框



书本信息:



修改提交:



删除书本信息:



关于EXtjs 的所有代码:

var form;
Ext.onReady(function(){
//  显示books 的信息
Ext.define('Book', {      //定义一个Book 的model
extend: 'Ext.data.Model',
fields: [
{name: 'bookId', type: 'int'},
{name: 'bookName',  type: 'string'},
{name: 'bookAuthor', type: 'string'},
{name: 'bookPrice',  type: 'float'}
]
});
bookStore = new Ext.data.JsonStore({        //设置为全局变量,作为grid  的数据源
// store configs
autoDestroy: true,
model: 'Book',  //使用哪个模型来创建store
pageSize:3,  //用来显示分页使用,每页显示3条数据
proxy: {  //使用 proxy来远程加载数据
type: 'ajax',
url: 'getBooksPageAction',
reader: {
type: 'json',
root: 'books',
totalProperty: 'total'   //总共有多少条记录
//返回的数据格式为:
//{"total":9,"books":[{"bookAuthor":"马士兵","bookId":1,"bookPrice":12.5,"bookName":"book1"},{"bookAuthor":"马士兵2","bookId":2,"bookPrice":14.5,"bookName":"book2"},{"bookAuthor":"马士兵3","bookId":3,"bookPrice":15.5,"bookName":"book3"}
}
},
autoLoad:true    // store 初始化自动加载数据
});

cbookStore = new Ext.data.JsonStore({        //设置为全局变量       作为conbobox的数据源
// store configs
autoDestroy: true,
model: 'Book',  //使用哪个模型来创建store
pageSize:3,  //用来显示分页使用,每页显示3条数据
proxy: {  //使用 proxy来远程加载数据
type: 'ajax',
url: 'getAllBooks',
reader: {
type: 'json',
root: 'books',
totalProperty: 'total'   //总共有多少条记录
}
},
autoLoad:true    // store 初始化自动加载数据
});

//  主页上的显示
Ext.create('Ext.container.Viewport', {       // 主页面的布局和显示
layout: 'border',   // 使用borderLayout方式布局
items: [{
region: 'north',
html: '<h1 class="x-panel-header">Book System</h1>',
//title:'pageTitle',
border: false,
margins: '0 0 5 0'    //
}, {
region: 'west',
collapsible: true,
title: 'Navigation',
width: 150
// 这里通常可以使用 TreePanel 或者 AccordionLayout布局的导航菜单
}, {
region: 'south',
title: 'South Panel',
collapsible: true,
html: 'Information goes here',
split: true,
height: 100,
minHeight: 100
}, {
region: 'east',
title: 'East Panel',
collapsible: true,
split: true,
width: 150
}, {
region: 'center',
xtype:'tabpanel', // TabPanel本身没有title属性
activeTab: 0,      // 配置默认显示的激活面板
items: [{

title: 'Default Tab',
html: 'The first tab\'s content. Others may be added dynamically',

},{
title: 'showAllBooks', /***************************显示所有书本的面板**********************/

items:[
{
xtype:'grid',
title: 'all books list',
store: bookStore,
columns: [
{ header: 'bookId',  dataIndex: 'bookId' },
{ header: 'bookName', dataIndex: 'bookName', flex: 1,field: 'textfield' },  // 对bookName进行编辑
{ header: 'bookAuthor', dataIndex: 'bookAuthor'},
{ header: 'bookPrice', dataIndex: 'bookPrice' },
{ text: 'delete',
xtype: 'actioncolumn',  //  动作列,当激发动作时会用处理函数  用来删除某一条记录
width:50,
items:[{
icon: 'images/delete.png',
tooltip: 'Delete',

handler:function(grid,rowIndex,colIndex){
if(confirm("do you really want to delete the book?")){
var record=grid.getStore().getAt(rowIndex); // 得到当前行的记录
//alert("deleting"+recolrd.get('bookName'));
Ext.Ajax.request({       // 使用Ext的AJax方式发送请求
url:'deleteBookAction',
method:'post',
params:{bookId:record.get('bookId')},
success: function(data){
bookStore.reload(); // 数据重新加载
cbookStore.reload();
alert(data.responseText);
}

});
}
}
}],

}
],
//				    selType: 'rowmodel', // 启用行内编辑器
//				    plugins: [
//				              Ext.create('Ext.grid.plugin.RowEditing', {
//				                  clicksToEdit: 1
//				              })
//				          ],
height: 200,
width: 400,

bbar:{              //添加分页工具栏
id:'pageBar',
xtype:'pagingtoolbar',
region:'south',
store:bookStore,   // 指定分页的store对象
displayInfo:true,
emptyMsg:"没有记录",
//				    	listeners:{
//				    		change: function (paging,pageData){
//				    			Ext.getCmp('books_combo').reset();
//				    		}
//				    	}

}
}

]

}
,{
title: 'addBook', /***************************添加书本的面板**********************/
items:[{
xtype:'form',
id:'form1',
width: 500,
height: 300,
title: "FormLayout Panel",
layout: 'form',
bodyPadding: 5,
defaultType: 'textfield',
items: [{
fieldLabel: 'book Name',
name: 'bookName',
allowBlank:false
},{
fieldLabel: 'authorName',
name: 'bookAuthor'
},{
fieldLabel: 'bookPrice',
name: 'bookPrice'
}, {
xtype:'button',
text:'submit',
handler:submit

}]

}]
},
{
title: 'updateBook',       /***************************修改书本的面板**********************/
items:[{
xtype:'form',
id:'form2',
width: 500,
height: 300,
title: "FormLayout Panel",
layout: 'form',
bodyPadding: 5,
defaultType: 'textfield',
items: [
{
xtype:'combobox',
id:'combo',
fieldLabel: 'Choose you want change Book',
store: cbookStore,
queryMode: 'remote',
displayField: 'bookName',
valueField: 'bookId',
listeners:{               // 配置当某行选中时的处理函数
'select': yourFunction
}
},
{
xtype: 'textfield',
fieldLabel: 'book Id',
name: 'bookId',
id: 'cbookId',
readOnly:true       // 设置为只读属性不能修改,主键嘛
},
{
xtype: 'textfield',
fieldLabel: 'book Name',
name: 'bookName',
id: 'cbookName',
allowBlank:false
},{
xtype: 'textfield',
fieldLabel: 'authorName',
name: 'bookAuthor',
// value:'booke',
id: 'cbookAuthor'

},{
xtype: 'textfield',
fieldLabel: 'bookPrice',
id: 'cbookPrice',
name: 'bookPrice'
}, {
xtype:'button',
text:'update',
handler:function(){
Ext.getCmp("form2").getForm().submit({
url:'updateBookAction',       // 提交给对应的action进行处理 返回的json数据格式:{success:true}
method:'POST',
waitTitle : "提示",
waitMsg: 'Submitting your data',
success: function(form, action){   // 数据提交成功之后的回调函数
// alert(action.response.responseText);
var json = eval('(' + action.response.responseText + ')');   // 将返回的json字符串转化成json对象
//alert(json.success);
bookStore.reload();    //  重新加载数据
cbookStore.reload();
if(json.success==true)
alert("update Book successful");
},
failure: function(form, action){
alert(action.result.errormsg);
}
});

}

}
]

}]
}
]
}]
});

form=Ext.getCmp("form1");
});

function submit(){         //  使用默认的ajax 提交form 表单
form.getForm().submit({
url:'addBook',       // 提交给对应的action进行处理 返回的json数据格式:{success:true}
method:'POST',
waitTitle : "提示",
waitMsg: 'Submitting your data',
success: function(form, action){   // 数据提交成功之后的回调函数
// alert(action.response.responseText);
bookStore.reload();    //  重新加载数据
cbookStore.reload();
var json = eval('(' + action.response.responseText + ')');   // 将返回的json字符串转化成json对象
//alert(json.success);
if(json.success==true)
alert("insert Book successful");
},
failure: function(form, action){
alert(action.result.errormsg);
}
});

}

function yourFunction(){    // combobox 被选中的事件处理函数
var com=Ext.getCmp('combo');
var currentRow=cbookStore.findRecord("bookId",com.value);      //  由store 的方法  得到某一条记录,findRecord 是模糊查询
// 可以根据指定的正则表达式查询或则是根据摸个字段的值进行匹配查询,返回结果的为 Ext.Model
//alert(currentRow.get('bookName'));           //  得到当前选中的 value,使用Model中的get("字段名")的方法

//alert(Ext.getCmp('cbookName').value);
Ext.getCmp('cbookId').setValue(currentRow.get('bookId'));
Ext.getCmp('cbookName').setValue(currentRow.get('bookName'));  // 为每个textField 设值为当前  Store行中的值
Ext.getCmp('cbookPrice').setValue(currentRow.get('bookPrice'));
Ext.getCmp('cbookAuthor').setValue(currentRow.get('bookAuthor'));

}

struts.xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="bookservice" extends="json-default">
<action name="getBooksPageAction" class="edu.hue.jk.action.GetBooksPageAction">
<result type="json">
<param name="root">result</param>
</result>
</action>

<action name="addBook" class="edu.hue.jk.action.AddBook">
<result type="json">
<param name="root">result</param>
</result>
</action>
<action name="deleteBookAction" class="edu.hue.jk.action.DeleteBookAction">
<result   type="json">
<param name="root">result</param> <!-- root表示返回对象的层级为根部             result是返回结果 -->
</result>
</action>
<action name="updateBookAction" class="edu.hue.jk.action.UpdateBookAction">
<result   type="json">
<param name="root">result</param> <!-- root表示返回对象的层级为根部             result是返回结果 -->
</result>
</action>
<action name="getAllBooks" class="edu.hue.jk.action.GetAllBooksAction">
<result   type="json">
<param name="root">result</param> <!-- root表示返回对象的层级为根部             result是返回结果 -->
</result>
</action>
</package>
</struts>


所有Action 的代码:

package edu.hue.jk.action;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import edu.hue.jk.bean.Book;
import edu.hue.jk.dao.BookDao;
@Controller("addBook")
public class AddBook extends ActionSupport {
private String bookName;
private String bookAuthor;
private float bookPrice;
private JSONObject result;
private BookDao bookDao;

public BookDao getBookDao() {
return bookDao;
}

@Resource(name="bookDao")
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}

public String getBookName() {
return bookName;
}

public String getBookAuthor() {
return bookAuthor;
}

public float getBookPrice() {
return bookPrice;
}

public JSONObject getResult() {
return result;
}

public void setBookName(String bookName) {
this.bookName = bookName;
}

public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}

public void setBookPrice(float bookPrice) {
this.bookPrice = bookPrice;
}

public void setResult(JSONObject result) {
this.result = result;
}

@Override
public String execute() throws Exception {
//System.out.println("bookName:"+bookName+"bookPrice:"+bookPrice+"bookAuthor:"+bookAuthor);
Book book=new Book(bookName,bookAuthor,bookPrice);
bookDao.save(book);
Map<String,Object> map=new HashMap<String,Object>();
map.put("success", true);
result=JSONObject.fromObject(map);
return super.execute();
}

}

@Controller("updateBookAction")
public class UpdateBookAction extends ActionSupport {
private int bookId;
private String bookName;
private String bookAuthor;
private float bookPrice;
private JSONObject result;
private BookDao bookDao;

public int getBookId() {
return bookId;
}

public void setBookId(int bookId) {
this.bookId = bookId;
}

public BookDao getBookDao() {
return bookDao;
}

@Resource(name="bookDao")
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public String getBookName() {
return bookName;
}

public String getBookAuthor() {
return bookAuthor;
}

public float getBookPrice() {
return bookPrice;
}

public JSONObject getResult() {
return result;
}

public void setBookName(String bookName) {
this.bookName = bookName;
}

public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}

public void setBookPrice(float bookPrice) {
this.bookPrice = bookPrice;
}

public void setResult(JSONObject result) {
this.result = result;
}

@Override
public String execute() throws Exception {
//System.out.println("bookName:"+bookName+"bookPrice:"+bookPrice+"bookAuthor:"+bookAuthor);
Book book=bookDao.get(Book.class, bookId);
book.setBookName(bookName);
book.setBookPrice(bookPrice);
book.setBookAuthor(bookAuthor);
bookDao.update(book);

Map<String,Object> map=new HashMap<String,Object>();
map.put("success", true);
result=JSONObject.fromObject(map);
return super.execute();
}

}

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import edu.hue.jk.bean.Book;
import edu.hue.jk.dao.BookDao;
@Controller("deleteBookAction")
public class DeleteBookAction extends ActionSupport {
private int bookId;
private BookDao bookDao;
private JSONObject result;

public JSONObject getResult() {
return result;
}

public void setResult(JSONObject result) {
this.result = result;
}

public int getBookId() {
return bookId;
}

public BookDao getBookDao() {
return bookDao;
}

public void setBookId(int bookId) {
this.bookId = bookId;
}

@Resource(name="bookDao")
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}

@Override
public String execute() throws Exception {
//System.out.println("bookId:"+bookId);
bookDao.delete(Book.class, bookId);
Map<String,Object> map=new HashMap<String,Object>();
map.put("success", true);
result=JSONObject.fromObject(map);
return super.execute();
}

}

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import edu.hue.jk.bean.Book;
import edu.hue.jk.dao.BookDao;
@Controller("getAllBooks")
public class GetAllBooksAction extends ActionSupport {
private JSONObject result;   // 等义返回的数据类型,为json数据
private BookDao bookDao;
public BookDao getBookDao() {
return bookDao;
}
@Resource
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public JSONObject getResult() {
return result;
}
public void setResult(JSONObject result) {
this.result = result;
}
@Override
public String execute() throws Exception {
Map<String,Object> map=new HashMap<String,Object>();
List<Book> books=bookDao.findAll(Book.class);// 得到所有的书本信息
map.put("books", books);
map.put("total", bookDao.getCount(Book.class));
result=JSONObject.fromObject(map);  // 将得到的结果封装成json数据返回

System.out.println(result);
return super.execute();
}

}

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import net.sf.json.JSONObject;

import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;

import edu.hue.jk.bean.Book;
import edu.hue.jk.dao.BookDao;
@Controller("getBooksPageAction")
public class GetBooksPageAction extends ActionSupport {
private JSONObject result;   // 等义返回的数据类型,为json数据
private String start;    // grid在实现分页时每次异步请求都会向服务器提交三个参数  start 表示从那条记录开始
private String page;     // 当前是第几页
private String limit;    // 每页显示多少条记录
private BookDao bookDao;

public BookDao getBookDao() {
return bookDao;
}
@Resource
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public String getStart() {
return start;
}
public String getPage() {
return page;
}
public String getLimit() {
return limit;
}
public void setStart(String start) {
this.start = start;
}
public void setPage(String page) {
this.page = page;
}
public void setLimit(String limit) {
this.limit = limit;
}

public JSONObject getResult() {
return result;
}
public void setResult(JSONObject result) {
this.result = result;
}
@Override
public String execute() throws Exception {
int pageStart=Integer.parseInt(page);
int pageSize=Integer.parseInt(limit);
Map<String,Object> map=new HashMap<String,Object>();
List<Book> books=bookDao.getBookByPage(pageStart, pageSize);  // 根据当前的页号数和每页的显示数进行分页查询
map.put("books", books);
map.put("total", bookDao.getCount(Book.class));
result=JSONObject.fromObject(map);  // 将得到的结果封装成json数据返回

System.out.println(result);
return super.execute();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: