分享

JDBC小结

 芥纳须弥 2015-04-24


一、JDBC连接数据库的3种形式: 

        1.直接写连接数据库的4个语句,进行连接: 
       
Java代码  收藏代码
  1. /** 
  2.  * DBUtil:数据库工具类 
  3.  *  
  4.  * @author XiangdongLee 
  5.  *  
  6.  */  
  7. public class DBUtil {  
  8.     /** 
  9.      * 获得数据库连接 
  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("加载数据库驱动出错...");  
  25.             e.printStackTrace();  
  26.         } catch (SQLException e) {  
  27.             System.out.println("获得数据库连接出错...");  
  28.             e.printStackTrace();  
  29.         }  
  30.         return conn;  
  31.     }  


        2.将数据库加载放入静态代码块中,这样,数据库只需要加载一次即可: 
       
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.创建配置文件,加载配置文件中的信息: 
       
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连接和操作数据库的范例代码,供学习和回顾JDBC。 

        范例1  JDBC处理Select语句 
  
        题目:基于Emp和Dept表,求部门名和该部门的平均薪水。 
        
        第1步:打开Oracle服务,使用PL/SQL Developer工具,写出该题目的sql语句并先执行,查看效果。 
       
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步:创建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步:创建数据库工具类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步:创建Dao类封装对数据库的操作。 
       
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.     // 结果集为多行多列,使用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.                 // 根据结果集,定义封装类去封装。  
  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行复制粘贴的时候,注意不要把分号“;”一起粘贴过来,这样会报错。也就是说,第25行不要写成: 
       
Sql代码  收藏代码
  1. sql += " where d.deptno=e.deptno group by d.dname;";  

        而应该是: 
       
Sql代码  收藏代码
  1. sql += " where d.deptno=e.deptno group by d.dname";  

      (2)第31-34行:既可以根据字段名获得字段值(列的值)。也可以根据字段索引获得字段值(列的值),注意:下标从 1 开始。 


        第5步:创建测试类,显示结果。 
       
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工具中,执行sql语句后查看结果。 



        范例2  JDBC处理存储过程 
  
        题目:使用EMP表,建立一个存储过程,输入一个雇员号,返回该雇员的上司姓名。 
        
        第1步:打开Oracle服务,使用PL/SQL Developer工具,写出该题目的存储过程并执行,创建出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,如果没有上司,后面的代码就不执行了。  
  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步:创建Dao类封装对数据库中存储过程的操作。 
       
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.         // 不需要用到结果集,因此可不定义。  
  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步:创建测试类,显示结果。 
       
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("请输入数字");  
  28.             e.printStackTrace();  
  29.         } catch (IOException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33. }  

        这一步,就相当于直接在PL/SQL Developer工具中,编写存储过程测试代码,然后执行,查看结果。代码如下: 
       
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;  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约