在JSP中,如何把对数据库的操作全部封装在JAVABEAN、SERVLET中?欢迎讨论!

时间:2022-06-04 19:03:50
不是简单的连接数据库,而是把对数据库的存取等都封装起来,达到J2EE中MVC的概念,网上的很多例子都不是这样,希望有经验的人士来共同探讨!!

13 个解决方案

#1


我的理解
public class myjdbc{
public myjdbc(){
加载驱动,连接
}
public Resultset executeQuery(){
查询
}
public int executeUpdate(){
更新,插入,删除
}
public void close(){
关闭stmt,connection等
}
}

我还看见别人把backup、store等都加进来了,还有用到pool等,我还不太会:(

#2


其实核心就是减少客户端的负荷,力争让所有的业务逻辑都在服务器端完成。
具体如何实现,就有很多技巧可言了。

#3


可以把连接放在一个类里,把数据库的增,删,改,查放在另一个类里
这样会比较好

#4


哪位有这样的例子呢?能否发出来看看!

#5


可以先写一个与数据操作打交道的数据类,然后再写其它实现逻辑的类,需要返回页面的数据用vector之类的数据结构返回,总之,jsp仅仅是实现界面功能,逻辑应该全部封装到类里。
    如果界面交互操作十分复杂,可以考虑用severlet实现。

#6


public myjdbc(){
加载驱动,连接
}

因该改为
public myjdbc(){
去连接池中取连接;
}

#7


给你个简单的吧,两个类 ,一个是db.java ,封装最简单的操作,
一个是adduser.java 用于完成功能

//*******************************************db.java

package com.skybay;

import java.sql.*;
import java.net.*;
import java.lang.*;
import java.io.*;
import java.util.*;


public class db{

Connection conn = null;
ResultSet rs = null;

public db() {
try {
//注册数据库驱动程序为Oracle驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(java.lang.ClassNotFoundException e) {
//这样写是为了方便调试程序,出错打印mydb()就知道在什么地方出错了
System.err.println("mydb(): " + e.getMessage());
}
}

//executeQuery方法用于进行记录的查询操作

//入口参数为sql语句,返回ResultSet对象
public ResultSet executeQuery(String sql) {
rs = null;
try {
//建立数据库连接,使用Oracle的一种thin连接方式,demo为主机名字,demodb为数据库,后面的两个demo为用户名和密码
conn = DriverManager.getConnection("jdbc:odbc:skybay","","");
Statement stmt = conn.createStatement();
//执行数据库查询操作
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("db.executeQuery: " + ex.getMessage());
}
return rs;
}

//executeUpdate方法用于进行add或者update记录的操作

//入口参数为sql语句,成功返回true,否则为false
public boolean executeUpdate(String sql) {
boolean bupdate=false;
rs = null;
try {
//建立数据库连接,其它参数说明同上面的一样
conn = DriverManager.getConnection("jdbc:odbc:skybay","","");
Statement stmt = conn.createStatement();
int rowCount = stmt.executeUpdate(sql);
//如果不成功,bupdate就会返回0
if(rowCount!=0)bupdate=true;
}
catch(SQLException ex) {
//打印出错信息
System.err.println("db.executeUpdate: " + ex.getMessage());
}
return bupdate;
}


}

//****************************************************adduser.java
package com.skybay;

import java.sql.*;
import java.lang.*;

//adduser由db派生出来,拥有db的成员变量和方法
public class adduser extends db {


String name;
String password;

//构建器
/*
*************************************************************
*****添加一个新用户,若成功返回ture,否则返回false***********
*************************************************************
*/
public boolean addNewUser(){
boolean boadduser=false;
try {
//进行用户注册的记录添加操作,生成sql语句
String sSql=new String("insert into RegInfo(name,password) values('" + name + " ','" + password + "')");
//sSql=sSql+ " values(" + "aa" + "aa" + ")";
//一种调试的方法,可以打印出sql语句,以便于查看错误
System.out.println(sSql);
//调用父类的executeUpdate方法,并根据成功以否来设置返回值
if(super.executeUpdate(sSql)) boadduser=true;
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//无论是否出错,都要返回值
return boadduser;
}
}

/*
******************************************************************
***用于判断用户名和密码时候相符,若符合返回ture,否则返回false*****
******************************************************************
*/
public boolean checkUser(){
boolean boadduser=false;
try {
//构建sql查询语句
String sSql="select * from RegInfo where name='" + name + "' and password='" + password + "'";
//String sSql="select * from RegInfo";// where name='" + name + "' and password='" + password + "'";
//调用父类的executeQuery方法
if((super.executeQuery(sSql)).next()){
//查询出来的记录集为空
boadduser=true;
}else{
boadduser=false;
}
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//返回值
return boadduser;
}
}

/*
*****************************************************************************
***checkName()函数用于判断用户名是否已经存在,若存在,返回ture,否则返回fals*e
*****************************************************************************
*/
public boolean checkName(){
boolean boadduser=false;
try {
//构建sql查询语句
String sSql="select * from RegInfo where name='" + name + "'";
//String sSql="select * from RegInfo";// where name='" + name + "' and password='" + password + "'";
//调用父类的executeQuery方法
if((super.executeQuery(sSql)).next()){
//查询出来的记录集为空
boadduser=true;
}else{
boadduser=false;
}
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//返回值
return boadduser;
}
}

public void setName(String name) { this.name = name; }
public void setPassword(String password) { this.password= password; }

public String getName() { return name; }
public String getPassword() { return password; }

}




然后你就可以在jsp里调用这个bean了!!!

#8


怎样实现多步操作的事务控制呢?
我使用两条语句(第一条可以正确插入,第二条语句不能插入),在所有的数据库操作前,先SerAutoCommit(False),然后再执行2次数据库操作和Commit,最后再SerAutoCommit(True),但是结果却是第一条语句成功插入数据库。
整个结果好像和没有使用事务控制一个效果,为什么?

#9


...

需要做一个错误判断。
无错:Commit
有错;RollBack


#10


up

#11


up

#12


以前我写过一个软件下载站点。
就是用javabean封装数据库连接过程。
下面是例子。数据库是mysql的。
package soft;
import java.util.*;
import java.sql.*;
import java.io.*;
import java.sql.*;

public class mysql {
Connection con=null; 
Statement stmt=null;
ResultSet rs=null;

public String url="jdbc:mysql://localhost:3306/soft?useUnicode=true&characterEncoding=8859_1";

public mysql()
{
try{ 
Class.forName("org.gjt.mm.mysql.Driver");
       }catch(ClassNotFoundException e)
   {System.err.println("mysql():"+e.getMessage());
try{
con=DriverManager.getConnection(url);
stmt = con.createStatement();
       }catch(SQLException sqlEx)
   {System.err.println(sqlEx.getMessage());}
}
public ResultSet executeQuery(String sql)
     {   
try{
    rs = stmt.executeQuery(sql);
   }catch(SQLException ex)
{
   System.err.println("executeQuery():"+ex.getMessage());
}
return rs;
      }

   public int executeUpdate(String sql)
     {   
int i=0;
try{
    i = stmt.executeUpdate(sql);
   }catch(SQLException ex)
{
   System.err.println("executeUpdate():"+ex.getMessage());
}
return i;
     }
}

这是.java原码。

#13


以前我写过一个软件下载站点。
就是用javabean封装数据库连接过程。
下面是例子。数据库是mysql的。
package soft;
import java.util.*;
import java.sql.*;
import java.io.*;
import java.sql.*;

public class mysql {
Connection con=null; 
Statement stmt=null;
ResultSet rs=null;

public String url="jdbc:mysql://localhost:3306/soft?useUnicode=true&characterEncoding=8859_1";

public mysql()
{
try{ 
Class.forName("org.gjt.mm.mysql.Driver");
       }catch(ClassNotFoundException e)
   {System.err.println("mysql():"+e.getMessage());
try{
con=DriverManager.getConnection(url);
stmt = con.createStatement();
       }catch(SQLException sqlEx)
   {System.err.println(sqlEx.getMessage());}
}
public ResultSet executeQuery(String sql)
     {   
try{
    rs = stmt.executeQuery(sql);
   }catch(SQLException ex)
{
   System.err.println("executeQuery():"+ex.getMessage());
}
return rs;
      }

   public int executeUpdate(String sql)
     {   
int i=0;
try{
    i = stmt.executeUpdate(sql);
   }catch(SQLException ex)
{
   System.err.println("executeUpdate():"+ex.getMessage());
}
return i;
     }
}

这是.java原码。

#1


我的理解
public class myjdbc{
public myjdbc(){
加载驱动,连接
}
public Resultset executeQuery(){
查询
}
public int executeUpdate(){
更新,插入,删除
}
public void close(){
关闭stmt,connection等
}
}

我还看见别人把backup、store等都加进来了,还有用到pool等,我还不太会:(

#2


其实核心就是减少客户端的负荷,力争让所有的业务逻辑都在服务器端完成。
具体如何实现,就有很多技巧可言了。

#3


可以把连接放在一个类里,把数据库的增,删,改,查放在另一个类里
这样会比较好

#4


哪位有这样的例子呢?能否发出来看看!

#5


可以先写一个与数据操作打交道的数据类,然后再写其它实现逻辑的类,需要返回页面的数据用vector之类的数据结构返回,总之,jsp仅仅是实现界面功能,逻辑应该全部封装到类里。
    如果界面交互操作十分复杂,可以考虑用severlet实现。

#6


public myjdbc(){
加载驱动,连接
}

因该改为
public myjdbc(){
去连接池中取连接;
}

#7


给你个简单的吧,两个类 ,一个是db.java ,封装最简单的操作,
一个是adduser.java 用于完成功能

//*******************************************db.java

package com.skybay;

import java.sql.*;
import java.net.*;
import java.lang.*;
import java.io.*;
import java.util.*;


public class db{

Connection conn = null;
ResultSet rs = null;

public db() {
try {
//注册数据库驱动程序为Oracle驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(java.lang.ClassNotFoundException e) {
//这样写是为了方便调试程序,出错打印mydb()就知道在什么地方出错了
System.err.println("mydb(): " + e.getMessage());
}
}

//executeQuery方法用于进行记录的查询操作

//入口参数为sql语句,返回ResultSet对象
public ResultSet executeQuery(String sql) {
rs = null;
try {
//建立数据库连接,使用Oracle的一种thin连接方式,demo为主机名字,demodb为数据库,后面的两个demo为用户名和密码
conn = DriverManager.getConnection("jdbc:odbc:skybay","","");
Statement stmt = conn.createStatement();
//执行数据库查询操作
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("db.executeQuery: " + ex.getMessage());
}
return rs;
}

//executeUpdate方法用于进行add或者update记录的操作

//入口参数为sql语句,成功返回true,否则为false
public boolean executeUpdate(String sql) {
boolean bupdate=false;
rs = null;
try {
//建立数据库连接,其它参数说明同上面的一样
conn = DriverManager.getConnection("jdbc:odbc:skybay","","");
Statement stmt = conn.createStatement();
int rowCount = stmt.executeUpdate(sql);
//如果不成功,bupdate就会返回0
if(rowCount!=0)bupdate=true;
}
catch(SQLException ex) {
//打印出错信息
System.err.println("db.executeUpdate: " + ex.getMessage());
}
return bupdate;
}


}

//****************************************************adduser.java
package com.skybay;

import java.sql.*;
import java.lang.*;

//adduser由db派生出来,拥有db的成员变量和方法
public class adduser extends db {


String name;
String password;

//构建器
/*
*************************************************************
*****添加一个新用户,若成功返回ture,否则返回false***********
*************************************************************
*/
public boolean addNewUser(){
boolean boadduser=false;
try {
//进行用户注册的记录添加操作,生成sql语句
String sSql=new String("insert into RegInfo(name,password) values('" + name + " ','" + password + "')");
//sSql=sSql+ " values(" + "aa" + "aa" + ")";
//一种调试的方法,可以打印出sql语句,以便于查看错误
System.out.println(sSql);
//调用父类的executeUpdate方法,并根据成功以否来设置返回值
if(super.executeUpdate(sSql)) boadduser=true;
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//无论是否出错,都要返回值
return boadduser;
}
}

/*
******************************************************************
***用于判断用户名和密码时候相符,若符合返回ture,否则返回false*****
******************************************************************
*/
public boolean checkUser(){
boolean boadduser=false;
try {
//构建sql查询语句
String sSql="select * from RegInfo where name='" + name + "' and password='" + password + "'";
//String sSql="select * from RegInfo";// where name='" + name + "' and password='" + password + "'";
//调用父类的executeQuery方法
if((super.executeQuery(sSql)).next()){
//查询出来的记录集为空
boadduser=true;
}else{
boadduser=false;
}
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//返回值
return boadduser;
}
}

/*
*****************************************************************************
***checkName()函数用于判断用户名是否已经存在,若存在,返回ture,否则返回fals*e
*****************************************************************************
*/
public boolean checkName(){
boolean boadduser=false;
try {
//构建sql查询语句
String sSql="select * from RegInfo where name='" + name + "'";
//String sSql="select * from RegInfo";// where name='" + name + "' and password='" + password + "'";
//调用父类的executeQuery方法
if((super.executeQuery(sSql)).next()){
//查询出来的记录集为空
boadduser=true;
}else{
boadduser=false;
}
}
catch(Exception ex) {
//出错处理
System.err.println("adduser.addNewUser: " + ex.getMessage());
}finally{
//返回值
return boadduser;
}
}

public void setName(String name) { this.name = name; }
public void setPassword(String password) { this.password= password; }

public String getName() { return name; }
public String getPassword() { return password; }

}




然后你就可以在jsp里调用这个bean了!!!

#8


怎样实现多步操作的事务控制呢?
我使用两条语句(第一条可以正确插入,第二条语句不能插入),在所有的数据库操作前,先SerAutoCommit(False),然后再执行2次数据库操作和Commit,最后再SerAutoCommit(True),但是结果却是第一条语句成功插入数据库。
整个结果好像和没有使用事务控制一个效果,为什么?

#9


...

需要做一个错误判断。
无错:Commit
有错;RollBack


#10


up

#11


up

#12


以前我写过一个软件下载站点。
就是用javabean封装数据库连接过程。
下面是例子。数据库是mysql的。
package soft;
import java.util.*;
import java.sql.*;
import java.io.*;
import java.sql.*;

public class mysql {
Connection con=null; 
Statement stmt=null;
ResultSet rs=null;

public String url="jdbc:mysql://localhost:3306/soft?useUnicode=true&characterEncoding=8859_1";

public mysql()
{
try{ 
Class.forName("org.gjt.mm.mysql.Driver");
       }catch(ClassNotFoundException e)
   {System.err.println("mysql():"+e.getMessage());
try{
con=DriverManager.getConnection(url);
stmt = con.createStatement();
       }catch(SQLException sqlEx)
   {System.err.println(sqlEx.getMessage());}
}
public ResultSet executeQuery(String sql)
     {   
try{
    rs = stmt.executeQuery(sql);
   }catch(SQLException ex)
{
   System.err.println("executeQuery():"+ex.getMessage());
}
return rs;
      }

   public int executeUpdate(String sql)
     {   
int i=0;
try{
    i = stmt.executeUpdate(sql);
   }catch(SQLException ex)
{
   System.err.println("executeUpdate():"+ex.getMessage());
}
return i;
     }
}

这是.java原码。

#13


以前我写过一个软件下载站点。
就是用javabean封装数据库连接过程。
下面是例子。数据库是mysql的。
package soft;
import java.util.*;
import java.sql.*;
import java.io.*;
import java.sql.*;

public class mysql {
Connection con=null; 
Statement stmt=null;
ResultSet rs=null;

public String url="jdbc:mysql://localhost:3306/soft?useUnicode=true&characterEncoding=8859_1";

public mysql()
{
try{ 
Class.forName("org.gjt.mm.mysql.Driver");
       }catch(ClassNotFoundException e)
   {System.err.println("mysql():"+e.getMessage());
try{
con=DriverManager.getConnection(url);
stmt = con.createStatement();
       }catch(SQLException sqlEx)
   {System.err.println(sqlEx.getMessage());}
}
public ResultSet executeQuery(String sql)
     {   
try{
    rs = stmt.executeQuery(sql);
   }catch(SQLException ex)
{
   System.err.println("executeQuery():"+ex.getMessage());
}
return rs;
      }

   public int executeUpdate(String sql)
     {   
int i=0;
try{
    i = stmt.executeUpdate(sql);
   }catch(SQLException ex)
{
   System.err.println("executeUpdate():"+ex.getMessage());
}
return i;
     }
}

这是.java原码。