hyljava

          升級版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;


          /**
           * 用戶數據庫訪問的類
           *@作者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";
           
           //加載驅動、放在靜態代碼塊中,保證驅動在整個項目中只加載一次,提高效率
           static{
            try {
             Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException e) {
             e.printStackTrace();
            }
           }
           
           /**
            * 獲取連接的方法
            * @return Connection 一個有效的數據庫連接
            */
           public Connection getConnection()
           {
            try {
             //注意鏈接時,要換成自己的數據庫名,數據庫用戶名及密碼
             Connection con=DriverManager.getConnection(url,user,password);
             return con;
            } catch (SQLException e) {
             e.printStackTrace();
            }
            return null;
           }

           /**
            * 用于執行更新的方法,包括(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
            * @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;
           }
           /**
            * 關閉數據庫各種資源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) 評論(10)  編輯  收藏 所屬分類: SQL ServerMySQLjavaOracleJspStruts1

          評論

          # re: 升級版JDBC工具類 2012-09-22 00:06 軍軍

          大哥啊, 能否 把 你的升級版 JDBC工具類中的 PageBean 類給我發一下。

          謝謝了先,小弟參考一下。郵件 發我也可以 。 181744926@qq.com



          拜托了, 萬分感謝,跪求代碼。  回復  更多評論   

          # re: 升級版JDBC工具類 2012-09-23 10:49 何云隆

          @軍軍
          已經發到你的郵箱了  回復  更多評論   

          # re: 升級版JDBC工具類 2012-12-10 15:25 杜萬博

          也發我一份好不好,感覺蠻好用的 378120075@qq.com  回復  更多評論   

          # re: 升級版JDBC工具類 2012-12-10 17:33 何云隆

          @杜萬博
          已經發到你的郵箱  回復  更多評論   

          # re: 升級版JDBC工具類 2013-04-10 23:35 懵懂

          有調用存儲過程的嗎 給我份363374160@qq.com  回復  更多評論   

          # re: 升級版JDBC工具類 2013-04-13 12:22 何云隆

          @懵懂
          JAVA執行存儲過程

          以SQLServer為例
          import java.sql.CallableStatement;
          import java.sql.Connection;
          import java.sql.DriverManager;

          public class TestCall {
          public static void main(String[] args) {
          try{
          Connection conn=null;
          CallableStatement cs=null;
          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
          String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=studentdb";
          conn=DriverManager.getConnection(url,"sa","sqlserver");
          String sql="{call s_insert(?,?)}";
          cs=conn.prepareCall(sql);
          cs.setString(1,"張三");
          cs.setInt(2, 12);
          int num=-1;
          num=cs.executeUpdate();
          System.out.println("num:"+num);
          }catch (Exception e) {
          e.printStackTrace();
          }
          }
          }
            回復  更多評論   

          # re: 升級版JDBC工具類 2013-05-16 22:21 蒙哥大汗

          我也要一份 升級版 JDBC工具類 PageBean 類給我發一下 381460710@qq.com  回復  更多評論   

          # re: 升級版JDBC工具類 2013-09-02 11:20 志成中國

          要給我一份吧,麻煩了。jiadp2012@163.com  回復  更多評論   

          # re: 升級版JDBC工具類 2014-05-27 10:33 mao

          大哥,能把那個PageBean也發我一份嗎,感謝!1361730313@qq.com  回復  更多評論   

          # re: 升級版JDBC工具類 2014-07-16 13:20 天雨

          全部代碼 給我一份 謝謝.. 6673258@qq.com  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大邑县| 砀山县| 五家渠市| 安图县| 科技| 皮山县| 莒南县| 大丰市| 怀集县| 东丽区| 甘洛县| 亚东县| 乌拉特前旗| 宁蒗| 衡阳市| 芜湖市| 高青县| 汝城县| 仙桃市| 汕头市| 南充市| 五华县| 伊川县| 吉安县| 沁源县| 白山市| 宁城县| 富平县| 高青县| 高邑县| 行唐县| 元谋县| 广德县| 西青区| 治县。| 秦安县| 浙江省| 枣阳市| 西乌| 辉南县| 青阳县|