jsp servlet mysql封装,JSP学习——全面解析JDBC(6)-JSP教程,Jsp/Servlet

  • Post author:
  • Post category:mysql


基于jdbc有哪些数据库通用访问方法?

1. 通用数据库bean设计

本实例中对数据库连接和执行sql语句等通用数据库操作进行了封装,通过实现dbconnbean和dbquerybean两个javabean来完成上述功能。其中dbconnbean负责java应用程序和数据库的连接;dbquerybean提供了一组执行标准sql的功能,可以实现标准sql完成的所有功能。其功能代码分别如下所示:

① dbconnbean.java的源代码如下所示:

package dbaccess;

import java.sql.*;

import java.util.*;

import java.io.*;

public class dbconnbean

implements serializable{

private string dbdriver = “sun.jdbc.odbc.jdbcodbcdriver”;

private string dbhost = “127.0.0.1”;

private string dbname = “demo”;

private string conp = “jdbc:odbc:db_demo”;

private string username = “”;

private string password = “”;

private boolean xdebug = true;

public connection con = null;

public string sql = null;

statement stmt = null;

public resultset result = null;

private int affectedrows = 0;

public dbconnbean()

{

xdebug = true;

con = null;

sql = null;

}

public connection connect()

throws exception

{

string msg = null;

try

{

class.forname(dbdriver).newinstance();

}

catch(exception e)

{

msg = “加载数据库驱动失败”;

if (xdebug) msg += “(驱动”+dbdriver+”)”;

throw new exception(msg);

}

try

{

string constr = conp;

con = drivermanager.getconnection(constr,username,password);

}

catch(sqlexception e)

{

msg = “!!数据库连接失败”;

if (xdebug)

{

msg += “(错误信息=” + e.getmessage()+” sql状态值=” + e.getsqlstate()+” 错误代码=” + e.geterrorcode()+”)”;

}

throw new exception(msg);

}

return con;

}

protected void finalize()

throws throwable

{

super.finalize();

if (stmt != null) stmt.close();

if (result != null) result.close();

}

//最近一次对数据库查询受影响的行数

public int getaffectedrows()

{

return affectedrows;

}

public connection getcon()

{

return con;

}

public string getconp()

{

return conp;

}

public string getdbdriver()

{

return dbdriver;

}

public string getdbname()

{

return dbname;

}

public boolean getdebug()

{

return xdebug;

}

public string getpassword()

{

return password;

}

public resultset getresult()

{

return result;

}

public string getsql()

{

return sql;

}

public string getusername()

{

return username;

}

public void over()

throws throwable

{

finalize();

}

public resultset query()

throws exception

{

result = null;

affectedrows = 0;

if (con == null)

connect();

if (stmt == null)

stmt = con.createstatement();

if (sql.substring(0,6).equalsignorecase(“select”))

{

result = stmt.executequery(sql);

}

else

{

affectedrows = stmt.executeupdate(sql);

}

return result;

}

public resultset query(string s)

throws exception

{

sql = s;

return query();

}

public void setdbdriver(string s)

{

dbdriver = s;

}

public void setdebug(boolean b)

{

xdebug = b;

}

public void setgetconp(string s)

{

conp = s;

}

public void setgetdbname(string s)

{

dbname = s;

}

public void setgetusername(string s)

{

username = s;

}

public void setpassword(string s)

{

password = s;

}

public void setsql(string s)

{

sql = s;

}

}

② dbquerybean.java的源代码如下所示:

package dbaccess;

import java.sql.*;

import java.util.*;

import java.io.*;

import java.lang.reflect.*;

public class dbquerybean

implements serializable

{

dbconnbean dbc;

string sql = null;

int rowcount = 0;

int colcount = 0;

// int limitcount = 0;

vector result = null;

public string _watch = “”;

public dbquerybean()

{

dbc = new dbconnbean();

try {

dbc.connect();

} catch(exception e) {

handleexception(e);

}

}

protected void finalize()

throws throwable

{

super.finalize();

if (dbc != null) dbc.over();

if (result != null) result.removeallelements();

}

public string get(int row, int col)

{

if (result==null || row >= result.size()) return null;

string r[] = (string[])result.elementat(row);

if (col >= java.lang.reflect.array.getlength(r)) return null;

return r[col];

}

public int getaffrows() { return dbc.getaffectedrows(); }

public int getcolumncount() {

return colcount;

}

public string[] getrow(int row)

{

if (result==null || row >= result.size()) return null;

return (string [])result.elementat(row);

/*string ret[] = new string[colcount];

vector r = (vector)result.elementat(row);

for (int i=0; i<colcount; i++)

ret[i] = (string)r.elementat(i);

return ret;*/

}

public int getrowcount() {

return rowcount;

}

public void handleexception(exception e)

{

_watch = e.getmessage();

}

public void init()

{

rowcount = 0;

colcount = 0;

// limitcount = 0;

result = null;

}

public void over()

throws throwable

{

finalize();

}

public int query(string sql)

{

result = new vector();

int ret = 0;

try {

resultset rs = dbc.query(sql);

if (rs == null)

{

ret = dbc.getaffectedrows();

}

else

{

resultsetmetadata rm = rs.getmetadata();

colcount = rm.getcolumncount();

while (rs.next())

{

string row[] = new string[colcount];

for (int i=0; i<colcount; i++)

row[i] = rs.getstring(i+1);

result.addelement(row);

rowcount++;

}

rs.close(); // to release the resource.

ret = result.size();

}

}

catch(exception e)

{

handleexception(e);

return -1;

}

return ret;

}

}

2. 数据库表结构

本实例中主要出现了三个数据库表,表名和字段分别如下所示:

计划采购表:jhcg_table

字段名称 中文名称 类型 长度

goods_no 物品编号 vchar 10

goods_name 物品名称 vchar 50

amount 采购数量 int

price 采购单价 float

gold 币种 vchar 15

units 单位 vchar 10

date 时间 date

remark 备注 vchar 100

库存统计表:kctj_table

字段名称 中文名称 类型 长度

goods_no 物品编号 vchar 10

goods_name 物品名称 vchar 50

amount 库存数量 int

date 时间 date

remark 备注 vchar 100

实际采购表:sjcg_table

字段名称 中文名称 类型 长度

goods_no 物品编号 vchar 10

goods_name 物品名称 vchar 50

amount 采购数量 int

price price 采购单价 float

gold 币种 vchar 15

units 采购单位 vchar 10

date 时间 date

remark 备注 vchar 100

其中业务逻辑非常简单,即根据计划采购表和库存统计表生成实际采购表。同时,对各表完成数据库的增、删、改、查等通用操作。

3. jsp设计

① 插入操作

完成对数据库表的记录插入功能,其中计划采购表的插入主页面(insert_jhcg.htm)为:

insert_jhcg.htm将用户输入传送给demo_insert_jhcg.jsp,完成插入操作。改jsp文件的功能代码为:

<html>

<body>

<jsp:usebean id=”dbconn” class=”dbaccess.dbconnbean” scope=”page”/>

<jsp:usebean id=”dbbean” class=”dbaccess.dbquerybean” scope=”page”/>

<hr>

<!–test javabean–>

<%

if (dbconn == null||dbbean == null){

out.println(“javabean not found!”);

return;

}

%>

<!–try db_demo connection–>

<%

try{

dbconn.connect();

}catch(exception e){

out.println(e.getmessage());

}

%>

<!–execute sql statement–>

<%

string insgoodno = request.getparameter(“ed_jhcg_no”);

string insgoodname = request.getparameter(“ed_jhcg_name”);

int insamount = (integer.valueof(request.getparameter(“ed_jhcg_amount”))).intvalue();

float insprice = (float.valueof(request.getparameter(“ed_jhcg_price”))).floatvalue();

string insgold = request.getparameter(“ed_jhcg_gold”);

string insunit = request.getparameter(“ed_jhcg_unit”);

string insremark = request.getparameter(“ed_jhcg_remark”);

string sqlstatement = “insert into jhcg_table(good_no,good_name,amount,

price,gold,unit,remark) values(“+””+insgoodno+””+”,”+””+insgoodname+””+”,

“+insamount+”,”+insprice+”,”+””+insgold+””+”,”+””+insunit+””+”,”+””+

insremark+””+”)”;

try{

dbbean.query(sqlstatement);

}catch(exception e){

out.println(e.getmessage());

}

%>

<a href=”demo_main.htm”>records inserted…click here to return</a></p>

</body>

</html>

② 查询操作

该查询主页面主要提供对三个数据库表的条件查询功能,

query.htm将用户选择查询的数据库表和查询条件发送给demo_query.jsp,由jsp文件完成数据库查询操作和查询结果集的返回及显示,其功能代码如下:

<html>

<body>

<%

string sqlstatement;

string sqlfield = “”;

string whichtable = “”;

string whereclause = “”;

string queryno = “”;

string queryname = “”;

%>

<jsp:usebean id=”dbconn” class=”dbaccess.dbconnbean” scope=”page”/>

<jsp:usebean id=”dbbean” class=”dbaccess.dbquerybean” scope=”page”/>

<hr>

<!–test javabean–>

<%

if (dbconn == null||dbbean == null){

out.println(“javabean not found!”);

return;

}

%>

<!–try db_demo connection–>

<%

try{

dbconn.connect();

}catch(exception e){

out.println(e.getmessage());

}

%>

<!–prepare sql statement–>

<%

string queryrequest = request.getparameter(“rb_request”);

//out.println(“queryrequest:”+queryrequest);

string whichcb = “”;

if (queryrequest.equals(“1”)){

whichcb = “ck_jhcg”;

whichtable = “jhcg_table”;

queryno = request.getparameter(“ed_jhcg_no”);

queryname = request.getparameter(“ed_jhcg_name”);

if (!queryno.equals(“”))

whereclause = ” where good_no=”+””+queryno+””;

if (!queryname.equals(“”)){

if (!queryno.equals(“”))

whereclause += ” and good_name=”+””+queryname+””;

else whereclause = ” where good_name=”+””+queryname+””;

}

}

if (queryrequest.equals(“2”)){

whichcb = “ck_kctj”;

whichtable = “kctj_table”;

queryno = request.getparameter(“ed_kctj_no”);

queryname = request.getparameter(“ed_kctj_name”);

if (!queryno.equals(“”))

whereclause = ” where good_no=”+””+queryno+””;

if (!queryname.equals(“”)){

if (!queryno.equals(“”))

whereclause += ” and good_name=”+””+queryname+””;

else whereclause = ” where good_name=”+””+queryname+””;

}

}

if (queryrequest.equals(“3”)){

whichcb = “ck_sjcg”;

whichtable = “sjcg_table”;

queryno = request.getparameter(“ed_sjcg_no”);

queryname = request.getparameter(“ed_sjcg_name”);

if (!queryno.equals(“”))

whereclause = ” where good_no=”+””+queryno+””;

if (!queryname.equals(“”)){

if (!queryno.equals(“”))

whereclause += ” and good_name=”+””+queryname+””;

else whereclause = ” where good_name=”+””+queryname+””;

}

}

string[] printtitle = request.getparametervalues(whichcb);

%>

<!–create query sql statement–>

<%

sqlstatement = “select “;

for(int i = 0;i<printtitle.length;i++){

sqlfield += printtitle[i]+”,”;

}

sqlstatement += sqlfield.substring(0,sqlfield.length()-1)+” from “+whichtable;

if (!whereclause.equals(“”))

sqlstatement += whereclause;

%>

<!–show query response–>

<%

try{

dbbean.query(sqlstatement);

}catch(exception e){

out.println(“database error!”);

}

int rows = dbbean.getrowcount();

int cols = dbbean.getcolumncount();

%>

<table align=”center” width=”80%” border=1>

<tr align=center>

<%

for(int i = 0;i < printtitle.length;i++){

out.println(“<td><b>”);

out.println(printtitle[i]);

out.println(“</b></td>”);

}

%>

</tr>

<%

for (int i = 0;i < rows;i++){

out.println(“<tr>”);

for (int j = 0;j < cols;j++)

out.println(“<td>”+dbbean.get(i,j)+”</td>”);

out.println(“</tr>”);

}

%>

</table>

<br>

<hr>

<a href=”demo_main.htm”>click here to return</a></p>

</body>

</html>

③ 生成实际采购表

生成数据库表是一个隐式操作,程序根据计划采购表和库存统计表的相应字段生成实际采购表,不需要用户的任何输入,其功能代码如下(demo_create.jsp):

<%@page import=”java.util.*”%>

<html>

<body>

<jsp:usebean id=”dbconn” class=”dbaccess.dbconnbean” scope=”page”/>

<jsp:usebean id=”dbbean” class=”dbaccess.dbquerybean” scope=”page”/>

<hr>

<!–test javabean–>

<%

if (dbconn == null||dbbean == null){

out.println(“javabean not found!”);

return;

}

%>

<!–try db_demo connection–>

<%

try{

dbconn.connect();

}catch(exception e){

out.println(e.getmessage());

}

%>

<!–prepare sql statement–>

<%

int amount_jhcg,amount_kctj;

vector updaters = new vector();

dbbean.query(“delete * from sjcg_table”); //delete all old records in sjcg_table

dbbean.query(“select jhcg_table.good_no,jhcg_table.good_name,jhcg_table.amount,kctj_table.amount,jhcg_table.unit from jhcg_table left join kctj_table on kctj_table.good_no=jhcg_table.good_no”);

int rows = dbbean.getrowcount();

int cols = dbbean.getcolumncount();

for (int i = 0;i < rows;i++){

string record[] = new string[4];

record[0] = dbbean.get(i,0);

record[1] = dbbean.get(i,1);

amount_jhcg = (integer.valueof(dbbean.get(i,2))).intvalue();

if (dbbean.get(i,3) == null) amount_kctj = 0;

else amount_kctj = (integer.valueof(dbbean.get(i,3))).intvalue();

record[2] = integer.tostring(amount_jhcg – amount_kctj);

record[3] = dbbean.get(i,4);

updaters.addelement(record);

}

for (int i = 0;i < rows;i++){

string insrecord[] = (string [])updaters.elementat(i);

string insgoodno,insgoodname,insunit,insamount;

insgoodno = insrecord[0];

insgoodname = insrecord[1];

insamount = insrecord[2];

insunit = insrecord[3];

string sqlstatement = “insert into sjcg_table(good_no,good_name,amount,unit) values?quot;+””+insgoodno+””+”,”+””+insgoodname+””+”,”+insamount+”,”+””+insunit+””+”)”;

dbbean.query(sqlstatement);

dbbean.query(“delete * from sjcg_table where amount<=0”);

}

%>

<a href=”demo_main.htm”>database created…click here to return</a></p>

</body>

</html>

上述的开发工具综合应用介绍了基于java开发电子商务应用系统的全过程,包括应用开发平台搭建、业务流程分析、javabean封装和jsp开发等内容,其中jsp开发中涉及到了通用sql(查询和插入数据库表)和游标操作(生成实际采购表),基本可以完成任何网络数据库应用的需求。本实例基本上可以将前面介绍的基于java的电子商务开发技术串接起来,指导读者进行电子商务应用开发。