升級(jí)版JDBC工具類
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 用戶數(shù)據(jù)庫(kù)訪問(wèn)的類
*@作者Administrator
*@createTime 2011-12-5 上午11:55:18
*@version 1.0
*/
public class DButil1 {
private Connection conn;
private Statement st;
private PreparedStatement pps;
private ResultSet rs;
public String url="jdbc:oracle:thin:@localhost:1521:orcl";
private String user="hyl";
private String password="hyl";
//加載驅(qū)動(dòng)、放在靜態(tài)代碼塊中,保證驅(qū)動(dòng)在整個(gè)項(xiàng)目中只加載一次,提高效率
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 獲取連接的方法
* @return Connection 一個(gè)有效的數(shù)據(jù)庫(kù)連接
*/
public Connection getConnection()
{
try {
//注意鏈接時(shí),要換成自己的數(shù)據(jù)庫(kù)名,數(shù)據(jù)庫(kù)用戶名及密碼
Connection con=DriverManager.getConnection(url,user,password);
return con;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
/**
* 用于執(zhí)行更新的方法,包括(insert delete update)操作
* @param sql String 類型的SQL語(yǔ)句
* @return Integer 表示受影響的行數(shù)
*/
public int update(String sql)
{
//定義變量用來(lái)判斷更新操作是否成功,如果返回-1說(shuō)明沒(méi)有影響到更新操作的數(shù)據(jù)庫(kù)記錄條數(shù),即更新操作失敗
int row=-1;
try {
//如果數(shù)據(jù)庫(kù)鏈接被關(guān)閉了,就要既得一個(gè)新的鏈接
if(conn==null||conn.isClosed()){
conn=getConnection();
}
//使用Connection對(duì)象conn的createStatement()創(chuàng)建Statement(數(shù)據(jù)庫(kù)語(yǔ)句對(duì)象)st
st=conn.createStatement();
//執(zhí)行更新操作,返回影響的記錄條數(shù)row
row=st.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
finally{
close();
}
return row;
}
/**
* 基于PreparedStatement的修改方法 PreparedStatement:表示預(yù)編譯的 SQL 語(yǔ)句的對(duì)象
* @param sql String 類型的SQL語(yǔ)句(insert delete update)
* @param obj 存放動(dòng)態(tài)參數(shù)的數(shù)組
* @return Integer 表示受影響的行數(shù)
*/
public int update(String sql,Object ...obj)
{
try {
//獲取鏈接
if(conn==null||conn.isClosed()){
conn=getConnection();
}
//創(chuàng)建預(yù)編譯的 SQL 語(yǔ)句對(duì)象
pps=conn.prepareStatement(sql);
//定義變量length代表數(shù)組長(zhǎng)度,也就是預(yù)處理的sql語(yǔ)句中的參數(shù)個(gè)數(shù)
int length=0;
//ParameterMetaData:用于獲取關(guān)于 PreparedStatement 對(duì)象中每個(gè)參數(shù)的類型和屬性信息的對(duì)象
ParameterMetaData pmd=pps.getParameterMetaData();
length=pmd.getParameterCount();
//循環(huán)將sql語(yǔ)句中的?設(shè)置為obj數(shù)組中對(duì)應(yīng)的值,注意從1開始,所以i要加1
for(int i=0;i<length;i++)
{
pps.setObject(i+1, obj[i]);
}
//執(zhí)行更新操作
return pps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
close();
}
return -1;
}
/**
* 獲取一條記錄的方法,要依賴于下面的queryToList方法,注意泛型的使用
* @param sql
* @return Map<String,Object>
*/
public Map<String,Object> getOneRow(String sql)
{
//執(zhí)行下面的queryToList方法
List<Map<String,Object>> list=queryToList(sql);
//三目運(yùn)算,查詢結(jié)果list不為空返回list中第一個(gè)對(duì)象,否則返回null
return list.size()>0?list.get(0):null;
}
/**
* 返回查詢結(jié)果列表,形如:[{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}, {TEST_NAME=bbb, TEST_NO=3, TEST_PWD=bbb}...]
* @param sql
* @return List<Map<String,Object>>
*/
public List<Map<String,Object>> queryToList(String sql)
{
//創(chuàng)建集合列表用以保存所有查詢到的記錄
List<Map<String, Object>> list=new LinkedList<Map<String, Object>>();
try {
if(conn==null||conn.isClosed()){
conn=getConnection();
}
st=conn.createStatement();
rs=st.executeQuery(sql);
//ResultSetMetaData 是結(jié)果集元數(shù)據(jù),可獲取關(guān)于 ResultSet 對(duì)象中列的類型和屬性信息的對(duì)象 例如:結(jié)果集中共包括多少列,每列的名稱和類型等信息
ResultSetMetaData rsmd=rs.getMetaData();
//獲取結(jié)果集中的列數(shù)
int columncount=rsmd.getColumnCount();
//while條件成立表明結(jié)果集中存在數(shù)據(jù)
while(rs.next())
{
//創(chuàng)建一個(gè)HashMap用于存儲(chǔ)一條數(shù)據(jù)
HashMap<String, Object> onerow=new HashMap<String, Object>();
//循環(huán)獲取結(jié)果集中的列名及列名所對(duì)應(yīng)的值,每次循環(huán)都得到一個(gè)對(duì)象,形如:{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}
for(int i=0;i<columncount;i++)
{
//獲取指定列的名稱,注意orcle中列名的大小寫
String columnName=rsmd.getColumnName(i+1);
onerow.put(columnName, rs.getObject(i+1));
}
//將獲取到的對(duì)象onewrow={TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}放到集合列表中
list.add(onerow);
}
}catch (SQLException e) {
e.printStackTrace();
}
finally{
close();
}
return list;
}
/**
* 返回查詢結(jié)果列表,使用的是預(yù)編繹SQL 語(yǔ)句對(duì)象PreparedStatement
* 形如:[{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}, {TEST_NAME=bbb, TEST_NO=3, TEST_PWD=bbb}]
* @param sql
* @param paramValues
* @return List<Map<String,Object>>
*/
public List<Map<String,Object>> queryWithParam(String sql,Object ...paramValues){
//創(chuàng)建集合列表用以保存所有查詢到的記錄
List<Map<String, Object>> list=new LinkedList<Map<String, Object>>();
try {
if(conn==null||conn.isClosed()){
conn=getConnection();
}
pps = conn.prepareStatement(sql);
for (int i = 0; i < paramValues.length; i++) {
pps.setObject(i + 1, paramValues[i]);
}
rs = pps.executeQuery();
//ResultSetMetaData 是結(jié)果集元數(shù)據(jù),可獲取關(guān)于 ResultSet 對(duì)象中列的類型和屬性信息的對(duì)象 例如:結(jié)果集中共包括多少列,每列的名稱和類型等信息
ResultSetMetaData rsmd=rs.getMetaData();
//獲取結(jié)果集中的列數(shù)
int columncount=rsmd.getColumnCount();
//while條件成立表明結(jié)果集中存在數(shù)據(jù)
while (rs.next()) {
//創(chuàng)建一個(gè)HashMap用于存儲(chǔ)一條數(shù)據(jù)
HashMap<String, Object> onerow=new HashMap<String, Object>();
//循環(huán)獲取結(jié)果集中的列名及列名所對(duì)應(yīng)的值,每次循環(huán)都得到一個(gè)對(duì)象,形如:{TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}
for(int i=0;i<columncount;i++)
{
//獲取指定列的名稱,注意orcle中列名的大小寫
String columnName=rsmd.getColumnName(i+1);
onerow.put(columnName, rs.getObject(i+1));
}
//將獲取到的對(duì)象onewrow={TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}放到集合列表中
list.add(onerow);
}
}catch (SQLException e) {
e.printStackTrace();
}
finally{
close();
}
return list;
}
/**
* 實(shí)現(xiàn)oracle分頁(yè)功能
* @param sql
* @param pagesize
* @param pagenow
* @return PageBean
*/
public PageBean getPage(String sql,int pagesize,int pagenow)
{
PageBean pb=new PageBean();
int end=pagenow*pagesize;
int start=end-pagesize+1;
String exesql="select a.* from (select t.*,rownum as rowindex from ("+sql+") t where rownum<="+end+" ) a where a.rowindex>="+start;
String countsql="select count(*) as rowcount from ("+sql+")";
pb.setResult(queryToList(exesql));
pb.setPagenow(pagenow);
pb.setPagesize(pagesize);
Map<String,Object> map=this.getOneRow(countsql);
int rows=Integer.parseInt(map.get("ROWCOUNT").toString());
pb.setRows(rows);
int pages=rows%pagesize==0?rows/pagesize:rows/pagesize+1;
pb.setPages(pages);
pb.setSql(sql);
return pb;
}
/**
* 關(guān)閉數(shù)據(jù)庫(kù)各種資源Connection Statement PreparedStatement ResultSet的方法
*/
private void close()
{
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null)
{
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pps!=null){
try {
pps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
try {
if(conn!=null&&!conn.isClosed())
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
posted on 2012-05-31 22:07 何云隆 閱讀(2914) 評(píng)論(10) 編輯 收藏 所屬分類: SQL Server 、MySQL 、java 、Oracle 、Jsp 、Struts1