實習也有一段時間了,今天對企業中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();
}
}