JDBC 6:JDBC小结_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JDBC 6:JDBC小结

JDBC 6:JDBC小结

 2015/4/13 18:38:10  XiangdongLee  程序员俱乐部  我要评论(0)
  • 摘要:一、JDBC连接数据库的3种形式:1.直接写连接数据库的4个语句,进行连接:/***DBUtil:数据库工具类**@authorXiangdongLee**/publicclassDBUtil{/***获得数据库连接**@return*/publicstaticConnectiongetConnection(){Connectionconn=null;StringdriverName="oracle.jdbc.OracleDriver";Stringurl="jdbc:oracle:thin
  • 标签:
一、JDBC连接数据库的3种形式:

        1.直接写连接数据库的4个语句,进行连接:
       
class="java">/**
 * DBUtil:数据库工具类
 * 
 * @author XiangdongLee
 * 
 */
public class DBUtil {
	/**
	 * 获得数据库连接
	 * 
	 * @return
	 */
	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("加载数据库驱动出错...");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("获得数据库连接出错...");
			e.printStackTrace();
		}
		return conn;
	}


        2.将数据库加载放入静态代码块中,这样,数据库只需要加载一次即可:
       
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.创建配置文件,加载配置文件中的信息:
       
public class DBUtil {
	private static Properties props;

	static {
		try {
			props = new Properties();
			// 读取 jdbc 配置文件到输入流(jdbc.properties)
			InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(
					"jdbc.properties");
			// 从输入流中加载 jdbc 配置文件
			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连接和操作数据库的范例代码,供学习和回顾JDBC。

        范例1  JDBC处理Select语句
 
        题目:基于Emp和Dept表,求部门名和该部门的平均薪水。
       
        第1步:打开Oracle服务,使用PL/SQL Developer工具,写出该题目的sql语句并先执行,查看效果。
       
--求部门名和平均薪水
select d.dname,round(avg(e.sal)) avgsal 
from emp e,dept d
where d.deptno=e.deptno group by d.dname;


        第2步:创建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步:创建数据库工具类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();
			// 读取 jdbc 配置文件到输入流(jdbc.properties)
			InputStream in = DBUtil.class.getClassLoader().getResourceAsStream(
					"jdbc.properties");
			// 从输入流中加载 jdbc 配置文件
			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();
			}
		}
	}

	// public static void main(String[] args) {
	// System.out.println(getConnection());
	// }
}


        第4步:创建Dao类封装对数据库的操作。
       
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;

	// 结果集为多行多列,使用List。
	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.setDname(rs.getString(1));
				deptSal.setAvgsal(rs.getInt("avgsal"));
				// deptSal.setAvgsal(rs.getInt(2));
				list.add(deptSal);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(conn, ps, rs);
		}
		return list;
	}
}

        代码说明:
      (1)第25行:在将PL/SQL中的sql语句的第3行复制粘贴的时候,注意不要把分号“;”一起粘贴过来,这样会报错。也就是说,第25行不要写成:
       
sql += " where d.deptno=e.deptno group by d.dname;";

        而应该是:
       
sql += " where d.deptno=e.deptno group by d.dname";

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


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



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

        这一步,就相当于直接在PL/SQL Developer工具中,编写存储过程测试代码,然后执行,查看结果。代码如下:
       
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;
  • jdbc.rar (268 Bytes)
  • 下载次数: 0
  • 相关文章
发表评论
用户名: 匿名