日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JDBC小結(jié)

 芥納須彌 2015-04-24


一、JDBC連接數(shù)據(jù)庫的3種形式: 

        1.直接寫連接數(shù)據(jù)庫的4個語句,進行連接: 
       
Java代碼  收藏代碼
  1. /** 
  2.  * DBUtil:數(shù)據(jù)庫工具類 
  3.  *  
  4.  * @author XiangdongLee 
  5.  *  
  6.  */  
  7. public class DBUtil {  
  8.     /** 
  9.      * 獲得數(shù)據(jù)庫連接 
  10.      *  
  11.      * @return 
  12.      */  
  13.     public static Connection getConnection() {  
  14.         Connection conn = null;  
  15.         String driverName = "oracle.jdbc.OracleDriver";  
  16.         String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
  17.         String username = "scott";  
  18.         String password = "tiger";  
  19.   
  20.         try {  
  21.             Class.forName(driverName);  
  22.             conn = DriverManager.getConnection(url, username, password);  
  23.         } catch (ClassNotFoundException e) {  
  24.             System.out.println("加載數(shù)據(jù)庫驅(qū)動出錯...");  
  25.             e.printStackTrace();  
  26.         } catch (SQLException e) {  
  27.             System.out.println("獲得數(shù)據(jù)庫連接出錯...");  
  28.             e.printStackTrace();  
  29.         }  
  30.         return conn;  
  31.     }  


        2.將數(shù)據(jù)庫加載放入靜態(tài)代碼塊中,這樣,數(shù)據(jù)庫只需要加載一次即可: 
       
Java代碼  收藏代碼
  1. public class DBUtilStatic {  
  2.     // 只加載一次  
  3.     static {  
  4.         try {  
  5.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  6.         } catch (ClassNotFoundException e) {  
  7.             e.printStackTrace();  
  8.         }  
  9.     }  
  10.   
  11.     public static Connection getConnection() {  
  12.         Connection conn = null;  
  13.         String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";  
  14.         String username = "scott";  
  15.         String password = "tiger";  
  16.   
  17.         try {  
  18.             conn = DriverManager.getConnection(url, username, password);  
  19.         } catch (SQLException e) {  
  20.             e.printStackTrace();  
  21.         }  
  22.   
  23.         return conn;  
  24.     }  


        3.創(chuàng)建配置文件,加載配置文件中的信息: 
       
Java代碼  收藏代碼
  1. public class DBUtil {  
  2.     private static Properties props;  
  3.   
  4.     static {  
  5.         try {  
  6.             props = new Properties();  
  7.             // 讀取 jdbc 配置文件到輸入流(jdbc.properties)  
  8.             InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(  
  9.                     "jdbc.properties");  
  10.             // 從輸入流中加載 jdbc 配置文件  
  11.             props.load(in);  
  12.             Class.forName(props.getProperty("driverName"));  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         } catch (ClassNotFoundException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19.   
  20.     public static Connection getConnection() {  
  21.         Connection conn = null;  
  22.         String url = props.getProperty("url");  
  23.         String username = props.getProperty("username");  
  24.         String password = props.getProperty("password");  
  25.         try {  
  26.             conn = DriverManager.getConnection(url, username, password);  
  27.         } catch (SQLException e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.         return conn;  
  31.     }  


二、2個范例。 
        
        下面,再寫2個JDBC連接和操作數(shù)據(jù)庫的范例代碼,供學(xué)習和回顧JDBC。 

        范例1  JDBC處理Select語句 
  
        題目:基于Emp和Dept表,求部門名和該部門的平均薪水。 
        
        第1步:打開Oracle服務(wù),使用PL/SQL Developer工具,寫出該題目的sql語句并先執(zhí)行,查看效果。 
       
Sql代碼  收藏代碼
  1. --求部門名和平均薪水  
  2. select d.dname,round(avg(e.sal)) avgsal   
  3. from emp e,dept d  
  4. where d.deptno=e.deptno group by d.dname;  


        第2步:創(chuàng)建Pojo類。 
       
Java代碼  收藏代碼
  1. package com.lxd.pojo;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class DeptSal implements Serializable {  
  6.     private static final long serialVersionUID = 1L;  
  7.     private String dname;  
  8.     private Integer avgsal;  
  9.   
  10.     public DeptSal() {  
  11.     }  
  12.   
  13.     public String getDname() {  
  14.         return dname;  
  15.     }  
  16.   
  17.     public void setDname(String dname) {  
  18.         this.dname = dname;  
  19.     }  
  20.   
  21.     public Integer getAvgsal() {  
  22.         return avgsal;  
  23.     }  
  24.   
  25.     public void setAvgsal(Integer avgsal) {  
  26.         this.avgsal = avgsal;  
  27.     }  
  28.   
  29.     public static long getSerialversionuid() {  
  30.         return serialVersionUID;  
  31.     }  
  32.   
  33. }  


        第3步:創(chuàng)建數(shù)據(jù)庫工具類DBUtil。 
       
Java代碼  收藏代碼
  1. package com.lxd.dao;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.sql.Connection;  
  6. import java.sql.DriverManager;  
  7. import java.sql.PreparedStatement;  
  8. import java.sql.ResultSet;  
  9. import java.sql.SQLException;  
  10. import java.util.Properties;  
  11.   
  12. public class DBUtil {  
  13.     private static Properties props;  
  14.   
  15.     static {  
  16.         try {  
  17.             props = new Properties();  
  18.             // 讀取 jdbc 配置文件到輸入流(jdbc.properties)  
  19.             InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(  
  20.                     "jdbc.properties");  
  21.             // 從輸入流中加載 jdbc 配置文件  
  22.             props.load(in);  
  23.             Class.forName(props.getProperty("driverName"));  
  24.         } catch (IOException e) {  
  25.             e.printStackTrace();  
  26.         } catch (ClassNotFoundException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.     }  
  30.   
  31.     public static Connection getConnection() {  
  32.         Connection conn = null;  
  33.         String url = props.getProperty("url");  
  34.         String username = props.getProperty("username");  
  35.         String password = props.getProperty("password");  
  36.         try {  
  37.             conn = DriverManager.getConnection(url, username, password);  
  38.         } catch (SQLException e) {  
  39.             e.printStackTrace();  
  40.         }  
  41.         return conn;  
  42.     }  
  43.   
  44.     public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {  
  45.         if (rs != null) {  
  46.             try {  
  47.                 rs.close();  
  48.             } catch (SQLException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         }  
  52.   
  53.         if (ps != null) {  
  54.             try {  
  55.                 ps.close();  
  56.             } catch (SQLException e) {  
  57.                 e.printStackTrace();  
  58.             }  
  59.         }  
  60.   
  61.         if (conn != null) {  
  62.             try {  
  63.                 conn.close();  
  64.             } catch (SQLException e) {  
  65.                 e.printStackTrace();  
  66.             }  
  67.         }  
  68.     }  
  69.   
  70.     // public static void main(String[] args) {  
  71.     // System.out.println(getConnection());  
  72.     // }  
  73. }  


        第4步:創(chuàng)建Dao類封裝對數(shù)據(jù)庫的操作。 
       
Java代碼  收藏代碼
  1. package com.lxd.dao;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.PreparedStatement;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import com.lxd.pojo.DeptSal;  
  11.   
  12. public class DeptSalDao {  
  13.     private Connection conn;  
  14.     private PreparedStatement ps;  
  15.     private ResultSet rs;  
  16.   
  17.     // 結(jié)果集為多行多列,使用List。  
  18.     public List<DeptSal> getDeptSal() {  
  19.         List<DeptSal> list = new ArrayList<DeptSal>();  
  20.   
  21.         try {  
  22.             conn = DBUtil.getConnection();  
  23.             String sql = "select d.dname,round(avg(e.sal)) avgsal ";  
  24.             sql += " from emp e,dept d";  
  25.             sql += " where d.deptno=e.deptno group by d.dname";  
  26.             ps = conn.prepareStatement(sql);  
  27.             rs = ps.executeQuery();  
  28.             while (rs.next()) {  
  29.                 // 根據(jù)結(jié)果集,定義封裝類去封裝。  
  30.                 DeptSal deptSal = new DeptSal();  
  31.                 deptSal.setDname(rs.getString("dname"));  
  32.                 // deptSal.setDname(rs.getString(1));  
  33.                 deptSal.setAvgsal(rs.getInt("avgsal"));  
  34.                 // deptSal.setAvgsal(rs.getInt(2));  
  35.                 list.add(deptSal);  
  36.             }  
  37.         } catch (SQLException e) {  
  38.             e.printStackTrace();  
  39.         } finally {  
  40.             DBUtil.close(conn, ps, rs);  
  41.         }  
  42.         return list;  
  43.     }  
  44. }  

        代碼說明: 
      (1)第25行:在將PL/SQL中的sql語句的第3行復(fù)制粘貼的時候,注意不要把分號“;”一起粘貼過來,這樣會報錯。也就是說,第25行不要寫成: 
       
Sql代碼  收藏代碼
  1. sql += " where d.deptno=e.deptno group by d.dname;";  

        而應(yīng)該是: 
       
Sql代碼  收藏代碼
  1. sql += " where d.deptno=e.deptno group by d.dname";  

      (2)第31-34行:既可以根據(jù)字段名獲得字段值(列的值)。也可以根據(jù)字段索引獲得字段值(列的值),注意:下標從 1 開始。 


        第5步:創(chuàng)建測試類,顯示結(jié)果。 
       
Java代碼  收藏代碼
  1. package com.lxd.test;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. import com.lxd.dao.DeptSalDao;  
  6. import com.lxd.pojo.DeptSal;  
  7.   
  8. public class DeptSalDaoTest {  
  9.     @Test  
  10.     public void deptSal() {  
  11.         DeptSalDao dao = new DeptSalDao();  
  12.         for (DeptSal deptSal : dao.getDeptSal()) {  
  13.             System.out.println("部門名:" + deptSal.getDname() + " " + "平均薪水:"  
  14.                     + deptSal.getAvgsal());  
  15.         }  
  16.     }  
  17. }  

        這一步,就相當于直接在PL/SQL Developer工具中,執(zhí)行sql語句后查看結(jié)果。 



        范例2  JDBC處理存儲過程 
  
        題目:使用EMP表,建立一個存儲過程,輸入一個雇員號,返回該雇員的上司姓名。 
        
        第1步:打開Oracle服務(wù),使用PL/SQL Developer工具,寫出該題目的存儲過程并執(zhí)行,創(chuàng)建出procedure文件:p_mgr。 
       
Sql代碼  收藏代碼
  1. --使用EMP表,建立一個存儲過程,輸入一個雇員號,返回該雇員的上司姓名。  
  2. create or replace procedure p_mgr(  
  3.   v_empno emp.empno%type,  
  4.   v_ename out emp.ename%type  
  5. as  
  6. --KING沒有上司。  
  7.   v_mgr emp.mgr%type;  
  8. begin   
  9.   select mgr into v_mgr   
  10.   from emp where empno=v_empno;  
  11.   if v_mgr is null then  
  12.     v_ename:='沒有上司';  
  13.     --這兒寫return,如果沒有上司,后面的代碼就不執(zhí)行了。  
  14.     return;  
  15.   end if;  
  16.   select ename into v_ename from emp  
  17.   where empno=v_mgr;  
  18. exception  
  19.   when others then  
  20.     v_ename:='NO_PERSON';  
  21. end p_mgr;  


        第2步:創(chuàng)建Dao類封裝對數(shù)據(jù)庫中存儲過程的操作。 
       
Java代碼  收藏代碼
  1. package com.lxd.dao;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Types;  
  8.   
  9. import com.lxd.dao.DBUtil;  
  10.   
  11. public class MgrEnameDao {  
  12.     public String getMgrEname(Integer empno) {  
  13.         Connection conn = null;  
  14.         CallableStatement cs = null;  
  15.         // 不需要用到結(jié)果集,因此可不定義。  
  16.         // ResultSet rs = null;  
  17.         String ename = "";  
  18.   
  19.         try {  
  20.             conn = DBUtil.getConnection();  
  21.             String sql = "(call p_mgr(?,?))";  
  22.             cs = conn.prepareCall(sql);  
  23.             cs.setInt(1, empno);  
  24.             cs.registerOutParameter(2, Types.VARCHAR);  
  25.   
  26.             cs.executeUpdate();  
  27.             ename = cs.getString(2);  
  28.         } catch (SQLException e) {  
  29.             e.printStackTrace();  
  30.         } finally {  
  31.             DBUtil.close(conn, cs, null);  
  32.         }  
  33.   
  34.         return ename;  
  35.     }  
  36. }  


        第3步:創(chuàng)建測試類,顯示結(jié)果。 
       
Java代碼  收藏代碼
  1. package com.lxd.dao.test;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStreamReader;  
  6.   
  7. import org.junit.Test;  
  8.   
  9. import com.mgr.dao.MgrEnameDao;  
  10.   
  11. public class MgrEnameDaoTest {  
  12.     @Test  
  13.     public void getMgrEname() {  
  14.         try {  
  15.             System.out.println("請輸入雇員號");  
  16.             BufferedReader br = new BufferedReader(new InputStreamReader(  
  17.                     System.in));  
  18.             Integer empno = Integer.parseInt(br.readLine());  
  19.             MgrEnameDao dao = new MgrEnameDao();  
  20.             String ename = dao.getMgrEname(empno);  
  21.             if (ename.equals("NO_PERSON")) {  
  22.                 System.out.println("雇員號:" + empno + "不存在");  
  23.             } else {  
  24.                 System.out.println("雇員號:" + empno + "的上司名:" + ename);  
  25.             }  
  26.         } catch (NumberFormatException e) {  
  27.             System.out.println("請輸入數(shù)字");  
  28.             e.printStackTrace();  
  29.         } catch (IOException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33. }  

        這一步,就相當于直接在PL/SQL Developer工具中,編寫存儲過程測試代碼,然后執(zhí)行,查看結(jié)果。代碼如下: 
       
Sql代碼  收藏代碼
  1. declare  
  2.   v_empno emp.empno%type;  
  3.   v_ename emp.ename%type;  
  4. begin  
  5.   v_empno:=&empno;  
  6.   p_mgr(v_empno,v_ename);  
  7.   dbms_output.put_line(v_empno||' 上司名:'||v_ename);  
  8. end;  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多