hyljava

          升級(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 ServerMySQLjavaOracleJspStruts1

          評(píng)論

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

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

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



          拜托了, 萬(wàn)分感謝,跪求代碼。  回復(fù)  更多評(píng)論   

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

          @軍軍
          已經(jīng)發(fā)到你的郵箱了  回復(fù)  更多評(píng)論   

          # re: 升級(jí)版JDBC工具類 2012-12-10 15:25 杜萬(wàn)博

          也發(fā)我一份好不好,感覺(jué)蠻好用的 378120075@qq.com  回復(fù)  更多評(píng)論   

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

          @杜萬(wàn)博
          已經(jīng)發(fā)到你的郵箱  回復(fù)  更多評(píng)論   

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

          有調(diào)用存儲(chǔ)過(guò)程的嗎 給我份363374160@qq.com  回復(fù)  更多評(píng)論   

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

          @懵懂
          JAVA執(zhí)行存儲(chǔ)過(guò)程

          以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();
          }
          }
          }
            回復(fù)  更多評(píng)論   

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

          我也要一份 升級(jí)版 JDBC工具類 PageBean 類給我發(fā)一下 381460710@qq.com  回復(fù)  更多評(píng)論   

          # re: 升級(jí)版JDBC工具類 2013-09-02 11:20 志成中國(guó)

          要給我一份吧,麻煩了。jiadp2012@163.com  回復(fù)  更多評(píng)論   

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

          大哥,能把那個(gè)PageBean也發(fā)我一份嗎,感謝!1361730313@qq.com  回復(fù)  更多評(píng)論   

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

          全部代碼 給我一份 謝謝.. 6673258@qq.com  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 山东省| 东乡族自治县| 临西县| 宾川县| 巢湖市| 元谋县| 南康市| 开封县| 民勤县| 铜山县| 右玉县| 兴和县| 太和县| 林口县| 东丽区| 金平| 延川县| 上思县| 萍乡市| 辽中县| 太仆寺旗| 四子王旗| 尚志市| 华阴市| 广水市| 维西| 枝江市| 昭苏县| 茶陵县| 平凉市| 灌云县| 耒阳市| 白银市| 商城县| 香格里拉县| 佛学| 交口县| 霍林郭勒市| 长岛县| 江都市| 呼伦贝尔市|