黑马程序员技术交流社区
标题:
关于数据库ResultSet 与 二维数组
[打印本页]
作者:
王海飞
时间:
2011-7-21 10:46
标题:
关于数据库ResultSet 与 二维数组
问题:
用jsp 开发系统时,jsp 页面经常要从一个bean(对数据库的操作)返回值,即bean 的处理
结果,大部分时查询executeQuery(),此方法返回resultset 若在页面中直接得到
ResultSet 则bean 中statement,connection 不能关闭,还要在jsp页面中关闭,麻烦.
可否将结果集转换为以二维数组返回,是不是太占用内存.
作者:
崔虎
时间:
2011-7-21 11:21
ResultSet等java.sql包中的接口,本就不应该出现在JSP页面中。
说句老话,“在Java中万物皆对象”,一般来说,在程序中需要用到数据库中的某张表,那么都会为这张表,建立一个类。
比如,常见的“员工管理程序”需要对“员工”进行增、删、改、查。 那么数据库中必须有一张员工表,程序中也应该有一个员工类。
范例1:数据库——Employees表。[code=sql]CREATE TABLE Employees(
empno number(10) primary key,
ename varchar(10) not null,
sal number(7,2) not null check(sal>0),
hiredate date not null
)[/code]范例2:Employees类。[code=java]package org.cxy.vo;
import java.util.*;
public class Employees {
private String empno; //员工编号。
private String ename; //员工姓名。
private Float sal; //员工工资。
private Date hiredate; //入职日期。
public String getEmpno() {
return empno;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Float getSal() {
return sal;
}
public void setSal(Float sal) {
this.sal = sal;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
}[/code]此时就可以写一个类,用来操作数据库,返回的值就是一个对象,而不再是数组等。
下面的代码,
您先主要看看各个方法是如何返回值的
,数据库的关闭操作,后述。
范例3:IEmployeesDAO接口的定义。[code=java]package org.cxy.dao;
import org.cxy.vo.*;
import java.util.*;
public interface IEmployeesDAO {
// 向数据库中创建一个Employees对象。
public boolean doCreate(Employees emp)throws Exception;
// 更新数据库中的一个Employees对象。
public boolean doUpdate(Employees emp)throws Exception;
// 指定主键empno,删除数据库中的一个Employees对象。
public boolean doRemove(String empno)throws Exception;
// 指定主键empno,从数据库中查询出对应的Employees对象。
public Employees findById(String empno)throws Exception;
// 指定关键字keyword,从数据库中模糊查询出多个Employees对象。
public List<Employees> findAll(String keyword)throws Exception;
}[/code]范例4:操作数据库。[code=java]package org.cxy.dao.impl;
import java.sql.*;
import java.util.*;
import org.cxy.dao.*;
import org.cxy.vo.Employees;
public class EmployeesDAOImpl implements IEmployeesDAO{
private Connection conn; // 数据库连接对象。
private PreparedStatement psmt; // sql语句对象。
public EmployeesDAOImpl(Connection conn){
this.conn = conn;
}
public boolean doCreate(Employees emp) throws Exception {
boolean mark = false;
String sql = "INSERT INTO Employees(empno,ename,sal,hiredate) VALUES(?,?,?,?)";
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setString(1, emp.getEmpno());
this.psmt.setString(2, emp.getEname());
this.psmt.setFloat(3, emp.getSal());
this.psmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));
if(this.psmt.executeUpdate()>0){
mark = true;
}
return mark;
}
public boolean doRemove(String empno) throws Exception {
boolean mark = false;
String sql = "DELETE FROM Employees WHERE empno = ?";
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setString(1, empno);
if(this.psmt.executeUpdate()>0){
mark = true;
}
return mark;
}
public boolean doUpdate(Employees emp) throws Exception {
boolean mark = false;
String sql = "UPDATE Employees SET ename = ?,sal = ?,hiredate = ? WHERE empno = ? ";
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setString(1, emp.getEname());
this.psmt.setFloat(2, emp.getSal());
this.psmt.setDate(3, new java.sql.Date(emp.getHiredate().getTime()));
this.psmt.setString(4, emp.getEmpno());
if(this.psmt.executeUpdate()>0){
mark = true;
}
return mark;
}
public List<Employees> findAll(String keyword) throws Exception {
List<Employees> list = new ArrayList<Employees>();
String sql = "SELECT empno,ename,sal,hiredate FROM Employees WHERE empno like ? OR ename like ? OR sal like ? OR to_char(hiredate,'yyyy-mm-dd') like ?";
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setString(1, "%"+keyword+"%");
this.psmt.setString(2, "%"+keyword+"%");
this.psmt.setString(3, "%"+keyword+"%");
this.psmt.setString(4, "%"+keyword+"%");
Employees temp = null;
ResultSet rs = this.psmt.executeQuery();
while(rs.next()){
temp = new Employees();
temp.setEmpno(rs.getString(1));
temp.setEname(rs.getString(2));
temp.setSal(rs.getFloat(3));
// java.sql.Date重写了toString()方法.
temp.setHiredate(rs.getDate(4));
list.add(temp);
}
return list;
}
public Employees findById(String empno) throws Exception {
Employees temp = null;
String sql = "SELECT empno,ename,sal,hiredate FROM Employees WHERE empno = ?";
this.psmt = this.conn.prepareStatement(sql);
this.psmt.setString(1, empno);
ResultSet rs = this.psmt.executeQuery();
if(rs.next()){
temp = new Employees();
temp.setEmpno(rs.getString(1));
temp.setEname(rs.getString(2));
temp.setSal(rs.getFloat(3));
// java.sql.Date重写了toString()方法.
temp.setHiredate(rs.getDate(4));
}
return temp;
}
}[/code]其实操作的时候,只需要关闭Connection接口即可。
贴出上述代码,主要是为了告诉您,
操作数据库时,返回的值,应该是一个个的对象
,而不是什么数组、ResultSet等。
关闭数据库的代码如下,使用了代理技术,说白了就是,EmployeesDAOImpl 只关注于怎么操作数据库,至于数据库的打开与关闭都由外界(代理类)去管理。范例3中EmployeesDAOImpl 类通过构造方法来接受外界传递过来的Connection对象。
范例5:DatabaseConnection 数据库连接类。[code=java]package org.cxy.dbc;
import java.sql.*;
public class DatabaseConnection {
private String driver = "oracle.jdbc.driver.OracleDriver";
private String url = "jdbc:oracle:thin:@localhost:1521:orcl";
private String username = "scott";
private String password = "cxy";
private Connection conn;
public DatabaseConnection() throws Exception{
Class.forName(driver);
this.conn = DriverManager.getConnection(url,username,password);
}
public Connection getConnection(){
return this.conn;
}
public void close() throws Exception{
// 若已经建立了数据库连接。
if(this.conn != null){
this.conn.close();
}
}
}[/code]范例6:代理类,专注于数据库的开关。[code=java]package org.cxy.dao.proxy;
import java.util.List;
import org.cxy.dbc.*;
import org.cxy.vo.*;
import org.cxy.dao.*;
import org.cxy.dao.impl.*;
public class EmployeesDAOProxy implements IEmployeesDAO{
private DatabaseConnection dbc;// 数据库连接对象。
private IEmployeesDAO real; //真正主题类。
public EmployeesDAOProxy()throws Exception{
this.dbc = new DatabaseConnection();
this.real = new EmployeesDAOImpl(this.dbc.getConnection());
}
public boolean doCreate(Employees emp) throws Exception {
boolean mark = false;
try{// 若数据库中存在,则执行创建操作!
if(this.real.findById(emp.getEmpno()) == null){
mark = this.real.doCreate(emp);
}
}finally{// 不论是否操作成功,都关闭数据库。
this.dbc.close();
}
return mark;
}
public boolean doRemove(String empno) throws Exception {
boolean mark = false;
try{
mark = this.real.doRemove(empno);
}finally{// 不论是否操作成功,都关闭数据库。
this.dbc.close();
}
return mark;
}
public boolean doUpdate(Employees emp) throws Exception {
boolean mark = false;
try{
mark = this.real.doUpdate(emp);
}finally{// 不论是否操作成功,都关闭数据库。
this.dbc.close();
}
return mark;
}
public List<Employees> findAll(String keyword) throws Exception {
List<Employees> list = null;
try{
list = this.real.findAll(keyword);
}finally{// 不论是否操作成功,都关闭数据库。
this.dbc.close();
}
return list;
}
public Employees findById(String empno) throws Exception {
Employees emp = null;
try{
emp = this.real.findById(empno);
}finally{// 不论是否操作成功,都关闭数据库。
this.dbc.close();
}
return emp;
}
}[/code]希望对您有帮助。 本代码就应用了所谓的DAO设计模式。
[
本帖最后由 cxy_zy 于 2011-07-21 13:23 编辑
]
作者:
匿名
时间:
2011-7-21 13:30
刚刚修改了一下回复,刚才少发了一个DatabaseConnection类。现在应该没有漏掉的代码了。
另外招募队友。吼吼。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2