逍遥一派 发表于 2015-1-18 11:32:46

JAVA教程之JSP进修――周全剖析JDBC(6)

你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。js 基于JDBC有哪些数据库通用会见办法?

  1.通用数据库Bean计划

  本实例中对数据库毗连和实行SQL语句等通用数据库操纵举行了封装,经由过程完成DBConnBean和DBQueryBean两个JavaBean来完成上述功效。个中DBConnBean卖力Java使用程序和数据库的毗连;DBQueryBean供应了一组实行尺度SQL的功效,能够完成尺度SQL完成的一切功效。其功效代码分离以下所示:

  ①DBConnBean.Java的源代码以下所示:

packagedbaccess;
importJava.sql.*;
importJava.util.*;
importJava.io.*;
publicclassDBConnBean
implementsSerializable{

privateStringDBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
privateStringDBHost="127.0.0.1";
privateStringDBName="demo";
privateStringconp="jdbc:odbc:db_demo";
privateStringusername="";
privateStringpassword="";
privatebooleanxdebug=true;

publicConnectioncon=null;

publicStringsql=null;

Statementstmt=null;
publicResultSetresult=null;
privateintaffectedRows=0;

publicDBConnBean()
{
xdebug=true;
con=null;
sql=null;
}
publicConnectionConnect()
throwsException
{
Stringmsg=null;
try
{
Class.forName(DBDriver).newInstance();
}
catch(Exceptione)
{
msg="加载数据库驱动失利";
if(xdebug)msg+="(驱动"+DBDriver+")";
thrownewException(msg);
}
try
{
StringconStr=conp;
con=DriverManager.getConnection(conStr,username,password);
}
catch(SQLExceptione)
{
msg="!!数据库毗连失利";
if(xdebug)
{
msg+="(毛病信息="+e.getMessage()+"SQL形态值="+e.getSQLState()+"毛病代码="+e.getErrorCode()+")";
}
thrownewException(msg);
}
returncon;
}
protectedvoidfinalize()
throwsThrowable
{
super.finalize();
if(stmt!=null)stmt.close();
if(result!=null)result.close();
}
//比来一次对数据库查询受影响的行数
publicintgetAffectedRows()
{
returnaffectedRows;
}
publicConnectiongetCon()
{
returncon;
}
publicStringgetConp()
{
returnconp;
}
publicStringgetDBDriver()
{
returnDBDriver;
}
publicStringgetDBName()
{
returnDBName;
}
publicbooleangetDebug()
{
returnxdebug;
}
publicStringgetPassword()
{
returnpassword;
}
publicResultSetgetResult()
{
returnresult;
}
publicStringgetSql()
{
returnsql;
}
publicStringgetUsername()
{
returnusername;
}
publicvoidover()
throwsThrowable
{
finalize();
}
publicResultSetquery()
throwsException
{
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);
}
returnresult;
}
publicResultSetquery(Strings)
throwsException
{
sql=s;
returnquery();
}
publicvoidsetDBDriver(Strings)
{
DBDriver=s;
}
publicvoidsetDebug(booleanb)
{
xdebug=b;
}
publicvoidsetgetConp(Strings)
{
conp=s;
}
publicvoidsetgetDBName(Strings)
{
DBName=s;
}
publicvoidsetgetUsername(Strings)
{
username=s;
}
publicvoidsetPassword(Strings)
{
password=s;
}
publicvoidsetSql(Strings)
{
sql=s;
}
}


②DBQueryBean.Java的源代码以下所示:
packagedbaccess;
importJava.sql.*;
importJava.util.*;
importJava.io.*;
importJava.lang.reflect.*;

publicclassDBQueryBean
implementsSerializable
{
DBConnBeandbc;
Stringsql=null;
introwcount=0;
intcolcount=0;
//intlimitcount=0;
Vectorresult=null;
publicString_WATCH="";

publicDBQueryBean()
{
dbc=newDBConnBean();
try{
dbc.Connect();
}catch(Exceptione){
handleException(e);
}
}
protectedvoidfinalize()
throwsThrowable
{
super.finalize();
if(dbc!=null)dbc.over();
if(result!=null)result.removeAllElements();
}
publicStringget(introw,intcol)
{
if(result==null||row>=result.size())returnnull;
Stringr[]=(String[])result.elementAt(row);
if(col>=Java.lang.reflect.Array.getLength(r))returnnull;
returnr;
}
publicintgetAffRows(){returndbc.getAffectedRows();}
publicintgetColumncount(){
returncolcount;
}
publicString[]getRow(introw)
{
if(result==null||row>=result.size())returnnull;
return(String[])result.elementAt(row);
/*Stringret[]=newString;
Vectorr=(Vector)result.elementAt(row);
for(inti=0;i<colcount;i++)
ret=(String)r.elementAt(i);
returnret;*/
}
publicintgetRowcount(){
returnrowcount;
}
publicvoidhandleException(Exceptione)
{
_WATCH=e.getMessage();
}
publicvoidinit()
{
rowcount=0;
colcount=0;
//limitcount=0;
result=null;
}
publicvoidover()
throwsThrowable
{
finalize();
}
publicintquery(Stringsql)
{
result=newVector();
intret=0;
try{
ResultSetrs=dbc.query(sql);
if(rs==null)
{
ret=dbc.getAffectedRows();
}
else
{
ResultSetMetaDatarm=rs.getMetaData();
colcount=rm.getColumnCount();
while(rs.next())
{
Stringrow[]=newString;
for(inti=0;i<colcount;i++)
row=rs.getString(i+1);
result.addElement(row);
rowcount++;
}
rs.close();//toreleasetheresource.
ret=result.size();
}
}
catch(Exceptione)
{
handleException(e);
return-1;
}

returnret;
}
}


  2.数据库表布局

  本实例中次要呈现了三个数据库表,表名和字段分离以下所示:

  企图推销表:jhcg_table


字段称号中文称号范例长度
Goods_no物品编号vchar10
Goods_name物品称号Vchar50
Amount推销数目Int
Price推销单价float
Gold币种Vchar15
Units单元Vchar10
Date工夫Date
Remark备注vchar100

  库存统计表:kctj_table


字段称号中文称号范例长度
Goods_no物品编号Vchar10
Goods_name物品称号Vchar50
amount库存数目Int
Date工夫Date

remark备注Vchar100

  实践推销表:sjcg_table



字段称号中文称号范例长度
Goods_no物品编号Vchar10
Goods_name物品称号Vchar50
Amount推销数目Int
PricePrice推销单价Float
Gold币种Vchar15
Units推销单元Vchar10
Date工夫Date
Remark备注vchar100

  个中营业逻辑十分复杂,即依据企图推销表和库存统计表天生实践推销表。同时,对各表完成数据库的增、删、改、查等通用操纵。

  3.JSP计划

  ①拔出操纵

  完成对数据库表的纪录拔出功效,个中企图推销表的拔出主页面(insert_jhcg.htm)为:

  insert_jhcg.htm将用户输出传送给demo_insert_jhcg.jsp,完成拔出操纵。改jsp文件的功效代码为:
<html>
<body>
<jsp:useBeanid="DBConn"class="dbaccess.DBConnBean"scope="page"/>
<jsp:useBeanid="DBBean"class="dbaccess.DBQueryBean"scope="page"/>
<hr>
<!--testJavaBean-->
<%
if(DBConn==null||DBBean==null){
out.println("JavaBeannotfound!");
return;
}
%>

<!--trydb_democonnection-->
<%
try{
DBConn.Connect();
}catch(Exceptione){
out.println(e.getMessage());
}
%>

<!--executesqlstatement-->
<%
StringinsGoodno=request.getParameter("ed_jhcg_no");
StringinsGoodname=request.getParameter("ed_jhcg_name");
intinsAmount=(Integer.valueOf(request.getParameter("ed_jhcg_amount"))).intValue();
floatinsPrice=(Float.valueOf(request.getParameter("ed_jhcg_price"))).floatValue();
StringinsGold=request.getParameter("ed_jhcg_gold");
StringinsUnit=request.getParameter("ed_jhcg_unit");
StringinsRemark=request.getParameter("ed_jhcg_remark");
StringsqlStatement="insertintojhcg_table(good_no,good_name,amount,
price,gold,unit,remark)values("+""+insGoodno+""+","+""+insGoodname+""+",
"+insAmount+","+insPrice+","+""+insGold+""+","+""+insUnit+""+","+""+
insRemark+""+")";
try{
DBBean.query(sqlStatement);
}catch(Exceptione){
out.println(e.getMessage());
}
%>
<ahref="demo_main.htm">Recordsinserted...Clickheretoreturn</a></p>
</body>
</html>


  ②查询操纵

  该查询主页面次要供应对三个数据库表的前提查询功效,

  query.htm将用户选择查询的数据库表和查询前提发送给demo_query.jsp,由jsp文件完成数据库查询操纵和查询了局集的前往及显现,其功效代码以下:
<html>
<body>
<%
StringsqlStatement;
StringsqlField="";
StringwhichTable="";
StringwhereClause="";
StringqueryNo="";
StringqueryName="";
%>
<jsp:useBeanid="DBConn"class="dbaccess.DBConnBean"scope="page"/>
<jsp:useBeanid="DBBean"class="dbaccess.DBQueryBean"scope="page"/>
<hr>
<!--testJavaBean-->
<%
if(DBConn==null||DBBean==null){
out.println("JavaBeannotfound!");
return;
}
%>

<!--trydb_democonnection-->
<%
try{
DBConn.Connect();
}catch(Exceptione){
out.println(e.getMessage());
}
%>

<!--preparesqlstatement-->
<%
StringqueryRequest=request.getParameter("rb_request");
//out.println("queryRequest:"+queryRequest);
StringwhichCB="";
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="wheregood_no="+""+queryNo+"";
if(!queryName.equals("")){
if(!queryNo.equals(""))
whereClause+="andgood_name="+""+queryName+"";
elsewhereClause="wheregood_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="wheregood_no="+""+queryNo+"";
if(!queryName.equals("")){
if(!queryNo.equals(""))
whereClause+="andgood_name="+""+queryName+"";
elsewhereClause="wheregood_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="wheregood_no="+""+queryNo+"";
if(!queryName.equals("")){
if(!queryNo.equals(""))
whereClause+="andgood_name="+""+queryName+"";
elsewhereClause="wheregood_name="+""+queryName+"";
}

}
String[]printTitle=request.getParameterValues(whichCB);

%>
<!--createquerysqlstatement-->
<%
sqlStatement="select";
for(inti=0;i<printTitle.length;i++){
sqlField+=printTitle+",";
}
sqlStatement+=sqlField.substring(0,sqlField.length()-1)+"from"+whichTable;
if(!whereClause.equals(""))
sqlStatement+=whereClause;
%>
<!--showqueryresponse-->
<%
try{
DBBean.query(sqlStatement);
}catch(Exceptione){
out.println("DatabaseError!");
}
introws=DBBean.getRowcount();
intcols=DBBean.getColumncount();
%>
<Tablealign="center"width="80%"border=1>
<tralign=center>
<%
for(inti=0;i<printTitle.length;i++){
out.println("<td><b>");
out.println(printTitle);
out.println("</b></td>");
}
%>
</tr>
<%
for(inti=0;i<rows;i++){
out.println("<tr>");
for(intj=0;j<cols;j++)
out.println("<td>"+DBBean.get(i,j)+"</td>");
out.println("</tr>");
}
%>
</Table>
<br>
<hr>
<ahref="demo_main.htm">Clickheretoreturn</a></p>
</body>
</html>


  ③天生实践推销表

  天生数据库表是一个隐式操纵,程序依据企图推销表和库存统计表的响应字段天生实践推销表,不必要用户的任何输出,其功效代码以下(demo_create.jsp):


<%@pageimport="Java.util.*"%>
<html>
<body>
<jsp:useBeanid="DBConn"class="dbaccess.DBConnBean"scope="page"/>
<jsp:useBeanid="DBBean"class="dbaccess.DBQueryBean"scope="page"/>
<hr>
<!--testJavaBean-->
<%
if(DBConn==null||DBBean==null){
out.println("JavaBeannotfound!");
return;
}
%>

<!--trydb_democonnection-->
<%
try{
DBConn.Connect();
}catch(Exceptione){
out.println(e.getMessage());
}
%>

<!--preparesqlstatement-->
<%
intamount_jhcg,amount_kctj;
VectorupdateRs=newVector();
DBBean.query("delete*fromsjcg_table");//deletealloldrecordsinsjcg_table
DBBean.query("selectjhcg_table.good_no,jhcg_table.good_name,jhcg_table.amount,kctj_table.amount,jhcg_table.unitfromjhcg_tableleftjoinkctj_tableonkctj_table.good_no=jhcg_table.good_no");
introws=DBBean.getRowcount();
intcols=DBBean.getColumncount();
for(inti=0;i<rows;i++){
Stringrecord[]=newString;
record=DBBean.get(i,0);
record=DBBean.get(i,1);
amount_jhcg=(Integer.valueOf(DBBean.get(i,2))).intValue();
if(DBBean.get(i,3)==null)amount_kctj=0;
elseamount_kctj=(Integer.valueOf(DBBean.get(i,3))).intValue();
record=Integer.toString(amount_jhcg-amount_kctj);
record=DBBean.get(i,4);
updateRs.addElement(record);
}
for(inti=0;i<rows;i++){
StringinsRecord[]=(String[])updateRs.elementAt(i);
StringinsGoodno,insGoodname,insUnit,insAmount;
insGoodno=insRecord;
insGoodname=insRecord;
insAmount=insRecord;
insUnit=insRecord;
StringsqlStatement="insertintosjcg_table(good_no,good_name,amount,unit)values?quot;+""+insGoodno+""+","+""+insGoodname+""+","+insAmount+","+""+insUnit+""+")";
DBBean.query(sqlStatement);
DBBean.query("delete*fromsjcg_tablewhereamount<=0");
}
%>
<ahref="demo_main.htm">Databasecreated...Clickheretoreturn</a></p>
</body>
</html>


  上述的开辟工具综合使用先容了基于Java开辟电子商务使用体系的全历程,包含使用开辟平台搭建、营业流程剖析、JavaBean封装和JSP开辟等外容,个中JSP开辟中触及到了通用SQL(查询和拔出数据库表)和游标操纵(天生实践推销表),基础能够完成任何收集数据库使用的需求。本实例基础上能够将后面先容的基于Java的电子商务开辟手艺串接起来,引导读者举行电子商务使用开辟。



没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之!

小女巫 发表于 2015-1-21 09:52:27

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

飘飘悠悠 发表于 2015-1-25 15:55:03

Java 编程语言的风格十分接近C、C++语言。

变相怪杰 发表于 2015-1-30 23:22:28

是一种使用者不需花费很多时间学习的语言

分手快乐 发表于 2015-2-6 16:39:26

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

不帅 发表于 2015-3-5 17:40:04

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

金色的骷髅 发表于 2015-3-7 21:25:22

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

莫相离 发表于 2015-3-8 10:46:02

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

深爱那片海 发表于 2015-3-11 06:22:08

是一种将安全性(Security)列为第一优先考虑的语言

灵魂腐蚀 发表于 2015-3-13 00:10:40

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

飘灵儿 发表于 2015-3-16 08:19:55

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

愤怒的大鸟 发表于 2015-3-22 21:18:23

你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。

再现理想 发表于 2015-4-8 19:52:10

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

因胸联盟 发表于 2015-4-21 15:53:17

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

第二个灵魂 发表于 2015-4-22 04:25:38

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

精灵巫婆 发表于 2015-5-11 15:39:41

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

只想知道 发表于 2015-6-4 04:00:47

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

老尸 发表于 2015-6-10 15:46:03

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

兰色精灵 发表于 2015-6-12 19:43:39

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

仓酷云 发表于 2015-6-20 17:02:28

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
页: [1]
查看完整版本: JAVA教程之JSP进修――周全剖析JDBC(6)