posts - 325,  comments - 25,  trackbacks - 0
          package com.shxt.util;


          import java.sql.Connection;
          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;
          import java.util.Properties;

          import javax.sql.DataSource;

          import org.apache.commons.dbcp.BasicDataSource;


          /**
           * 用戶數(shù)據(jù)庫訪問的類
           *@作者Administrator
           *@createTime 2011-12-5 上午11:55:18
           *@version 1.0
           */
          public class DButil {

              private Connection conn;
              private Statement st;
              private PreparedStatement pps;
              private ResultSet rs;
              private DataSource ds;
              
              /**
               * 獲取連接的方法
               * @return Connection 一個有效的數(shù)據(jù)庫連接
               */
              
              public Connection getConnection()    {
                  try {
                      ds = setupDataSource("jdbc.properties");
                      Connection con = ds.getConnection();
                      return con;
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
                  return null;
              }
              
              public static DataSource setupDataSource(String configFile) {
                  BasicDataSource ds = new BasicDataSource();
                  try {
                      Properties prop = new Properties();
                      prop.load(DButil.class.getResourceAsStream(configFile));
                      ds.setDriverClassName(prop.getProperty("driverClassName"));
                      ds.setUrl(prop.getProperty("url"));
                      ds.setUsername(prop.getProperty("username"));
                      ds.setPassword(prop.getProperty("password"));
                      ds.setMaxActive(Integer.parseInt(prop.getProperty("maxActive")));
                      ds.setMaxIdle(10);
                     // ds.setMaxActive(maxActive);
                  } catch (Exception e) {
                      e.printStackTrace();
                      return null;
                  }

                  return ds;
              }
              

              /**
               * 用于執(zhí)行更新的方法,包括(insert delete update)操作
               * @param sql String 類型的SQL語句
               * @return Integer 表示受影響的行數(shù)
               */
              public int update(String sql)
              {
                  //定義變量用來判斷更新操作是否成功,如果返回-1說明沒有影響到更新操作的數(shù)據(jù)庫記錄條數(shù),即更新操作失敗
                  int row=-1;
                  try {
                      //如果數(shù)據(jù)庫鏈接被關(guān)閉了,就要既得一個新的鏈接
                      if(conn==null||conn.isClosed()){
                           conn=getConnection();
                      }
                      //使用Connection對象conn的createStatement()創(chuàng)建Statement(數(shù)據(jù)庫語句對象)st
                      st=conn.createStatement();
                      //執(zhí)行更新操作,返回影響的記錄條數(shù)row
                      row=st.executeUpdate(sql);
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
                  finally{
                      close();
                  }
                  return row;
              }
              
              /**
               * 基于PreparedStatement的修改方法 PreparedStatement:表示預(yù)編譯的 SQL 語句的對象
               * @param sql  String 類型的SQL語句(insert delete update)
               * @param obj 存放動態(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 語句對象
                      pps=conn.prepareStatement(sql);
                      //定義變量length代表數(shù)組長度,也就是預(yù)處理的sql語句中的參數(shù)個數(shù)
                      int length=0;
                      //ParameterMetaData:用于獲取關(guān)于 PreparedStatement 對象中每個參數(shù)的類型和屬性信息的對象
                      ParameterMetaData pmd=pps.getParameterMetaData();
                      length=pmd.getParameterCount();
                      //循環(huán)將sql語句中的?設(shè)置為obj數(shù)組中對應(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);
                  //三目運算,查詢結(jié)果list不為空返回list中第一個對象,否則返回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 對象中列的類型和屬性信息的對象 例如:結(jié)果集中共包括多少列,每列的名稱和類型等信息
                      ResultSetMetaData rsmd=rs.getMetaData();
                      //獲取結(jié)果集中的列數(shù)
                      int columncount=rsmd.getColumnCount();
                      //while條件成立表明結(jié)果集中存在數(shù)據(jù)
                      while(rs.next())
                      {
                          //創(chuàng)建一個HashMap用于存儲一條數(shù)據(jù)
                          HashMap<String, Object> onerow=new HashMap<String, Object>();
                          //循環(huán)獲取結(jié)果集中的列名及列名所對應(yīng)的值,每次循環(huán)都得到一個對象,形如:{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));
                          }
                          //將獲取到的對象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 語句對象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 對象中列的類型和屬性信息的對象 例如:結(jié)果集中共包括多少列,每列的名稱和類型等信息
                      ResultSetMetaData rsmd=rs.getMetaData();
                      //獲取結(jié)果集中的列數(shù)
                      int columncount=rsmd.getColumnCount();
                      //while條件成立表明結(jié)果集中存在數(shù)據(jù)
                      while (rs.next()) {
                          //創(chuàng)建一個HashMap用于存儲一條數(shù)據(jù)
                          HashMap<String, Object> onerow=new HashMap<String, Object>();
                          //循環(huán)獲取結(jié)果集中的列名及列名所對應(yīng)的值,每次循環(huán)都得到一個對象,形如:{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));
                          }
                          //將獲取到的對象onewrow={TEST_NAME=aaa, TEST_NO=2, TEST_PWD=aaa}放到集合列表中
                          list.add(onerow);
                      }
                  }catch (SQLException e) {
                      e.printStackTrace();
                  }
                  finally{
                      close();
                  }
                  return list;
              }
              
              
              
              /**
               * 實現(xiàn)oracle分頁功能
               * @param sql 要查詢的sql語句
               * @param pagesize 每頁顯示的記錄條數(shù)
               * @param pagenow    當前頁數(shù)
               * @return PageBean
               */
              public PageBean getPage(String sql,int pagesize,int pagenow)
              {
                  PageBean pb=new PageBean();
                  int end=pagenow*pagesize;//根據(jù)當前頁數(shù)及每頁顯示的條數(shù)計算出要查詢結(jié)果的終止數(shù)
                  int start=end-pagesize+1;//依據(jù)終止數(shù)和每頁顯示條數(shù)計算出開始數(shù)
                  /*拼出oracle分頁sql語句*/
                  String exesql="select a.* from (select t.*,rownum as rowindex from ("+sql+") t where rownum<="+end+" ) a where a.rowindex>="+start;
                  /*拼出查詢總共有多少條的sql語句*/
                  String countsql="select count(*) as rowcount from ("+sql+")";
                  /*執(zhí)行分頁sql語句,將所查詢的結(jié)果放到PageBean的result列表屬性中*/
                  pb.setResult(queryToList(exesql));
                  /*設(shè)置當前頁成員變量*/
                  pb.setPagenow(pagenow);
                  /*設(shè)置每頁條數(shù)成員變量*/
                  pb.setPagesize(pagesize);
                  /*執(zhí)行countsql語句,得出一共有多少條記錄*/
                  Map<String,Object> map=this.getOneRow(countsql);
                  int rows=Integer.parseInt(map.get("ROWCOUNT").toString());
                  /*設(shè)置總共條數(shù)成員變量*/
                  pb.setRows(rows);
                  /*計算總頁數(shù)*/
                  int pages=rows%pagesize==0?rows/pagesize:rows/pagesize+1;
                  pb.setPages(pages);
                  /*設(shè)置查詢sql成員變量*/
                  pb.setSql(sql);
                  return pb;
              }
              /**
               * 關(guān)閉數(shù)據(jù)庫各種資源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 2015-03-24 11:06 長春語林科技 閱讀(163) 評論(0)  編輯  收藏 所屬分類: utiljava
          <2015年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

           

          長春語林科技歡迎您!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 天柱县| 环江| 六安市| 汝阳县| 德钦县| 阿拉善盟| 新邵县| 成都市| 吴川市| 江安县| 绩溪县| 屏东市| 普定县| 湘阴县| 克山县| 湛江市| 延吉市| 武清区| 滨州市| 墨竹工卡县| 始兴县| 灵台县| 漾濞| 繁峙县| 鄂托克旗| 竹溪县| 三穗县| 且末县| 绩溪县| 郎溪县| 滨州市| 枝江市| 荥阳市| 福建省| 宁河县| 得荣县| 凤凰县| 镶黄旗| 吉木萨尔县| 孟连| 阳信县|