一、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