一、JDBC連接數(shù)據(jù)庫的3種形式: 1.直接寫連接數(shù)據(jù)庫的4個語句,進行連接: -
-
-
-
-
-
- public class DBUtil {
-
-
-
-
-
- public static Connection getConnection() {
- Connection conn = null;
- String driverName = "oracle.jdbc.OracleDriver";
- String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
- String username = "scott";
- String password = "tiger";
-
- try {
- Class.forName(driverName);
- conn = DriverManager.getConnection(url, username, password);
- } catch (ClassNotFoundException e) {
- System.out.println("加載數(shù)據(jù)庫驅(qū)動出錯...");
- e.printStackTrace();
- } catch (SQLException e) {
- System.out.println("獲得數(shù)據(jù)庫連接出錯...");
- e.printStackTrace();
- }
- return conn;
- }
2.將數(shù)據(jù)庫加載放入靜態(tài)代碼塊中,這樣,數(shù)據(jù)庫只需要加載一次即可: - public class DBUtilStatic {
-
- static {
- try {
- Class.forName("oracle.jdbc.driver.OracleDriver");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static Connection getConnection() {
- Connection conn = null;
- String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
- String username = "scott";
- String password = "tiger";
-
- try {
- conn = DriverManager.getConnection(url, username, password);
- } catch (SQLException e) {
- e.printStackTrace();
- }
-
- return conn;
- }
3.創(chuàng)建配置文件,加載配置文件中的信息: - public class DBUtil {
- private static Properties props;
-
- static {
- try {
- props = new Properties();
-
- InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(
- "jdbc.properties");
-
- props.load(in);
- Class.forName(props.getProperty("driverName"));
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static Connection getConnection() {
- Connection conn = null;
- String url = props.getProperty("url");
- String username = props.getProperty("username");
- String password = props.getProperty("password");
- try {
- conn = DriverManager.getConnection(url, username, password);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return conn;
- }
二、2個范例。 下面,再寫2個JDBC連接和操作數(shù)據(jù)庫的范例代碼,供學(xué)習和回顧JDBC。 范例1 JDBC處理Select語句 題目:基于Emp和Dept表,求部門名和該部門的平均薪水。 第1步:打開Oracle服務(wù),使用PL/SQL Developer工具,寫出該題目的sql語句并先執(zhí)行,查看效果。 -
- select d.dname,round(avg(e.sal)) avgsal
- from emp e,dept d
- where d.deptno=e.deptno group by d.dname;
第2步:創(chuàng)建Pojo類。 - package com.lxd.pojo;
-
- import java.io.Serializable;
-
- public class DeptSal implements Serializable {
- private static final long serialVersionUID = 1L;
- private String dname;
- private Integer avgsal;
-
- public DeptSal() {
- }
-
- public String getDname() {
- return dname;
- }
-
- public void setDname(String dname) {
- this.dname = dname;
- }
-
- public Integer getAvgsal() {
- return avgsal;
- }
-
- public void setAvgsal(Integer avgsal) {
- this.avgsal = avgsal;
- }
-
- public static long getSerialversionuid() {
- return serialVersionUID;
- }
-
- }
第3步:創(chuàng)建數(shù)據(jù)庫工具類DBUtil。 - package com.lxd.dao;
-
- import java.io.IOException;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.Properties;
-
- public class DBUtil {
- private static Properties props;
-
- static {
- try {
- props = new Properties();
-
- InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(
- "jdbc.properties");
-
- props.load(in);
- Class.forName(props.getProperty("driverName"));
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
-
- public static Connection getConnection() {
- Connection conn = null;
- String url = props.getProperty("url");
- String username = props.getProperty("username");
- String password = props.getProperty("password");
- try {
- conn = DriverManager.getConnection(url, username, password);
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return conn;
- }
-
- public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
- if (rs != null) {
- try {
- rs.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if (ps != null) {
- try {
- ps.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
-
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- }
-
-
-
-
- }
第4步:創(chuàng)建Dao類封裝對數(shù)據(jù)庫的操作。 - package com.lxd.dao;
-
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.ArrayList;
- import java.util.List;
-
- import com.lxd.pojo.DeptSal;
-
- public class DeptSalDao {
- private Connection conn;
- private PreparedStatement ps;
- private ResultSet rs;
-
-
- public List<DeptSal> getDeptSal() {
- List<DeptSal> list = new ArrayList<DeptSal>();
-
- try {
- conn = DBUtil.getConnection();
- String sql = "select d.dname,round(avg(e.sal)) avgsal ";
- sql += " from emp e,dept d";
- sql += " where d.deptno=e.deptno group by d.dname";
- ps = conn.prepareStatement(sql);
- rs = ps.executeQuery();
- while (rs.next()) {
-
- DeptSal deptSal = new DeptSal();
- deptSal.setDname(rs.getString("dname"));
-
- deptSal.setAvgsal(rs.getInt("avgsal"));
-
- list.add(deptSal);
- }
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- DBUtil.close(conn, ps, rs);
- }
- return list;
- }
- }
代碼說明: (1)第25行:在將PL/SQL中的sql語句的第3行復(fù)制粘貼的時候,注意不要把分號“;”一起粘貼過來,這樣會報錯。也就是說,第25行不要寫成: - sql += " where d.deptno=e.deptno group by d.dname;";
而應(yīng)該是: - sql += " where d.deptno=e.deptno group by d.dname";
(2)第31-34行:既可以根據(jù)字段名獲得字段值(列的值)。也可以根據(jù)字段索引獲得字段值(列的值),注意:下標從 1 開始。 第5步:創(chuàng)建測試類,顯示結(jié)果。 - package com.lxd.test;
-
- import org.junit.Test;
-
- import com.lxd.dao.DeptSalDao;
- import com.lxd.pojo.DeptSal;
-
- public class DeptSalDaoTest {
- @Test
- public void deptSal() {
- DeptSalDao dao = new DeptSalDao();
- for (DeptSal deptSal : dao.getDeptSal()) {
- System.out.println("部門名:" + deptSal.getDname() + " " + "平均薪水:"
- + deptSal.getAvgsal());
- }
- }
- }
這一步,就相當于直接在PL/SQL Developer工具中,執(zhí)行sql語句后查看結(jié)果。 范例2 JDBC處理存儲過程 題目:使用EMP表,建立一個存儲過程,輸入一個雇員號,返回該雇員的上司姓名。 第1步:打開Oracle服務(wù),使用PL/SQL Developer工具,寫出該題目的存儲過程并執(zhí)行,創(chuàng)建出procedure文件:p_mgr。 -
- create or replace procedure p_mgr(
- v_empno emp.empno%type,
- v_ename out emp.ename%type
- ) as
-
- v_mgr emp.mgr%type;
- begin
- select mgr into v_mgr
- from emp where empno=v_empno;
- if v_mgr is null then
- v_ename:='沒有上司';
-
- return;
- end if;
- select ename into v_ename from emp
- where empno=v_mgr;
- exception
- when others then
- v_ename:='NO_PERSON';
- end p_mgr;
第2步:創(chuàng)建Dao類封裝對數(shù)據(jù)庫中存儲過程的操作。 - package com.lxd.dao;
-
- import java.sql.CallableStatement;
- import java.sql.Connection;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Types;
-
- import com.lxd.dao.DBUtil;
-
- public class MgrEnameDao {
- public String getMgrEname(Integer empno) {
- Connection conn = null;
- CallableStatement cs = null;
-
-
- String ename = "";
-
- try {
- conn = DBUtil.getConnection();
- String sql = "(call p_mgr(?,?))";
- cs = conn.prepareCall(sql);
- cs.setInt(1, empno);
- cs.registerOutParameter(2, Types.VARCHAR);
-
- cs.executeUpdate();
- ename = cs.getString(2);
- } catch (SQLException e) {
- e.printStackTrace();
- } finally {
- DBUtil.close(conn, cs, null);
- }
-
- return ename;
- }
- }
第3步:創(chuàng)建測試類,顯示結(jié)果。 - package com.lxd.dao.test;
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
-
- import org.junit.Test;
-
- import com.mgr.dao.MgrEnameDao;
-
- public class MgrEnameDaoTest {
- @Test
- public void getMgrEname() {
- try {
- System.out.println("請輸入雇員號");
- BufferedReader br = new BufferedReader(new InputStreamReader(
- System.in));
- Integer empno = Integer.parseInt(br.readLine());
- MgrEnameDao dao = new MgrEnameDao();
- String ename = dao.getMgrEname(empno);
- if (ename.equals("NO_PERSON")) {
- System.out.println("雇員號:" + empno + "不存在");
- } else {
- System.out.println("雇員號:" + empno + "的上司名:" + ename);
- }
- } catch (NumberFormatException e) {
- System.out.println("請輸入數(shù)字");
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
這一步,就相當于直接在PL/SQL Developer工具中,編寫存儲過程測試代碼,然后執(zhí)行,查看結(jié)果。代碼如下: - declare
- v_empno emp.empno%type;
- v_ename emp.ename%type;
- begin
- v_empno:=&empno;
- p_mgr(v_empno,v_ename);
- dbms_output.put_line(v_empno||' 上司名:'||v_ename);
- end;
|