Author : Spring
Date :09-03-09 22:44
我們在做項目的時候可以用一個查詢類來解決一每個查詢功能的反復的代碼,下面的這個查詢類只要你寫一個類來繼承它實現其中的ininSql()方法就行,在這上方法中寫上你在執行的sql語句
package com.spring.dao.interfaces;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/*
* author:spring
* DateTime:09.02.24 10:21
*/
public abstract class BaseQuery {
/*
* 1/基本查詢用到的屬性
*/
private int count;//總頁數
protected String onPage = "1";//當前頁
protected int pageSize = 5;//每頁顯示條數
protected Connection conn;//連接對象
protected PreparedStatement ps;//ps
protected ResultSet rs;//rs
protected Map dto;//傳來的數據、條件的判斷
protected StringBuilder sql;//sql語句
protected List pars;//設置ps中的參數列表
protected int fetchSize;//總條數
protected Collection colls;
/*
* 2/構造方法(要一個Connection對象,一個Map dto對象)
*/
public BaseQuery(Connection conn,Map dto){
this.conn = conn;
this.dto = dto;
String page = (String)dto.get("onPage");
if(page != null && !page.equals("")){
this.onPage = page;
}
this.initSql();
}
/*
* 3/初始sql語句
*/
public abstract void initSql();
/*
* 4/編譯sql語句并招行
*/
public void preparedStatement() throws SQLException{
//編譯
ps = conn.prepareStatement(sql.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
//設置sql語句的參數
if(this.pars != null){
int size = this.pars.size();
if(size>0){
for(int i=0;i<size;i++){
ps.setObject(i+1, this.pars.get(i));
}
}
}
//執行
this.rs = this.ps.executeQuery();
}
/*
* 5/執行返回結果集
*/
public List queryAll() throws SQLException{
//這個方法你可以寫上你的分頁等一些操作
ArrayList arRS = null;
this.preparedStatement();//1.先調用編譯sql的方法
ResultSetMetaData rsm = null;
try{
//6.定義返回值
arRS = new ArrayList();
rsm = rs.getMetaData();
int size=rsm.getColumnCount();
Map row = null;
while(rs.next())
{
row = new HashMap();
for (int j = 1; j <=size; j++)
{
row.put(rsm.getColumnLabel(j).toLowerCase(), rs.getString(j));
}
arRS.add(row);
row=null;
rs.next();
}
return arRS;
}finally{
close(rs);
close(ps);
if(rsm != null){
rsm = null;
}
}
}
/*
* 關閉ps方法
*/
private void close(PreparedStatement ps){
if(ps != null){
try{
ps.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
private void close(ResultSet rs){
if(rs != null){
try{
rs.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
/*
* .清空Collection實現類的方法
*/
private void clear(Collection c){
if(c != null){
c.clear();
}
}
}
下面來用一個類繼承這個抽象類看一看
package com.spring.dao.daoimpl;
import com.spring.system.DBUtils;
import com.spring.system.Tools;
public class UsersBQDAOImpl extends BaseQuery {
public UsersBQDAOImpl(Connection conn, Map dto) {
super(conn, dto);
}
/*
* 初始化查詢語句
* @see com.spring.dao.interfaces.BaseQuery#initSql()
*/
@Override
public void initSql() {
//1.初始化要執行的sql語句
this.pars = new ArrayList();
this.sql = new StringBuilder()
.append("SELECT U_ID,U_NAME,U_EMAIL,U_RATING,U_STATE,B_CODEVALUE FROM V_USERS");
}
}
//這個類只要繼承BaseQuery.java重寫initSql();方法就行,在這個方法中寫上要執行的查詢的sql語句;
這樣就可在執行你的業務操作了如下面我就在Action中調用一下:
BaseQuery bq = new FoodBQDAOImpl(conn, dto);
List rows =bq.queryAll();
這樣就實現了一個查詢的抽象類,這樣以后就可不用寫那么多的查詢代碼了,只要有查詢操作的話就可實現這個類就行了
這里我只想讓大家知道這個抽象類的用法,只要繼承它就重寫initSql();方法就可以實現查詢功能.
所以這里的分頁你們可以自己寫一個,只要在紅字部分寫就行了。
這里的我還沒有用分頁因為太多了下載這個只要把紅字那個用調用查詢類中的方法就可了,因為這個類也是別人寫的