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;


          /**
           * 用戶數據庫訪問的類
           *@作者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 一個有效的數據庫連接
               */
              
              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;
              }
              

              /**
               * 用于執行更新的方法,包括(insert delete update)操作
               * @param sql String 類型的SQL語句
               * @return Integer 表示受影響的行數
               */
              public int update(String sql)
              {
                  //定義變量用來判斷更新操作是否成功,如果返回-1說明沒有影響到更新操作的數據庫記錄條數,即更新操作失敗
                  int row=-1;
                  try {
                      //如果數據庫鏈接被關閉了,就要既得一個新的鏈接
                      if(conn==null||conn.isClosed()){
                           conn=getConnection();
                      }
                      //使用Connection對象conn的createStatement()創建Statement(數據庫語句對象)st
                      st=conn.createStatement();
                      //執行更新操作,返回影響的記錄條數row
                      row=st.executeUpdate(sql);
                  } catch (SQLException e) {
                      e.printStackTrace();
                  }
                  finally{
                      close();
                  }
                  return row;
              }
              
              /**
               * 基于PreparedStatement的修改方法 PreparedStatement:表示預編譯的 SQL 語句的對象
               * @param sql  String 類型的SQL語句(insert delete update)
               * @param obj 存放動態參數的數組
               * @return Integer 表示受影響的行數
               */
              public int update(String sql,Object ...obj)
              {
                  try {
                      //獲取鏈接
                      if(conn==null||conn.isClosed()){
                           conn=getConnection();
                      }
                      //創建預編譯的 SQL 語句對象
                      pps=conn.prepareStatement(sql);
                      //定義變量length代表數組長度,也就是預處理的sql語句中的參數個數
                      int length=0;
                      //ParameterMetaData:用于獲取關于 PreparedStatement 對象中每個參數的類型和屬性信息的對象
                      ParameterMetaData pmd=pps.getParameterMetaData();
                      length=pmd.getParameterCount();
                      //循環將sql語句中的?設置為obj數組中對應的值,注意從1開始,所以i要加1
                      for(int i=0;i<length;i++)
                      {
                          pps.setObject(i+1, obj[i]);
                      }
                      //執行更新操作
                      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)
              {
                  //執行下面的queryToList方法
                  List<Map<String,Object>> list=queryToList(sql);
                  //三目運算,查詢結果list不為空返回list中第一個對象,否則返回null
                  return list.size()>0?list.get(0):null;
              }
              
              /**
               * 返回查詢結果列表,形如:[{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)
              {
                  //創建集合列表用以保存所有查詢到的記錄
                  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 是結果集元數據,可獲取關于 ResultSet 對象中列的類型和屬性信息的對象 例如:結果集中共包括多少列,每列的名稱和類型等信息
                      ResultSetMetaData rsmd=rs.getMetaData();
                      //獲取結果集中的列數
                      int columncount=rsmd.getColumnCount();
                      //while條件成立表明結果集中存在數據
                      while(rs.next())
                      {
                          //創建一個HashMap用于存儲一條數據
                          HashMap<String, Object> onerow=new HashMap<String, Object>();
                          //循環獲取結果集中的列名及列名所對應的值,每次循環都得到一個對象,形如:{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;
              }
              /**
               * 返回查詢結果列表,使用的是預編繹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){
                  //創建集合列表用以保存所有查詢到的記錄
                  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 是結果集元數據,可獲取關于 ResultSet 對象中列的類型和屬性信息的對象 例如:結果集中共包括多少列,每列的名稱和類型等信息
                      ResultSetMetaData rsmd=rs.getMetaData();
                      //獲取結果集中的列數
                      int columncount=rsmd.getColumnCount();
                      //while條件成立表明結果集中存在數據
                      while (rs.next()) {
                          //創建一個HashMap用于存儲一條數據
                          HashMap<String, Object> onerow=new HashMap<String, Object>();
                          //循環獲取結果集中的列名及列名所對應的值,每次循環都得到一個對象,形如:{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;
              }
              
              
              
              /**
               * 實現oracle分頁功能
               * @param sql 要查詢的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;//依據終止數和每頁顯示條數計算出開始數
                  /*拼出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+")";
                  /*執行分頁sql語句,將所查詢的結果放到PageBean的result列表屬性中*/
                  pb.setResult(queryToList(exesql));
                  /*設置當前頁成員變量*/
                  pb.setPagenow(pagenow);
                  /*設置每頁條數成員變量*/
                  pb.setPagesize(pagesize);
                  /*執行countsql語句,得出一共有多少條記錄*/
                  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);
                  /*設置查詢sql成員變量*/
                  pb.setSql(sql);
                  return pb;
              }
              /**
               * 關閉數據庫各種資源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 長春語林科技 閱讀(166) 評論(0)  編輯  收藏 所屬分類: utiljava
          <2015年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

           

          長春語林科技歡迎您!

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 长宁区| 威宁| 中江县| 石狮市| 涿州市| 和顺县| 林西县| 开封市| 金沙县| 永丰县| 汉寿县| 泸水县| 盐山县| 青田县| 长沙市| 江永县| 汉寿县| 南丰县| 武陟县| 洞头县| 海淀区| 昌宁县| 和平县| 肇东市| 宜宾市| 平阳县| 米林县| 扬州市| 岳阳市| 灵武市| 府谷县| 平阳县| 沁阳市| 天峨县| 彩票| 寻甸| 通许县| 绥宁县| 汕尾市| 九龙坡区| 武威市|