2009年12月19日 星期六

實作可編輯的Ext Grid,可刪除Server side data(Database)


開發環境:
IDE:MyEclipse6.6GA
Web Server:Tomcat 6.0.20
Database:MySql 5.1.36
MVC:Struts2.1.8
FrameWork:Spring2.0,Hibernate3.2
Client UI:Ext2.3.0

一、建立可編輯之Ext Grid及JSON output頁面:
1.Ext Grid頁面(editGrid1.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

    

    <title>My JSP 'combox.jsp' starting page</title>

    

 <meta http-equiv="pragma" content="no-cache">

 <meta http-equiv="cache-control" content="no-cache">

 <meta http-equiv="expires" content="0">    

 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

 <meta http-equiv="description" content="This is my page">

 <!--

 <link rel="stylesheet" type="text/css" href="styles.css">

 -->

 <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css">

 <link rel="stylesheet" type="text/css" href="css/onReady.css">

 <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>

 <script type="text/javascript" src="extjs/ext-all.js"></script>

 <script type="text/javascript" src="extjs/ext-lang-zh_TW.js"></script> 

 <script type="text/javascript"><!--

 

  Ext.onReady(function(){

   var store = new Ext.data.Store({

    url: 'SysMgrJson!getMovies.action',

    reader: new Ext.data.JsonReader({root:'results',totalProperty:'totals'}, [

     'id',

     'coverthumb',

     'title',

     'director',

     {name: 'released', type: 'date', dateFormat: 'Y-m-d'},

     'genre',

     'tagline',

     {name: 'price', type: 'float'},

     {name: 'available', type: 'bool'}

    ])

   });

   

   var genres = new Ext.data.Store({

    data: [

     [1,"Comedy"],

     [2,"Drama"],

     [3,"Action"],

     [4,"Mystery"]    

    ],

    reader: new Ext.data.ArrayReader({id:'id'}, [

     'id',

     'genre'])

   }); 

        

   //Combining two columns function

   function title_tagline(val, x, store){

    return '<b>'+val+'</b><br>'+store.data.tagline;

   }

   //Generating HTML and graphics

   function cover_image(val){

    return '<img src="images/'+val+'.jpg" width="50%" height="50%">';

   }

   //for edit field of grid

   var title_edit = new Ext.form.TextField();

   var director_edit = new Ext.form.TextField();

   var tagline_edit = new Ext.form.TextField({

    maxLength: 45

   });

   var released_edit = new Ext.form.DateField();

   var genre_edit = new Ext.form.ComboBox({

    typeAhead: true,

    triggerAction: 'all',

    mode: 'local',

    store: genres,

    displayField:'genre',

    valueField: 'genre'

   });

   

   //for add row to grid

   var ds_model = Ext.data.Record.create([    

    'title',

    'director',

    {name: 'released', type: 'date', dateFormat: 'Y-m-d'},

    'genre',

    'tagline',

    'coverthumb',

    {name: 'price', type: 'float'},

    {name: 'available', type: 'bool'}

   ]);      

   // add your data store here

   var grid = new Ext.grid.EditorGridPanel({

    //renderTo: document.body,

    renderTo:'example-grid',

    frame:true,

    title: 'Movie Database',

    height:300,

    width:550,

    stripeRows:true,

    store: store,

    //增加grid event for Row Selection mode

    sm: new Ext.grid.RowSelectionModel({

     //singleSelect: true,

     listeners: {

      rowselect: {

       fn: function(sm,index,record) {

        index++;

        Ext.Msg.alert('提示','您選擇了,'+record.data.title+',第 '+index+'筆資料');

       }

      }

     }

    }),

    //Altering the grid at the click of a button 

    tbar: [

     //modify title column of grid

     {

      text: '修改 Title',

      handler: function(){

       var sm = grid.getSelectionModel();

       if (sm.hasSelection()){

        var sel = sm.getSelected();

        Ext.Msg.show({

         title: '修改 Title',

         prompt: true,

         buttons: Ext.MessageBox.OKCANCEL,

         value: sel.data.title,

         fn: function(btn,text){

          if (btn == 'ok'){

           sel.set('title', text);

          }

         }

        });

       }

      }

     },

     //hidden price column of grid

     {

      text: 'Hide Price',

      handler: function(btn){

       var cm = grid.getColumnModel();

       var pi = cm.getIndexById('price');

       //var pi=5;

       if (cm.isHidden(pi)){

        cm.setHidden(pi,false);

        btn.setText('Hide Price');

       }else{

        cm.setHidden(pi,true);

        btn.setText('Show Price');

       }

       btn.render();

      }

     },

     //add first row to grid

     {

      text: 'Add Movie(First)',

      icon: 'images/RowInsert.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       grid.getStore().insert(0,new ds_model({

        title:'New Movie',

        director:'',

        genre:0,

        tagline:''

        })

       );

       grid.startEditing(0,0);

      }

     },

     //add last row to grid

     {

      text: 'Add Movie(Last)',

      icon: 'images/RowInsert.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       grid.getStore().insert(grid.getStore().getCount(),new ds_model({

        title:'New Movie',

        director:'',

        genre:0,

        tagline:''

        })

       );

       grid.startEditing(grid.getStore().getCount()-1,0);

      }

     },

     
     //Deleting data from the server

     {

      text: 'Remove Movie',

      icon: 'images/RowDelete.png',

      cls: 'x-btn-text-icon',

      handler: function() {

       var sm = grid.getSelectionModel();

       if (sm.hasSelection()){

        //var sel = sm.getSelected();

        var sels = sm.getSelections();

        var len = sels.length;

        var ids = new Array(len);

        for(var i=0;i<len;i++){

         ids[i] = sels[i].data.id;

         if(i==0){

          var msgs = '刪除: '+sels[i].data.title;

         }else{

          msgs = msgs +',\n'+sels[i].data.title; 

         }

        };

        Ext.Msg.show({

        title: '刪除電影',

         buttons: Ext.MessageBox.YESNOCANCEL,

         msg: msgs,

         fn: function(btn){

          if (btn == 'yes'){

           var conn = new Ext.data.Connection();

           conn.request({

            url: 'SysMgrJson!updateMovies.action',

            method:'post',

            params: {

             action: 'delete',

             id: ids

            },

            success: function(resp,opt) {

             //grid.getStore().remove(sel);

             grid.getStore().reload();

            },

            failure: function(resp,opt) {

             Ext.Msg.alert('Error',

             'Unable to delete movie');

            }

           });

          }

         }

        });

       }else{

        Ext.Msg.alert('提示','請選擇欲刪除(多)列之資料');

       }

      }

     }        

    ],

          bbar: new Ext.PagingToolbar({

              pageSize: 5,

              store: store,

              displayInfo: true,

              displayMsg: '第 {0} 筆 - {1} 筆 of {2} 筆',

              emptyMsg: "沒有資料"

          }),       

    //Defining a Grids column model and want to display column

    columns: [

    {header: "Cover", dataIndex: 'coverthumb',renderer:cover_image},

    {header: "CoverThumb", dataIndex: 'coverthumb'},

    //Combining two columns

    {header: "Title", dataIndex: 'title',renderer:title_tagline,editor:title_edit},

    {header: "Director", dataIndex: 'director',editor:director_edit},

    //Client-side sorting

    {header: "Released", dataIndex: 'released',sortable:true,

    renderer: Ext.util.Format.dateRenderer('m/d/Y'),editor:released_edit},

    {header: "Genre", dataIndex: 'genre',editor:genre_edit},    

    {header: "Price",dataIndex: 'price',id:'price'},

    //setup hidden column

    {header: "Tagline", dataIndex: 'tagline',hidden:true,editor:tagline_edit}

    ]

   });

   //需在gridPanel建立後才可以Load資料

   store.load({params:{start:0, limit:5}});

  });

 //

 --></script>

  </head>

  

  <body><br>

   <center>

    <h3><font color="red">Movie Database Grid</font></h3><br>

   </center>

   <table align="center" border="0">

    <tr>

     <td>

     <div id="example-grid"></div>

    <td>

   </tr>

  </table>

  </body>

</html>


2.JSON output頁面(outputJSON.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"  %>

<s:property value="jsonString" escape="false"/>


二、建立刪除資料DAO及Service及Struts2 Action:
0.建立bean (Movies.java):
package com.bean.test;



public class Movies {

 private int id;

 private String title;

 private String director;

 private String released;

 private String genre;

 private String tagline;

 private String coverthumb;

 private String price;

 private String active;

 

 public int getId() {

  return id;

 }

 public void setId(int id) {

  this.id = id;

 }

 public String getTitle() {

  return title;

 }

 public void setTitle(String title) {

  this.title = title;

 }

 public String getDirector() {

  return director;

 }

 public void setDirector(String director) {

  this.director = director;

 }

 public String getReleased() {

  return released;

 }

 public void setReleased(String released) {

  this.released = released;

 }

 public String getGenre() {

  return genre;

 }

 public void setGenre(String genre) {

  this.genre = genre;

 }

 public String getTagline() {

  return tagline;

 }

 public void setTagline(String tagline) {

  this.tagline = tagline;

 }

 public String getCoverthumb() {

  return coverthumb;

 }

 public void setCoverthumb(String coverthumb) {

  this.coverthumb = coverthumb;

 }

 public String getPrice() {

  return price;

 }

 public void setPrice(String price) {

  this.price = price;

 }

 public String getActive() {

  return active;

 }

 public void setActive(String active) {

  this.active = active;

 }

}


1.建立刪除資料DAO Interface(SysMgrDAO.java):
package com.dao.test;



import java.util.List;



public interface SysMgrDAO {

 public List findFunctionAll();

 public List findFunctionAll(final int start,final int limit);

 public int getFunctionTotalCount();

 public List findTitleAll();

 public List findTitleAll(final int start,final int limit);

 public int getTitleTotalCount();

 public List findMovieAll(final int start,final int limit);

 public int getMoviesTotalCount();

 public String deleteMovie(int[] id);

}


2.建立刪除資料DAO Implement(SysMgrDAOImpl.java):
package com.dao.impl.test;



import java.sql.SQLException;

import java.util.List;



import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.hibernate.Hibernate;

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.hibernate.transform.Transformers;

import org.springframework.orm.hibernate3.HibernateCallback;

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



import com.bean.test.Function;

import com.bean.test.Movies;

import com.bean.test.Title;

import com.dao.test.SysMgrDAO;



public class SysMgrDAOImpl extends HibernateDaoSupport implements SysMgrDAO {

 private static final Log log = LogFactory.getLog(SysMgrDAOImpl.class);



 public List findFunctionAll() {

  log.debug("finding tbl_function with native sql");

  Session session = this.getSession();

  try{

   String sql="select id as fnid,name as fnname,`desc` as fndesc from cmsdb.tbl_function";  

   List list =  session.createSQLQuery(sql)

        .addScalar("fnid")

        .addScalar("fnname")

        .addScalar("fndesc")

        .setResultTransformer(Transformers.aliasToBean(Function.class))

        .list();

   log.debug("find successful of tbl_function with native sql");

   return list;

  }catch(RuntimeException re){

   log.error("finded error of tbl_function with native sql",re);

   throw re;

  }finally{

   session.close();

  }  

 }



 public List findFunctionAll(final int start,final int limit) {

  log.debug("get paging of tbl_function with native sql");

  return this.getHibernateTemplate().executeFind(new HibernateCallback(){

   public Object doInHibernate(Session session) throws HibernateException, SQLException {

    Object obj = session.createSQLQuery("select id as fnid,name fnname,`desc` as fndesc from cmsdb.tbl_function")

      .addScalar("fnid")

      .addScalar("fnname")

      .addScalar("fndesc")

      .setResultTransformer(Transformers.aliasToBean(Function.class))

      .setFirstResult(start)

      .setMaxResults(limit)

      .list();

    log.debug("get paging of tbl_function with native sql successful");

    return obj;

   }

  }); 

 }



 public int getFunctionTotalCount() {

  log.debug("finding totalcount of tbl_function with native sql");

  Session session = this.getSession();

  try{

   String sql="select count(*) as count from cmsdb.tbl_function";  

   List list =  session.createSQLQuery(sql)

        .addScalar("count",Hibernate.INTEGER)

        .list();

   log.debug("find successful totalcount of tbl_function with native sql");

   return ((Integer)list.get(0)).intValue();

  }catch(RuntimeException re){

   log.error("finded error totalcount of tbl_function with native sql",re);

   throw re;

  }finally{

   session.close();

  }

 }



 public List findTitleAll() {

  log.debug("finding tbl_title with native sql");

  Session session = this.getSession();

  try{

   String sql="select id,name,`desc` from cmsdb.tbl_title";  

   List list =  session.createSQLQuery(sql)

        .setResultTransformer(Transformers.aliasToBean(Title.class))

        .list();

   log.debug("find successful of tbl_title with native sql");

   return list;

  }catch(RuntimeException re){

   log.error("finded error of tbl_title with native sql",re);

   throw re;

  }finally{

   session.close();

  }

 }



 public List findTitleAll(final int start, final int limit) {

  log.debug("get paging of tbl_title with native sql");

  return this.getHibernateTemplate().executeFind(new HibernateCallback(){

   public Object doInHibernate(Session session) throws HibernateException, SQLException {

    Object obj = session.createSQLQuery("select id as id,name as name,`desc` as `desc` from cmsdb.tbl_title")

      .addScalar("id")

      .addScalar("name")

      .addScalar("desc")

      .setResultTransformer(Transformers.aliasToBean(Title.class))

      .setFirstResult(start)

      .setMaxResults(limit)

      .list();

    log.debug("get paging of tbl_title with native sql successful");

    return obj;

   }

  }); 

 }



 public int getTitleTotalCount() {

  log.debug("finding totalcount of tbl_title with native sql");

  Session session = this.getSession();

  try{

   String sql="select count(*) as count from cmsdb.tbl_title";  

   List list =  session.createSQLQuery(sql)

        .addScalar("count",Hibernate.INTEGER)

        .list();

   log.debug("find successful totalcount of tbl_title with native sql");

   return ((Integer)list.get(0)).intValue();

  }catch(RuntimeException re){

   log.error("finded error totalcount of tbl_title with native sql",re);

   throw re;

  }finally{

   session.close();

  }

 }



 public List findMovieAll(final int start,final int limit) {

  log.debug("get paging of tbl_movies with native sql");

  return this.getHibernateTemplate().executeFind(new HibernateCallback(){

   public Object doInHibernate(Session session) throws HibernateException, SQLException {

    Object obj = session.createSQLQuery("select id,title,director,released,genre,tagline,coverthumb,price,active from cmsdb.tbl_movies")

      .addScalar("id")

      .addScalar("title")

      .addScalar("director")

      .addScalar("released",Hibernate.STRING)

      .addScalar("genre")

      .addScalar("tagline")

      .addScalar("coverthumb")

      .addScalar("price")

      .addScalar("active")

      .setResultTransformer(Transformers.aliasToBean(Movies.class))

      .setFirstResult(start)

      .setMaxResults(limit)

      .list();

    log.debug("get paging of tbl_movies with native sql successful");

    return obj;

   }

  });

 }



 public int getMoviesTotalCount() {

  log.debug("finding totalcount of tbl_movies with native sql");

  Session session = this.getSession();

  try{

   String sql="select count(*) as count from cmsdb.tbl_movies";  

   List list =  session.createSQLQuery(sql)

        .addScalar("count",Hibernate.INTEGER)

        .list();

   log.debug("find successful totalcount of tbl_movies with native sql");

   return ((Integer)list.get(0)).intValue();

  }catch(RuntimeException re){

   log.error("finded error totalcount of tbl_movies with native sql",re);

   throw re;

  }finally{

   session.close();

  }

 }



 public String deleteMovie(int[] id) {

  log.debug("deleting movies of tbl_movies with native sql");

  Session session = this.getSession();

  Transaction tx = session.beginTransaction();

  String sql;

  String flag="success";

  try{

   sql = "delete from cmsdb.tbl_movies where id=?";

   for(int i=0;i<id.length;i++){    

    session.createSQLQuery(sql).setParameter(0, Integer.valueOf(id[i])).executeUpdate();

    tx.commit();

   }

  }catch(RuntimeException re){

   flag="failure";

   tx.rollback();

   log.error("deleted error movies of tbl_movies with native sql",re);

   throw re;

  }finally{

   session.close();

  }  

  return flag;

 } 

}


3.建立刪除資料Service Interface(SysMgrService.java):
package com.service.test;



import java.util.List;



public interface SysMgrService {

 public List findFunctionAll();

 public List findFunctionAll(final int start,final int limit);

 public int getFunctionTotalCount();

 public List findTitleAll();

 public List findTitleAll(final int start,final int limit);

 public int getTitleTotalCount();

 public List findMovieAll(final int start,final int limit);

 public int getMoviesTotalCount();

 public String deleteMovie(int[] id);

}


4.建立刪除資料Service Implement(SysMgrDAO.java):
package com.service.impl.test;



import java.util.List;



import com.dao.test.SysMgrDAO;

import com.service.test.SysMgrService;



public class SysMgrServiceImpl implements SysMgrService {

 private SysMgrDAO sysMgrDAO;

 

 

 public List findFunctionAll() {

  return this.sysMgrDAO.findFunctionAll();

 }



 public List findFunctionAll(int start, int limit) {

  return this.sysMgrDAO.findFunctionAll(start, limit);

 }



 public List findTitleAll() {

  return this.sysMgrDAO.findTitleAll();

 }



 public List findTitleAll(int start, int limit) {

  return this.sysMgrDAO.findTitleAll(start, limit);

 }



 public int getFunctionTotalCount() {

  return this.sysMgrDAO.getFunctionTotalCount();

 }



 public int getTitleTotalCount() {

  return this.sysMgrDAO.getTitleTotalCount();

 }



 public SysMgrDAO getSysMgrDAO() {

  return sysMgrDAO;

 }



 public void setSysMgrDAO(SysMgrDAO sysMgrDAO) {

  this.sysMgrDAO = sysMgrDAO;

 }



 public List findMovieAll(int start, int limit) {

  return this.sysMgrDAO.findMovieAll(start, limit);

 }



 public int getMoviesTotalCount() {

  return this.sysMgrDAO.getMoviesTotalCount();

 }



 public String deleteMovie(int[] id) {

  return this.sysMgrDAO.deleteMovie(id);

 }

}



5.建立刪除資料Struts2 Action:
5.1.SysMgrAction.java
package com.action.test;



import java.util.List;



import net.sf.json.JSONArray;

import com.opensymphony.xwork2.ActionSupport;

import com.service.test.SysMgrService;





public class SysMgrAction extends ActionSupport {

 /**

  * 

  */

 private static final long serialVersionUID = 1L;

 private SysMgrService sysMgrService;

 private String jsonString;

 private int start;

 private int limit;

 private String function01;

 private String grade01;

 private int[] id;

 private String action;



 public String getFunction() throws Exception {

  //沒有分頁功能

  //List list = this.sysMgrService.findFunctionAll();

  

  //有分頁功能  

  String totals = String.valueOf(this.sysMgrService.getFunctionTotalCount());

  List list = this.sysMgrService.findFunctionAll(start, limit);

  JSONArray array = JSONArray.fromObject(list);

  this.jsonString = "{\"totals\":"+totals+",\"results\":"+array.toString()+"}";

  return "functoinJSON";

 }

 

 public String getFunctionAll() throws Exception {

  //沒有分頁功能

  List list = this.sysMgrService.findFunctionAll();

  String totals = String.valueOf(list.size());

  //有分頁功能  

  //String totals = String.valueOf(this.sysMgrService.getFunctionTotalCount());

  //List list = this.sysMgrService.findFunctionAll(start, limit);

  JSONArray array = JSONArray.fromObject(list);

  this.jsonString = "{\"totals\":"+totals+",\"results\":"+array.toString()+"}";

  return "functoinJSON";

 }

 

 public String getTitle() throws Exception {

  //沒有分頁功能

  //List list = this.sysMgrService.findTitleAll();

  

  //有分頁功能  

  String totals = String.valueOf(this.sysMgrService.getTitleTotalCount());

  List list = this.sysMgrService.findTitleAll(start, limit);

  JSONArray array = JSONArray.fromObject(list);

  this.jsonString = "{\"totals\":"+totals+",\"results\":"+array.toString()+"}";

  return "titleJSON";

 } 



 public String comboFormSubmit() throws Exception{

  this.jsonString = "{\"success\":\"true\",\"funcId\":\""+function01+"\",\"grade\":\""+grade01+"\"}";

  return "comboFormJSON";

 }

 

 public String getMovies() throws Exception { 

  //有分頁功能  

  String totals = String.valueOf(this.sysMgrService.getMoviesTotalCount());

  List list = this.sysMgrService.findMovieAll(start, limit);

  JSONArray array = JSONArray.fromObject(list);

  this.jsonString = "{\"totals\":"+totals+",\"results\":"+array.toString()+"}";

  return "outputJSON";

 }

 

 public String updateMovies() throws Exception { 

  if(action!=null && action.equals("delete")){

   if(this.sysMgrService.deleteMovie(id).equals("success")){

    this.jsonString = "{\"success\":\"true\"}";

   }else{

    this.jsonString = "{\"failure\":\"true\"}";

   }

  }

  return "outputJSON";

 }

 

 public SysMgrService getSysMgrService() {

  return sysMgrService;

 }





 public void setSysMgrService(SysMgrService sysMgrService) {

  this.sysMgrService = sysMgrService;

 } 



 public String getJsonString() {

  return jsonString;

 }



 public void setJsonString(String jsonString) {

  this.jsonString = jsonString;

 }



 public int getStart() {

  return start;

 }



 public void setStart(int start) {

  this.start = start;

 }



 public int getLimit() {

  return limit;

 }



 public void setLimit(int limit) {

  this.limit = limit;

 }



 public String getFunction01() {

  return function01;

 }



 public void setFunction01(String function01) {

  this.function01 = function01;

 }



 public String getGrade01() {

  return grade01;

 }



 public void setGrade01(String grade01) {

  this.grade01 = grade01;

 }



 public int[] getId() {

  return id;

 }



 public void setId(int[] id) {

  this.id = id;

 }



 public String getAction() {

  return action;

 }



 public void setAction(String action) {

  this.action = action;

 }

}


5.2.struts2 config(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>

 <constant name="struts.devMode" value="true"></constant> 

 <constant name="struts.configuration.xml.reload" value="true"></constant>

 <constant name="struts.i18n.reload" value="true"></constant>

 <constant name="struts.custom.i18n.resources" value="globalMessages"></constant>

 

 <package name="ExtStudy" extends="struts-default">

  <action name="SysMgrJson" class="SysMgrJsonAction">

   <result name="functoinJSON">JsonJSP/functionJSON.jsp</result>

   <result name="titleJSON">JsonJSP/titleJSON.jsp</result>

   <result name="comboFormJSON">JsonJSP/comboFormJSON.jsp</result>

   <result name="outputJSON">JsonJSP/outputJSON.jsp</result>

  </action>

 </package>

</struts>


5.3.spring config(applicationContext.xml):
<?xml version="1.0" encoding="UTF-8"?>

<beans

 xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">



 <!-- 直接使用dbcp當dataSource 

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

  <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>

  <property name="url" value="jdbc:mysql://localhost:3306/mytest"></property>

  <property name="username" value="manning"></property>

  <property name="password" value="action"></property>

  <property name="maxActive" value="50"></property>

  <property name="maxIdle" value="50"></property>

  <property name="maxWait" value="100"></property>

  <property name="defaultAutoCommit" value="true"></property>

 </bean>

  -->

 

 <!-- 使用jndi當dataSource  -->

 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

  <!-- 當resourceRef=false,則jndiName需加上java:comp/env字元,resourceRef其default value=false

  <property name="resourceRef">false</property>

  <property name="jndiName" value="java:comp/env/jdbc/MytestDB"></property>

   -->  

  <property name="resourceRef" value="true"></property>

  <property name="jndiName" value="jdbc/CMSDB"></property>

  <property name="proxyInterface" value="javax.sql.DataSource"></property>

 </bean>

 

 <!-- spring use jdni with weblogic config

 <bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">

  <property name="resourceRef" value="true"></property>

  <property name="jndiName" value="MySqlDataSource"></property>

  <property name="jndiEnvironment">

   <props>

    <prop key="java.naming.provider.url">t3://localhost:7001</prop>

   </props>

  </property>

 </bean>

 -->

 

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

  <property name="dataSource" ref="dataSource"></property>

  <property name="hibernateProperties">

   <props>

    <prop key="hibernate.show_sql">true</prop>

    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

   </props>

  </property>

  <property name="mappingResources">

   <list>



   </list>

  </property>

 </bean>

 

 <!-- DAO -->

 <bean id="SysMgrDAO" class="com.dao.impl.test.SysMgrDAOImpl">

  <property name="sessionFactory" ref="sessionFactory"></property>

 </bean>

 

 <!-- Service -->

 <bean id="SysMgrService" class="com.service.impl.test.SysMgrServiceImpl">

  <property name="sysMgrDAO" ref="SysMgrDAO"></property>

 </bean>

 

 <!-- Action -->

 <bean id="SysMgrJsonAction" class="com.action.test.SysMgrAction" scope="prototype">

  <property name="sysMgrService" ref="SysMgrService"></property>

 </bean>

</beans>


三、測試結果:
1.http://localhost:8080/ExtStudy/Basic/editGrid1.jsp

















幾個常見的資料庫分頁 SQL 語法


幾個常見的資料庫分頁 SQL 語法

我們在編寫MIS系統和Web應用程式等系統時,都會涉及到與資料庫的使用,
如果資料庫中資料量很大的話,一次取出所有的資料,會占用系統很大的資源,
因此我們常常採用,需要多少資料就只取出多少資料,即採用分頁的SQL語法,
根據自己使用過的內容,把常見資料庫Sql Server,Oracle和MySQL的分語法,
從資庫表中的第M筆資料開始取N筆資料的語法總結如下:
    
  SQL Server

從資料表中的第M筆資料開始取出N筆資料,利用Top關鍵字:注意如果Select語法中既有top,
又有order by,則是從排序好的結果集中選擇:
  SELECT *

  FROM ( SELECT Top N *

  FROM (SELECT Top (M + N - 1) * FROM 表格名稱 Order by 主鍵 desc) t1 ) t2

  Order by 主鍵 asc

例如從表格Sys_option(主鍵為sys_id)中從第10筆資料取出20筆資料,語法如下:
  SELECT *

  FROM ( SELECT TOP 20 *

  FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2

  Order by sys_id asc

  Oralce資料庫

從資料表中第M筆資料取出N筆資料
  SELECT *

  FROM (SELECT ROWNUM r,t1.* From 表格名稱 t1 where rownum < M + N) t2

  where t2.r >= M

例如從表格Sys_option(主鍵為sys_id)中從第10筆資料取出20筆資料,語法如下:
  SELECT *

  FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2

  Where t2.R >= 10

  MySQL資料庫

  My sql.資料庫最簡單,是利用mysql的LIMIT函數,LIMIT [offset,] rows從資料表中
第M筆資料取出N筆資料的語法為:

  SELECT * FROM 表格名稱 LIMIT M,N

例如從表格Sys_option(主鍵為sys_id)中從第10筆資料取出20筆資料,語法如下:
  select * from sys_option limit 1       

MySQL 常用 Script


Mysql login script:
C:\Users\Nelson Chen>mysql –u root
C:\Users\Nelson Chen>mysql -u manning -p
Enter password: ******

Mysql create user script:
mysql>create user 'manning'@'localhost' identified by 'action';

Mysql grant all privledges script:
mysql>grant all privileges on *.* to 'manning'@'localhost' with grant option;

Mysql show database:
mysql>show databases;

Mysql change database:
mysql>use manning;
mysql>use mysql;
mysql>use test;

Mysql show status:
mysql>show status;

MS SQL日期處理方法


--檢查是否為SQL SERVER合法日期格式
SELECT ISDATE('2004-03-01')
--1 (int)正確
SELECT ISDATE('2004-02-33')
--0 (int)錯誤
--取得現在時間GETDATE()
select GETDATE()
--2008-04-26 03:25:31.900
--取得現在UTC 時間 (國際標準時間或格林威治標準時間)GETUTCDATE()
select GETUTCDATE()
--2008-04-25 19:30:23.650
--取得年.月.日及其它時間單位值
select year(getdate())
select datepart(yyyy, getdate())
select datepart(yy, getdate())
--2008 yyyy(int)年
select month(getdate())
select datepart(mm, getdate())
select datepart(m, getdate())
--4 mm(int)月
select day(getdate())
select datepart(dd, getdate())
select datepart(d, getdate())
--26 dd(int)日
select datepart(qq, getdate())
--2 qq(int)第幾季
select datepart(dw, getdate())
--7 dw(int)星期幾
其它datepar的參數參考下表:
Datepart
Abbreviations
年 year
yy, yyyy
季 quarter
qq, q
月 month
mm, m
年的第幾天 dayofyear
dy, y
日 day
dd, d
年的第幾週 week
wk, ww
星期的第幾天 weekday
預設1=日 2=一....7=六
dw
時 hour
hh
分 minute
mi, n
秒 second
ss, s
毫秒 millisecond
ms
--取得指定日期部分的字串DATENAME()--使用參數同上表datepar參數
SELECT DATENAME(month, GETDATE())
--四月 今天是四月所以傳回=四月,系統地區若為英語系傳回April
SELECT DATENAME(dw, GETDATE())
--星期六
--取得星期幾的單一中文字(日,一,二,三,四,五,六)
SELECT Right(datename(weekday,getdate()),1)
--六 今天是星期六所以傳回=六,系統地區語言必須為中文地區
SELECT CASE datepart(dw, getdate())
WHEN 1 THEN '日' WHEN 2 THEN '一' WHEN 3 THEN '二' WHEN 4 THEN '三' WHEN 5 THEN '四' WHEN 6 THEN '五' WHEN 7 THEN '六' END
--六 今天是星期六所以傳回=六
--設定一星期的開始日為哪天--影響datepart,datename使用參數weekday,dw的回傳值
SET DATEFIRST 7 --設定星期天為一星期的第1天 (預設為7)
select @@DATEFIRST
--7 (int)
Value
First day of the week is
1
Monday
2
Tuesday
3
Wednesday
4
Thursday
5
Friday
6
Saturday
7 (default, U.S. English)
Sunday
--取得10天前或10天後日期(參數請看上面datepar參數表)
SELECT DATEADD(day, -10, '04/30/2008')
--2008-04-20 00:00:00.000
SELECT DATEADD(day, 10, '04/30/2008')
--2008-05-10 00:00:00.000
--計算兩時間差(參數請看上面datepar參數表)
SELECT DATEDIFF(day,GETDATE(),'04/30/2008')
--4 (int)
--轉換時間格式
不帶世紀數位 (yy)
帶世紀數位 (yyyy)
標準
輸入/輸出**
-
0 或 100 (*)
預設值
mon dd yyyy hh:miAM(或 PM)
1
101
美國
mm/dd/yyyy
2
102
ANSI
yy.mm.dd
3
103
英國/法國
dd/mm/yy
4
104
德國
dd.mm.yy
5
105
義大利
dd-mm-yy
6
106
-
dd mon yy
7
107
-
mon dd, yy
8
108
-
hh:mm:ss
-
9 或 109 (*)
預設值 + 毫秒
mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10
110
美國
mm-dd-yy
11
111
日本
yy/mm/dd
12
112
ISO
yymmdd
-
13 或 113 (*)
歐洲預設值 + 毫秒
dd mon yyyy hh:mm:ss:mmm(24h)
14
114
-
hh:mi:ss:mmm(24h)
-
20 或 120 (*)
ODBC 規範
yyyy-mm-dd hh:mm:ss[.fff]
-
21 或 121 (*)
ODBC 規範(帶毫秒)
yyyy-mm-dd hh:mm:ss[.fff]
-
126(***)
ISO8601
yyyy-mm-dd Thh:mm:ss:mmm(不含空格)
-
130*
科威特
dd mon yyyy hh:mi:ss:mmmAM
-
131*
科威特
dd/mm/yy hh:mi:ss:mmmAM
select convert(char, getdate(), 100)
--04 26 2008 2:04AM mon dd yyyy hh:mmAM(PM)
select convert(char, getdate(), 101)
--04/26/2008 mm/dd/yyyy select convert(char, getdate(), 102)
--2008.04.26 yyyy.mm.dd
select convert(char, getdate(), 103)
--26/04/2008 dd/mm/yyyyselect convert(char, getdate(), 104)
--26.04.2008 dd.mm.yyyy select convert(char, getdate(), 105)
--26-04-2008 dd-mm-yyyyselect convert(char, getdate(), 106)
--26 04 2008 dd mon yyyyselect convert(char, getdate(), 107)
--04 26, 2008 mon dd, yyyy select convert(char, getdate(), 108)
--02:04:53 hh:mm:ss select convert(char, getdate(), 109)
--04 26 2008 2:04:53:583AM mon dd yyyy hh:mm:ss:mmmAM(PM) select convert(char, getdate(), 110)
--04-26-2008 mm-dd-yyyy select convert(char, getdate(), 111)
--2008/04/26 yyyy/mm/ddselect convert(char, getdate(), 112)
--20080426 yyyymmdd
select convert(char(6), getdate(), 112)
--200804 yyyymm
select convert(char, getdate(), 113)
--26 04 2008 02:04:53:583 dd mon yyyy hh:mm:ss:mmm select convert(char, getdate(), 114)
--02:04:53:583 hh:mm:ss:mmm(24h) select convert(char, getdate(), 120)
--2008-04-26 02:04:53 yyyy-mm-dd hh:mm:ss(24h)
select convert(char(7), getdate(), 120)
--2008-04 yyyy-mmselect convert(char, getdate(), 121)
--2008-04-26 02:04:53.583 yyyy-mm-dd hh:mm:ss.mmm
資料類型
範圍
精確度
datetime
1753 年 1 月 1 日到 9999 年 12 月 31 日
3.33 毫秒
smalldatetime
1900 年 1 月 1 日到 2079 年 6 月 6 日
1 分鐘
--取得這個小時開始的時間 SELECT DATEADD(hh,DATEDIFF(hh,0,getdate()),0) --2008-04-26 06:00:00.000 (datetime)
--取得下個小時開始的時間 SELECT DATEADD(hh,1,DATEADD(hh,DATEDIFF(hh,0,getdate()),0)) --2008-04-26 07:00:00.000 (datetime)
--取得今天開始的時間(凌晨12點) SELECT DATEADD(dd,DATEDIFF(dd,0,getdate()),0) --2008-04-26 00:00:00.000 (datetime)
--取得本週的星期日,星期一(本週開始日為星期日) SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),-1) --2008-04-20 00:00:00.000 (datetime)
SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),0) --2008-04-21 00:00:00.000 (datetime)
--取得上週五,上週六 SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),-3) --2008-04-18 00:00:00.000 (datetime)
SELECT DATEADD(wk,DATEDIFF(wk,0,getdate()),-2) --2008-04-19 00:00:00.000 (datetime)
--取得本月的第一天 SELECT DATEADD(mm,DATEDIFF(mm,0,getdate()),0) --2008-04-01 00:00:00.000 (datetime)
--取得下個月的第一天 SELECT dateadd(mm,1,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) --2008-05-01 00:00:00.000 (datetime)
--取得本月的最後一天 SELECT dateadd(dd,-1,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)) --2008-04-30 00:00:00.000 (datetime)SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,getdate())+1,0)) --2008-04-30 23:59:59.997 (datetime)
--取得上個月的最後一天 SELECT dateadd(dd,-1,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) --2008-03-31 00:00:00.000 (datetime) SELECT dateadd(ms,-3,DATEADD(mm,DATEDIFF(mm,0,getdate()),0)) --2008-03-31 23:59:59.997 (datetime)
--取得本月天數 SELECT Day(dateadd(dd,-1,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))) --30 (int)
--取得本季的第一天 SELECT DATEADD(qq,DATEDIFF(qq,0,getdate()),0) --2008-04-01 00:00:00.000 (datetime)
--取得下一季的第一天 SELECT DATEADD(qq,DATEDIFF(qq,0,dateadd(mm,3,getdate())),0) --2008-07-01 00:00:00.000 (datetime)
--取得本季天數 SELECT DATEDIFF(dd,DATEADD(qq,DATEDIFF(qq,0,getdate()),0),DATEADD(qq,DATEDIFF(qq,0,dateadd(mm,3,getdate())),0)) --91 (int)
--取得今年的第一天 SELECT DATEADD(yy,DATEDIFF(yy,0,getdate()),0) --2008-01-01 00:00:00.000 (datetime)
--取得明年的第一天 SELECT DATEADD(yy,1,DATEADD(yy,DATEDIFF(yy,0,getdate()),0)) --2009-01-01 00:00:00.000 (datetime)
--取得去年的最後一天 SELECT dateadd(dd,-1,DATEADD(yy,DATEDIFF(yy,0,getdate()),0)) --2007-12-31 00:00:00.000 (datetime) SELECT dateadd(ms,-2,DATEADD(yy,DATEDIFF(yy,0,getdate()),0)) --2007-12-31 23:59:59.997 (datetime)

轉摘至:http://openmyhand.com/cms/index.php?option=com_content&task=view&id=62&Itemid=39