基于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的电子商务开发技术串接起来,指导读者进行电子商务应用开发。