A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王海飞 黑马帝   /  2011-7-21 10:46  /  3199 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:  
用jsp  开发系统时,jsp  页面经常要从一个bean(对数据库的操作)返回值,即bean  的处理  
结果,大部分时查询executeQuery(),此方法返回resultset  若在页面中直接得到  
ResultSet  则bean  中statement,connection  不能关闭,还要在jsp页面中关闭,麻烦.  
可否将结果集转换为以二维数组返回,是不是太占用内存.

2 个回复

倒序浏览
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 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 你每次都非常认真的对待每个问题,很不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-21 13:30:02
藤椅
刚刚修改了一下回复,刚才少发了一个DatabaseConnection类。现在应该没有漏掉的代码了。
另外招募队友。吼吼。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马