??xml version="1.0" encoding="utf-8" standalone="yes"?>
首先是后台的javabeanE序如下所C:
index.jsp
300000000,武汉,420101,230,A304,A211,4700
//以下代码仅适合本h的例子,具体情况具体而定
文g上传在web应用中非常普遍,要在servlet/jsp环境中实现文件上传功能非常容易,因ؓ|上已经有许多用java开发的lg用于文g上传Q本文以commons-fileuploadlgZQؓservlet/jsp应用d文g上传功能?/font>
common-fileuploadlg是apache的一个开源项目之一Q可以从
http://jakarta.apache.org/commons/fileupload/
下蝲。该lg单易用,可实Cơ上传一个或多个文gQƈ可限制文件大?/font>
下蝲后解压zip包,commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自徏目录?/font>
新徏一个servlet: Upload.java用于文g上传Q?/font>
~译该servletQ注意要指定classpathQ确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar?/font>
配置servletQ用C本打开tomcat\webapps\你的webapp\WEB-INF\web.xmlQ没有的话新Z个。典型配|如下:
注意action="fileupload"其中fileupload是配|servlet时指定的url-pattern?br />
]]>
]]>
]]>
]]>
]]>
]]>
]]>
<%
@ page language
=
"
java
"
import
=
"
java.util.*
"
pageEncoding
=
"
GB2312
"
%>
<%
@ taglib uri
=
"
http://jsptags.com/tags/navigation/pager
"
prefix
=
"
pg
"
%>
<%
request.setCharacterEncoding(
"
GB2312
"
);
%>
<
jsp:useBean id
=
"
pm
"
scope
=
"
page
"
class
=
"
net.jf.ajax.business.PageManager
"
/>
<!
DOCTYPE HTML PUBLIC
"
-//W3C//DTD HTML 4.01 Transitional//EN
"
>
<
html
>
<
head
>
</
head
>
<
body
>
<
form name
=
"
cc
"
action
=
"
page1.jsp
"
method
=
"
post
"
>
<
input type
=
"
text
"
name
=
"
name
"
value
=
"
<%=request.getParameter(
"
name
"
)%>
"
/>
<
input type
=
"
submit
"
value
=
"
search
"
/>
</
form
>
<
pg:pager
items
=
"
<%= pm.getSize(request.getParameter(
"
name
"
)) %>
"
index
=
"
center
"
maxPageItems
=
"
3
"
maxIndexPages
=
"
0
"
scope
=
"
request
"
>
<%
int
pageNum
=
1
;
if
(request.getParameter(
"
pageNo
"
)
!=
null
)
pageNum
=
Integer.valueOf(request.getParameter(
"
pageNo
"
));
int
pageSize
=
3
;
List result
=
pm.query(pageNum,pageSize,request.getParameter(
"
name
"
));
%>
<
table border
=
"
1
"
>
<
tr
>
<
td
>
result
</
td
>
</
tr
>
<%
for
(
int
i
=
0
; i
<
result.size(); i
++
) {
%>
<
tr
>
<
td
>
<%=
result.get(i)
%>
</
td
>
</
tr
>
<%
}
%>
</
table
>
<
pg:param name
=
"
name
"
/>
<
pg:index
>
<
jsp:include page
=
"
jsptags.jsp
"
flush
=
"
true
"
/>
</
pg:index
>
</
pg:pager
>
</
body
>
</
html
>
<%
@ taglib uri
=
"
http://jsptags.com/tags/navigation/pager
"
prefix
=
"
pg
"
%>
<
pg:first
>
<
a href
=
"
<%=pageUrl %>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ #
<%=
pageNumber
%>
首页 ]
</
nobr
></
a
>
</
pg:first
>
<
pg:skip pages
=
"
<%= -5 %>
"
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ #
<%=
pageNumber
%>
后退 ]
</
nobr
></
a
>
</
pg:skip
>
<
pg:prev
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ #
<%=
pageNumber
%>
前一 ]
</
nobr
></
a
>
</
pg:prev
>
<
pg:pages
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><%=
pageNumber
%></
a
>
</
pg:pages
>
<
pg:next
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ 下一?
<%=
pageNumber
%>
]
</
nobr
></
a
>
</
pg:next
>
<
pg:skip pages
=
"
<%=5%>
"
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ 跌 #
<%=
pageNumber
%>
]
</
nobr
></
a
>
</
pg:skip
>
<
pg:last
>
<
a href
=
"
<%=pageUrl%>&pageNo=<%=pageNumber%>
"
><
nobr
>
[ N #
<%=
pageNumber
%>
]
</
nobr
></
a
>
</
pg:last
>
]]>
作? gongshi1919 发表日期: 2006-04-08 21:59 文章属?
转蝲
复制链接
Java的数据库q接~程QJDBCQ技?br />
[本讲的知识要点]QJDBC、JDBC的工作原理,讉K数据库的Ҏ、Statement、PreparedStatement、CallableStatementQResultSet{对象的~程使用
9.1 基本知识
9.1.1 JDBCQJava DataBase ConnectivityQJava 数据库连接技术)Q它是将Java与SQLl合且独立于特定的数据库pȝ的应用程序编E接口(API--它是一U可用于执行SQL语句的Java APIQ即׃l用Java语言~写的类与接口所l成Q?br />
有了JDBC从而可以JavaE序员用Java语言来编写完整的数据库方面的应用E序。另外也可以操作保存在多U不同的数据库管理系l中的数据,而与数据库管理系l中数据存储格式无关。同时Java语言的与q_的无x,不必在不同的pȝq_下编写不同的数据库应用程序?
9.1.2 JDBC设计的目?br />
Q?QODBCQ微软的ODBC是用C~写的,而且只适用于Windowsq_Q无法实现跨q_地操作数据库?br />
Q?QSQL语言QSQL管包含有数据定义、数据操作、数据管理等功能Q但它ƈ不是一个完整的~程语言Q而且不支持流控制Q需要与其它~程语言盔R合用?br />
Q?QJDBC的设计:׃Java语言h健壮性、安全、易使用q自动下载到|络{方面的优点Q因此如果采用Java语言来连接数据库Q将能克服ODBC局限于某一pȝq_的缺PSQL语言与Java语言怺l合hQ可以实现连接不同数据库pȝQ即使用JDBC可以很容易地把SQL语句传送到M关系型数据库中?br />
Q?QJDBC设计的目的:它是一U规范,设计出它的最主要的目的是让各个数据库开发商为JavaE序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用E序的开发成为可能(数据库改变,驱动E序跟着改变Q但应用E序不变Q?br />
9.1.3 JDBC的主要功能:Q?Q创Z数据库的q接Q(2Q发送SQL语句CQ何关pd数据库中;Q?Q处理数据ƈ查询l果?br />
~程实例Q?br />
try
{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //Q?Q创Z数据库的q接
Connection con=DriverManager.getConnection("jdbc:odbc:DatabaseDSN","Login","Password");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from DBTableName");//Q?Q发送SQL语句到数据库?
while(rs.next())
{ String name=rs.getString("Name") ; //Q?Q处理数据ƈ查询l果?br />
int age=rs.getInt("age");
float wage=rs.getFloat("wage");
}
rs.close(); //Q?Q关?br />
stmt.close();
con.close();
}
catch(SQLException e)
{ System.out.println("SQLState:"+ e.getSQLState());
System.out.println("Message:" + e.getMessage());
System.out.println("Vendor:" + e.getErrorCode());
}
9.1.4 JDBC与ODBC的对比,从而体会JDBC的特?br />
Q?QODBC是用C语言~写的,不是面向对象的;而JDBC是用Java~写的,是面向对象的?br />
Q?QODBC难以学习Q因为它把简单的功能与高U功能组合在一P即便是简单的查询也会带有复杂的Q选项Q而JDBC的设计得简单的事情用简单的做法来完成?br />
Q?QODBC是局限于某一pȝq_的,而JDBC提供Java与^台无关的解决Ҏ?br />
Q?Q但也可以通过Java来操作ODBCQ这可以采用JDBc-ODBC桥接方式来实玎ͼ因ؓJava不能直接使用ODBCQ即在Java中用本地C的代码将带来安全~陷Q?br />
9.1.5 JDBC驱动E序的类? 目前比较常见的JDBC驱动E序可分Z下四个种c:
Q?QJDBC-ODBC桥加ODBC驱动E序
JavaSoft桥品利用ODBC驱动E序提供JDBC讉K。注意,必须ODBC二进制代码(许多情况下还包括数据库客h代码Q加载到使用该驱动程序的每个客户Z。因此,q种cd的驱动程序最适合于企业网Q这U网l上客户机的安装不是主要问题Q,或者是用Java~写的三层结构的应用E序服务器代码?br />
JDBC-ODBC 桥接方式利用微Y的开放数据库互连接口(ODBC API)同数据库服务器通讯Q客L计算机首先应该安装ƈ配置ODBC driver 和JDBC-ODBC bridge两种驱动E序?br />
Q?Q本地API
q种cd的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动E序一Pq种cd的驱动程序要求将某些二进制代码加载到每台客户Z?br />
q种驱动方式数据库厂商的特D协议{换成Java代码及二q制cȝQJava 数据库客h与数据库服务器方通信。例如:Oracle用SQLNet协议,DB2用IBM 的数据库协议。数据库厂商的特D协议也应该被安装在客户Z?br />
Q?QJDBC|络UJava驱动E序
q种驱动E序JDBC转换ZDBMS无关的网l协议,之后q种协议又被某个服务器{换ؓ一UDBMS协议。这U网l服务器中间件能够将它的UJava客户接到多种不同的数据库上。所用的具体协议取决于提供者。通常Q这是最为灵zȝJDBC驱动E序。有可能所有这U解x案的提供者都提供适合于Intranet用的产品。ؓ了ɘq些产品也支持Internet讉KQ它们必d理Web所提出的安全性、通过防火墙的讉K{方面的额外要求。几家提供者正JDBC驱动E序加到他们现有的数据库中间件品中?br />
q种方式是纯Java driver。数据库客户以标准网l协?如HTTP、SHTTP)同数据库讉K服务器通信Q数据库讉K服务器然后翻译标准网l协议成为数据库厂商的专有特D数据库讉K协议(也可能用到ODBC driver)与数据库通信。对Internet 和Intranet 用户而言q是一个理想的解决Ҏ。Java driver 被自动的Q以透明的方式随Applets自Web服务器而下载ƈ安装在用L计算Z?br />
Q?Q本地协议纯Java驱动E序
q种cd的驱动程序将JDBC调用直接转换为DBMS所使用的网l协议。这允总客户机机器上直接调用DBMS服务器,是Intranet讉K的一个很实用的解x法?br />
q种方式也是UJava driver。数据库厂商提供了特D的JDBC协议使Java数据库客户与数据库服务器通信。然而,把代理协议同数据库服务器通信改用数据库厂商的ҎJDBC driver。这对Intranet 应用是高效的Q可是数据库厂商的协议可能不被防火墙支持Q缺乏防火墙支持在Internet 应用中会存在潜在的安全隐患?br />
9.2 JDBC的工作原?br />
JDBC的设计基于X/Open SQL CLIQ调用接口Q这一模型。它通过定义Zl?API对象和方法以用于同数据库q行交互?br />
在JavaE序中要操作数据库,一般应该通过如下几步Q利用JDBC讉K数据库的~程步骤Q:
Q?Q加载连接数据库的驱动程?Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Q?Q创Z数据源的q接
String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url,"Login","Password");
Q?Q查询数据库Q创建Statement对象q执行SQL语句以返回一个ResultSet对象?br />
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from DBTableName");
Q?Q获得当前记录集中的某一记录的各个字D늚?br />
String name=rs.getString("Name");
int age=rs.getInt("age");
float wage=rs.getFloat("wage");
Q?Q关闭查询语句及与数据库的连接(注意关闭的顺序先rs再stmt最后ؓconQ?br />
rs.close();
stmt.close();
con.close();
9.3 JDBC的结?br />
JDBC主要包含两部分:面向JavaE序员的JDBC API及面向数据库厂商的JDBC Drive API?br />
Q?Q面向JavaE序员的JDBC APIQJavaE序员通过调用此API从而实现连接数据库、执行SQL语句q返回结果集{编E数据库的能力,它主要是׃pd的接口定义所构成?br />
java.sql.DriveManagerQ该接口主要定义了用来处理装载驱动程序ƈ且ؓ创徏新的数据库连接提供支持?br />
java.sql.ConnectionQ该接口主要定义了实现对某一U指定数据库q接的功能?br />
java.sql.StatementQ该接口主要定义了在一个给定的q接中作为SQL语句执行声明的容器以实现Ҏ据库的操作。它主要包含有如下的两种子类型?br />
java.sql.PreparedStatementQ该接口主要定义了用于执行带或不?IN 参数的预~译 SQL 语句?br />
java.sql.CallableStatementQ该接口主要定义了用于执行数据库的存储过E的雕用?br />
java.sql.ResultSetQ该接口主要定义了用于执行对数据库的操作所q回的结果集?br />
Q?Q面向数据库厂商的JDBC Drive APIQ数据库厂商必须提供相应的驱动程序ƈ实现JDBC API所要求的基本接口(每个数据库系l厂商必L供对DriveManager、Connection、Statement、ResultSet{接口的具体实现Q,从而最l保证JavaE序员通过JDBC实现对不同的数据库操作?br />
9.4 数据库应用的模型
Q?Q两层结构(C/SQ:在此模型下,客户端的E序直接与数据库服务器相q接q发送SQL语句Q但q时需要在客户端安装被讉K的数据库的JDBC驱动E序Q,DBMS服务器向客户q回相应的结果,客户E序负责Ҏ据的格式化?br />
client? ODBC/JDBC Server端(DBMSQ?br />
或数据库专用协议
主要的缺点:受数据库厂商的限Ӟ用户更换数据库时需要改写客L序;受数据库版本的限Ӟ数据库厂商一旦升U数据库Q用该数据库的客户E序需要重新编译和发布Q对数据库的操作与处理都是在客户E序中实玎ͼ使客L序在~程与设计时较ؓ复杂?br />
Q?Q三Q或多)层结构(B/SQ:在此模型下,主要在客L的程序与数据库服务器之间增加了一个中间服务器Q可以采用C++或Java语言来编E实玎ͼQ隔dL的程序与数据库服务器。客L的程序(可以单ؓ通用的浏览器Q与中间服务器进行通信Q然后由中间服务器处理客LE序的请求ƈ理与数据库服务器的q接?br />
客户端程?HTTP RMI CORBA 中间服务? JDBC 数据库服务器
9.5 通过JDBC 实现Ҏ据库的访?br />
Q?Q引用必要的?br />
import java.sql.*; //它包含有操作数据库的各个cM接口
Q?Q加载连接数据库的驱动程序类
为实C特定的数据库相连接,JDBC必须加蝲相应的驱动程序类。这通常可以采用Class.forName()Ҏ昑ּ地加载一个驱动程序类Q由驱动E序负责向DriverManager登记注册q在与数据库相连接时QDriverManager用此驱动E序?br />
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
注意Q这条语句直接加载了sun公司提供的JDBC-ODBC Bridge驱动E序cR?br />
Q?Q创Z数据源的q接
String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url,"Login","Password");
注意Q采用DriverManagercM的getConnection()Ҏ实现与url所指定的数据源建立q接q返回一个Connectioncȝ对象Q以后对q个数据源的操作都是Z该Connectioncd象;但对于Access{小型数据库Q可以不用给出用户名与密码?br />
String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url);
System.out.println(con.getCatalog()); //取得数据库的完整路径及文件名
JDBC借用了url语法来确定全球的数据库(数据库URLcM于通用的URLQ,对由url所指定的数据源的表C格式ؓ
jdbc::[ database locator]
jdbc---指出要用JDBC
subprotocal---定义驱动E序cd
database locator---提供|络数据库的位置和端口号(包括L名、端口和数据库系l名{? jdbc:odbc://host.domain.com:port/databasefile
d议jdbc 驱动E序cd为odbcQ它指明JDBC理器如何访问数据库Q该例指名ؓ采用JDBC-ODBC桥接方式Q其它ؓ数据库的位置表示?
例如Q装载mySQL JDBC驱动E序
Class.forName("org.gjt.mm.mysql.Driver ");
String url
="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//testDBZ的数据库?
Connection conn= DriverManager.getConnection(url);
例如Q装载Oracle JDBC OCI驱动E序Q用thin模式Q?br />
Class.forName("oracle.jdbc.driver.OracleDriver ");
String url="jdbc:oracle:thin:@localhost:1521:orcl";
//orclZ的数据库的SID
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password);
注意Q也可以通过con.setCatalog("MyDatabase")来加载数据库?br />
例如Q装载DB2驱动E序
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ")
String url="jdbc:db2://localhost:5000/sample";
//sampleZ的数据库?
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
例如Q装载MicroSoft SQLServer驱动E序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver ");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
//pubsZ的数据库?
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Q?Q查询数据库的一些结构信?br />
q主要是获得数据库中的各个表Q各个列及数据类型和存储q程{各斚w的信息。根据这些信息,从而可以访问一个未知结构的数据库。这主要是通过DatabaseMetaDatacȝ对象来实现ƈ调用其中的方法来获得数据库的详细信息Q即数据库的基本信息Q数据库中的各个表的情况Q表中的各个列的信息及烦引方面的信息Q?br />
DatabaseMetaData dbms=con.getMetaData();
System.out.println("数据库的驱动E序?"+dbms.getDriverName());
Q?Q查询数据库中的数据Q?br />
在JDBC中查询数据库中的数据的执行方法可以分ZU类型,分别对应Statement Q用于执行不带参数的单SQL语句字符ԌQPreparedStatementQ预~译SQL语句Q和CallableStatementQ主要用于执行存储过E)三个接口?br />
9.5.1、实现对数据库的一般查询Statement
1、创建Statement对象Q要x行一个SQL查询语句Q必首先创建出Statement对象Q它装代表要执行的SQL语句Qƈ执行SQL语句以返回一个ResultSet对象Q这可以通过ConnectioncM的createStatement()Ҏ来实现?br />
Statement stmt=con.createStatement();
2、执行一个SQL查询语句Q以查询数据库中的数据。Statement接口提供了三U执行SQL语句的方法:executeQuery()、executeUpdate() 和execute()。具体用哪一个方法由SQL语句本n来决定?br />
l Ҏ executeQuery 用于产生单个l果集的语句Q例?SELECT 语句{?br />
l Ҏ executeUpdate 用于执行INSERT、UPDATE或DELETE 语句以及SQL DDLQ数据定义语aQ语句,例如 CREATE TABLE ?DROP TABLE。INSERT、UPDATE 或DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整敎ͼ指示受媄响的行数Q即更新计数Q。对?CREATE TABLE 或DROP TABLE {不操作行的语句QexecuteUpdate 的返回值Mؓ零?br />
l Ҏ execute 用于执行q回多个l果集、多个更新计数或二者组合的语句。一般不会需要该高功能?br />
下面l出通过StatementcM的executeQuery()Ҏ来实现的代码DcexecuteQuery()Ҏ的输入参数是一个标准的SQL查询语句Q其q回值是一个ResultSetcȝ对象?
ResultSet rs=stmt. executeQuery ("select * from DBTableName");
要点Q①JDBC在编译时q不对将要执行的SQL查询语句作Q何检查,只是其作ؓ一个Stringcd象,直到驱动E序执行SQL查询语句时才知道其是否正。对于错误的SQL查询语句Q在执行时将会?SQLException?br />
②一个Statement对象在同一旉只能打开一个结果集Q对W二个结果集的打开隐含着对第一个结果集的关闭?br />
③如果想对多个结果集同时操作Q必d建出多个Statement对象Q在每个Statement对象上执行SQL查询语句以获得相应的l果集?br />
④如果不需要同时处理多个结果集Q则可以在一个Statement对象上顺序执行多个SQL查询语句Q对获得的结果集q行序操作?
import java.sql.*;
public class ResultSetTest
{ public static void main(String args[])
{ try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:studlist");
Statement stmt=con.createStatement();
ResultSet rs1=stmt.executeQuery("select name from student");
ResultSet rs2=stmt.executeQuery("select age from student");
//此时rs1已经被关?
while(rs2.next())
{
System.out.println(rs2.getObject(1));
}
rs2.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
注意Q?br />
此时昄出的是姓名q是q龄Q(显C的是rs2的结果集的内容,卛_生的q龄Q因为采用JDBC-ODBC方式的驱动程序时Qƈ且是采用同一个Statement对象Q它只会保留最新的l果集,rs1中的内容会被新的结果集所取代Q?br />
3?关闭Statement对象Q每一个Statement对象在用完毕后Q都应该关闭?br />
stmt.close();
9.5.2、预~译方式执行SQL语句PreparedStatement
׃Statement对象在每ơ执行SQL语句旉该语句传给数据库,如果需要多ơ执行同一条SQL语句Ӟq样导致执行效率特别低Q此时可以采用PreparedStatement对象来封装SQL语句。如果数据库支持预编译,它可以将SQL语句传给数据库作预编译,以后每次执行该SQL语句Ӟ可以提高讉K速度Q但如果数据库不支持预编译,在语句执行时才传给数据库,其效果类同于Statement对象?br />
另外PreparedStatement对象的SQL语句q可以接收参敎ͼ可以用不同的输入参数来多ơ执行编译过的语句,较Statement灉|方便Q详见后文介l)?br />
1?创徏PreparedStatement对象Q从一个Connection对象上可以创Z个PreparedStatement对象Q在创徏时可以给出预~译的SQL语句?br />
PreparedStatement pstmt=con.prepareStatement("select * from DBTableName");
2?执行SQL语句Q可以调用executeQuery()来实玎ͼ但与Statement方式不同的是Q它没有参数Q因为在创徏PreparedStatement对象时已l给Z要执行的SQL语句Q系lƈq行了预~译?br />
ResultSet rs=pstmt.executeQuery(); // 该条语句可以被多ơ执?
3、关闭PreparedStatement
pstmt.close(); //其实是调用了父类StatementcM的close()Ҏ
9.5.3、执行存储过ECallableStatement
CallableStatementcLPreparedStatementcȝ子类Q因此可以用在PreparedStatementcdStatementcM的方法,主要用于执行存储q程?br />
1?创徏CallableStatement对象Q用ConnectioncM的prepareCallҎ可以创徏一个CallableStatement对象Q其参数是一个String对象Q一般格式ؓQ?br />
l 不带输入参数的存储过E“{call 存储q程?)}”?br />
l 带输入参数的存储q程“{call存储q程??, ?)}?br />
l 带输入参数ƈ有返回结果参数的存储q程“{? = call 存储q程??, ?, ...)}?br />
CallableStatement cstmt=con.prepareCall("{call Query1()}");
2?执行存储q程Q可以调用executeQuery()Ҏ来实现?br />
ResultSet rs=cstmt.executeQuery();
3、关闭CallableStatement
cstmt.close(); //其实是调用了父类StatementcM的close()Ҏ
Q?Q检索记录集以获得当前记录集中的某一记录的各个字D늚?br />
9.5.4、ResultSet对象Q?br />
?执行完毕SQL语句后,返回一个ResultSetcȝ对象Q它包含所有的查询l果。但对ResultSetcȝ对象方式依赖于光标(CursorQ的cdQ而对每一行中的各个列Q可以按M序q行处理Q当Ӟ如果按从左到右的序对各列进行处理可以获得较高的执行效率Q;
ResultSetcM的Course方式主要有:
ResultSet.TYPE_FORWARD_ONLYQؓ~省讄Q:光标只能前进不能后退Q也是只能从第一个一直移动到最后一个?br />
ResultSet.TYPE_SCROLL_SENSITIVEQ允许光标前q或后退q感应到其它ResultSet的光标的Ud情Ş?br />
ResultSet.TYPE_SCROLL_INSENSITIVEQ允许光标前q或后退q不能感应到其它ResultSet的光标的Ud情Ş?br />
ResultSetcM的数据是否允怿改主要有Q?br />
ResultSet.CONCUR_READ_ONLYQؓ~省讄Q:表示数据只能只读Q不能更攏V?br />
ResultSet.CONCUR_UPDATABLEQ表C数据允许被修改?br />
可以在创建Statement或PreparedStatement对象时指定ResultSet的这两个Ҏ?br />
Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
?br />
PreparedStatement pstmt=con.PrepareStatement("insert into bookTable values (?,?,?)",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
?ResultSetcȝ对象l持一个指向当前行的指针,利用ResultSetcȝnext()Ҏ可以UdC一行(在JDBC中,JavaE序一ơ只能看C行数据)Q如果next()的返回gؓfalseQ则说明已到记录集的N。另外JDBC也没有类似ODBC 的书{֊能的Ҏ?br />
?利用ResultSetcȝgetXXX()Ҏ可以获得某一列的l果Q其中XXX代表JDBC中的Java数据cdQ如 getInt()、getString()、getDate(){。访问时需要指定要索的列(可以采用 intg为列P?开始计敎ͼ或指定列Q字D)名方式,但字D名不区别字母的大小写)?br />
while(rs.next())
{ String name=rs.getString("Name"); //采用“列名”的方式讉K数据
int age=rs.getInt("age");
float wage=rs.getFloat("wage");
String homeAddress=rs.getString(4); //采用“列号”的方式讉K数据
}
9.5.5、数据{?br />
利用ResultSetcȝgetXXX()Ҏ可以实现ResultSet中的SQL数据cd转换为它所q回的Java数据cd?br />
9.5.6、NULLl果?br />
要确定给定结果值是否是JDBC NULLQ必dd该列Q然后用ResultSet.wasNull
Ҏ查该ơ读取是否返回JDBC NULL?br />
当用ResultSet.getXXXҎdJDBC NULLӞҎwasNull返回下列g一Q?br />
Q?QJavanull?br />
对于q回Java对象的getXXXҎQ例如getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject{)?br />
Q?Q零|对于getByte、getShort、getInt、getLong、getFloat和getDouble?br />
Q?Qfalse|对于getBoolean
9.5.6、获得结果集中的l构信息Q利用ResultSetcȝgetMetaData()Ҏ来获得结果集中的一些结构信息(主要提供用来描述列的数量、列的名U、列的数据类型。利用ResulSetMetaDatacM的方法)?br />
ResultsetMetaData rsmd=rs.getMetaData();
rsmd.getColumnCount(); //q回l果集中的列?
rsmd.getColumnLabel(1); //q回W一列的列名Q字D名Q?br />
例如Q?br />
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from TableName");
for(int i=1; i<=rs.getMetaData().getColumnCount(); i++) //跟踪昄各个列的名称
{ System.out.print(rs. getColumnName (i)+"\t");
}
while(rs.next())
{ //跟踪昄各个列的?br />
for(int j=1; j<=rs.getMetaData().getColumnCount(); j++)
{ System.out.print(rs.getObject(j)+"\t");
}
}
9.6、更新数据库
前面主要介绍如何实现Ҏ据库的查询操作,但在许多应用中需要实现对数据库的更新Q这主要涉及修改、插入和删除{(即SQL语句中的Insert、Update、Delete、Creat、Drap{)。仍焉过创徏Statement对象来实玎ͼ但不再调用executeQuery()ҎQ而是使用executeUpdate()Ҏ?br />
要点FQ正区分StatementcM的executeQuery()、execute()和executeUpdate()Ҏ的用法:Q?Q?br />
executeQuery() 执行一般的SQL查询语句Q即SELECT语句Qƈq回Resultset对象Q(2Qexecute()可以执行各种SQL查询语句Qƈ可能q回多个l果集(q一般主要发生在执行了返回多个结果集的存储过E时Q,此时可以采用ResultsetcȝgetResultSet()来获得当前的l果集;Q?QexecuteUpdate()执行Ҏ据库的更新的SQL语句或DDL语句?br />
9.6.1 对表中的记录q行操作
对一个表中的记录可以q行修改、插入和删除{操作,分别对应SQL的Update?Insert、Delete操作QexecuteUpdate()Ҏ的输入参C然ؓ一个String对象Q即所要执行的SQL语句Q,但输出参C是ResultSet对象Q而是一个整敎ͼ它代表操作所影响的记录行敎ͼ?br />
Statement stmt=con.createStatement();
stmt.executeUpdate("Update bookTable set Title='Java2' where Author='zhang'");
stmt.executeUpdate("Delete from bookTable where Author='zhang'");
stmt.executeUpdate("Insert into bookTable(BookID,Author,Title) values(1,'Li Ming','Java2')"); //未给出的列,其gؓNULL
E序实例Q对数据库中的表q行更新操作q显C操作前后的l果
import java.sql.*;
public class DBUpdateSetTest
{ public static void main(String args[])
{ try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:studlist");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from student");
System.out.println("Result before executeUpdate");
while(rs.next())
{
System.out.println(rs.getString("name"));
System.out.println(rs.getString("age"));
}
stmt.executeUpdate("Update student set name='Yang' where id=0");
stmt.executeUpdate("Delete from student where id=2");
stmt.executeUpdate("Insert into student(id,name,age,sex) values(2,'zhang',30,true)");
rs=stmt.executeQuery("select * from student");
System.out.println("Result After executeUpdate");
while(rs.next())
{
System.out.println(rs.getString("name"));
System.out.println(rs.getString("age"));
}
rs.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
9.6.2 创徏和删除表
创徏和删除一个表主要对应于SQL的Create Table和Drop Table语句。这可以通过Statement对象的executeUpdate()Ҏ来完成?br />
?创徏?br />
Statement stmt=con.createStatement();
stmt.executeUpdate("create table TableName(ID integer, Name VARCHAR(20), Age integer)");
stmt.executeUpdate("Insert into TableName(ID, Name, Age) values(1,'Yang Ming',30)");
?删除?br />
Statement stmt=con.createStatement();
stmt.executeUpdate("Drop Table TableName");
9.6.3 增加和删除表中的?br />
对一个表的列q行更新操作主要是用SQL的ALTER Table语句。对列所q行的更新操作会影响到表中的所有的行?br />
?增加表中的一?br />
Statement stmt=con.createStatement();
stmt.executeUpdate("Alter Table TableName add Column Address VarChar(50)");
stmt.executeUpdate("Update TableName set Address='Beijing,China' where ID=1");
?删除表中的一?br />
Statement stmt=con.createStatement();
stmt.executeUpdate("Alter Table TableName Drop Column Address");
stmt.executeQuery("Select * from TableName");
9.6.4 利用PreparedStatement对象实现数据更新
同SQL查询语句一PҎ据更新语句时也可以在PreparedStatement对象上执行。用PreparedStatement对象Q只需传递一ơSQL语句Q可以多ơ执行它Qƈ且可以利用数据库的预~译技术,提高执行效率。另外也可以接受参数?br />
PreparedStatement pstmt=con.prepareStatement("Update TableName set Address='Beijing,China' where ID >1");
pstmt.executeUpdate();
9.7 参数的输入与输出
要实C用SQL语句的输入与输出参数Q必dPreparedStatementcȝ对象上进行操作;同时׃CallableStatementcLPrepareStatementcȝ子类Q所以在CallableStatemen对象上的操作也可以用输入与输出参数Q其主要的编E原理是在生成CallableStatement或PreparedStatementcȝ对象Ӟ可以在SQL语句中指定输入或输出参数Q在执行q个SQL语句之前Q要对输入参数进行赋倹{?br />
Q?Q用PreparedStatementcȝ对象
通过prepareStatementcȝ对象可以实现在查询语句与数据更新语句斚w都可以设|输入参数?br />
具体的方法是在SQL语句中用“?”标明参敎ͼ在执行SQL语句之前Q用setXXXҎl参数赋|然后使用executeQuery()或executeUpdate()来执行这个SQL语句。每ơ执行SQL语句之前Q可以给参数重新赋倹{?br />
setXXXҎ用于l相应的输入参数q行赋|其中XXX是JDBC的数据类型,如:Int、String{。setXXXҎ有两个参敎ͼW一个是要赋值的参数在SQL语句中的位置Q?SQL语句中的W一个参数的位置?Q第二个参数的位|ؓ2QsetXXXҎ的第二个参数是要传递的|?00、“Peking”等Q随XXX的不同而ؓ不同的类型?br />
PreparedStatement pstmt=con.prepareStatement("Update TableName set Name=? where ID=?");
pstmt.setString(1,"zhang Hua"); //讄W一个参敎ͼNameQؓ “zhang Hua?br />
for(int i=1;i<3;i++)
{ pstmt.setInt(2,i); //讄W二个参敎ͼIDQؓ 1,2
pstmt.executeUpdate();
}
要点Q最l实?Update TableName set Name=zhang Hua where ID=1 与Update TableName set Name=zhang Hua where ID=2的效果?br />
Q?Q用CallableStatement对象
如果要求调用数据库的存储q程Q要使用CallableStatement对象。另外还有些存储q程要求用户输入参数Q这可以在生成CallableStatement对象的存储过E调用语句中讄输入参数。在执行q个存储q程之前使用setXXXҎl参数赋|然后再执行这个存储过E?br />
CallableStatement cstmt=con.prepareCall("{call Query(?)}"); //Query为存储过E名
cstmt.setString(1,"输入参数"); //为存储过E提供输入参?br />
ResultSet rs=cstmt.executeQuery();
Q?Q接收输出参?br />
某些存储q程可能会返回输出参敎ͼq时在执行这个存储过E之前,必须使用CallableStatement的registerOutParameterҎ首先登记输出参数Q在registerOutParameterҎ中要l出输出参数的相应位|以及输出参数的SQL数据cd。在执行完存储过E以后,必须使用getXXXҎ来获得输出参数的倹{ƈ在getXXXҎ中要指出获得哪一个输出参敎ͼ通过序号来指定)的倹{?br />
实例Q存储过EgetTestData有三个输入参数ƈq回一个输出参敎ͼcd分别为VARCHAR。在执行完毕后,分别使用getString()Ҏ来获得相应的倹{?br />
CallableStatement cstmt = con.prepareCall(“{? = call getTestData (?,?,?)}?;
cstmt.setString(1,Value); //讄输入参数
cstmt.setInt(2,Value);
cstmt.setFloat(3,Value);
cstmt.registerOutParameter(1,java.sql.Types.VARCHAR); //登记输出参数
ResultSet rs = cstmt.executeQuery(); //执行存储q程
rs.getString(1); //获得W一个字D늚?br />
String returnResult=cstmt.getString(1); //获得q回的输出参数的?br />
要点Q由于getXXXҎ不对数据cd作Q何{换,在registerOutParameterҎ中指明数据库返回的SQL数据cdQ在执行完存储过E以后必采用相应匹配的getXXXҎ来获得输出参数的倹{?br />
9.8 扚w处理JDBC语句提高处理速度
有时候JDBCq行得不够快Q这可以使用数据库相关的存储q程。当Ӟ作ؓ存储q程的一个替代方案,可以试试使用Statement 的批量处理特性以提高速度?
存储q程的最单的形式是包含一pdSQL语句的过E,这些语句放在一起便于在同一个地方管理也可以提高速度。Statement cd以包含一pdSQL语句Q因此允许在同一个数据库事务执行所有的那些语句而不是执行对数据库的一pd调用?
使用扚w处理功能涉及下面的两个方法:
addBatch(String) Ҏ
executeBatchҎ
如果你正在用Statement 那么addBatch Ҏ可以接受一个通常的SQL语句Q或者如果你在用PreparedStatement Q那么也可以什么都不向它增加?
executeBatch Ҏ执行那些SQL语句q返回一个int值的数组Q这个数l包含每个语句媄响的数据的行数?br />
注意Q如果将一个SELECT语句或者其他返回一个ResultSet的SQL语句攑օ扚w处理中就会导致一个SQLException异常?
关于java.sql.Statement 的简单范例可以是Q?
con = DriverManager.getConnection(url,"myLogin", "myPassword");
con.setAutoCommit(false);
stmt = con.createStatement();
stmt.addBatch("INSERT INTO student " + "VALUES(4,'Yang',20,True)");
stmt.addBatch("INSERT INTO student " + "VALUES(5,'li',20,True)");
stmt.addBatch("INSERT INTO student " + "VALUES(6,'zhang',20,True)");
stmt.addBatch("INSERT INTO student " + "VALUES(7,'wang',20,True)");
stmt.addBatch("INSERT INTO student " + "VALUES(8,'liu',20,True)");
int [] updateCounts = stmt.executeBatch();
con.commit();
con.setAutoCommit(true);
PreparedStatement 有些不同Q它只能处理一部分SQL语法Q但是可以有很多参数Q因此重写上面的范例的一部分可以得C面的l果Q?
// 注意q里没有删除语句
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO student VALUES(?,?,?,?)"
);
User[ ] users = ...;
for(int i=0; i
stmt.setInt(1, users
.getID());
stmt.setString(2, users
.getName());
stmt.setInt(3, users
.getAge());
stmt.setBoolean(4, users
.getSex());
stmt.addBatch( );
}
int[ ] counts = stmt.executeBatch();
如果你不知道你的语句要运行多次Q那么这是一个很好的处理SQL代码的方法。在不用批量处理的情况下,如果d50个用P那么性能有影响Q如果某个h写了一个脚本添加一万个用户Q程序可能变得很p糕。添加批处理功能可以帮助提高性能Q而且在后面的那种情况下代码的可读性也会更好?br />
]]>
1 tomcat的j2ee实现对表单提交即post方式提示时处理参数采用缺省的iso-8859-1来处?br />2 tomcat对get方式提交的请求对query-string 处理旉用了和postҎ不一L处理方式?与tomcat4不一?所以设|setCharacterEncoding(“gbk?)不v作用?br />
解决办法Q?br />
1。)postҎ提交的还是用filtercLqop了?br />2。)getҎ提交的有两种办法解决Q?br /> a.所有get提交q来的都用new String (request.getParameter("name").getBytes("iso8859-1"))来{一下。ؓ什么是iso8859-1Q因是tomcat默认的字W集?br /> b.修改tomcat的server.xml文g
打开tomcat的server.xml文gQ找?connector>区块Q加入如下一行:
URIEncoding=”GBK?br /> 完整的应如下Q?br />
port
="80"
maxThreads
="150"
minSpareThreads
="25"
maxSpareThreads
="75"
enableLookups
="false"
redirectPort
="8443"
acceptCount
="100"
debug
="0"
connectionTimeout
="20000"
disableUploadTimeout
="true"
URIEncoding
="GBK"
/>
q样可以都解决了中文问题了?br />
]]>
2005-08-05 来源:CSDN 作?CMTobby
最q参与了一个网上直报项目的l护工作Q该|上直报应用E序有一个功能就是通过导入文本文档的方式向后台数据库中扚w导入直报用户Q包括用户各信息如单位名称、企业资质等U等{。其核心之处是如何获取所上蝲文本文档中的内容Q现该部分E序单介l如下:
import
javax.servlet.
*
;
import
javax.servlet.http.HttpServletRequest;
import
java.util.LinkedList;
import
java.io.
*
;
public
class
ReadRequest{
public
LinkedList getRequest(HttpServletRequest request){
LinkedList output
=
new
LinkedList();
try
{
ServletInputStream in
=
request.getInputStream();
int
len
=
request.getContentLength();
System.out.println (len);
byte
[]b
=
new
byte
[len];
in.read(b,
0
,len);
String str
=
new
String(b);
System.out.println (str);
BufferedReader con
=
new
BufferedReader(
new
StringReader(str));
String c
=
""
;
while
((c
=
con.readLine())
!=
null
){
output.add(c);
}
}
catch
(Exception e){e.printStackTrace();}
return
output;
}
}
<!
DOCTYPE HTML PUBLIC
"
-//W3C//DTD HTML 4.01 Transitional//EN
"
"
http://www.w3.org/TR/html4/loose.dtd
"
>
<
jsp:useBean id
=
"
pn
"
scope
=
"
page
"
class
=
"
Util.ReadRequest
"
/>
<%--<
jsp:useBean id
=
"
pn
"
scope
=
"
request
"
class
=
"
Util.GetFile
"
/>--%>
<%
@ page
import
=
"
java.util.*
"
%>
<
html
>
<
head
>
<
meta http
-
equiv
=
"
Content-Type
"
content
=
"
text/html; charset=gb2312
"
>
<
title
>
试
</
title
>
</
head
>
<
body
>
<
form name
=
"
form1
"
action
=
"
index.jsp
"
method
=
"
post
"
enctype
=
"
multipart/form-data
"
>
<
input name
=
"
sdf
"
type
=
"
file
"
><
input name
=
"
aa
"
type
=
"
submit
"
value
=
"
提交
"
>
<%
LinkedList output
=
new
LinkedList();
output
=
pn.getRequest(request);
//
output=pn.readHttpData(request);
System.out.println(output.size());
for
(
int
i
=
0
;i
<
output.size();i
++
){
out.println(output.get(i)
+
"
<br>
"
);
}
%>
</
form
>
</
body
>
</
html
>
300000001,武汉,420101,230,A304,A211,4700
300000002,武汉,420101,230,A304,A211,4700
300000003,武汉,420101,230,A304,A211,4700
首先对outputq行处理Q把前面的http头内容如QContent-Disposition: form-data; name="sdf"; filename="C:\Documents and Settings\yy\桌面\test_jz.txt"以及remove掉,现在的output只有文档中的内容了。然后就开始插入数据库Q只l出代码片断Q:
if
(output.get(i)
==
null
||
( (String) output.get(i)).equals(
""
)) {
continue
;
//
I则自动换行 }
String s
=
(String) output.get(i);
//
取得一行 String[] ss = s.split(",");
String sql
=
"
insert into xt_user(f001,f002,f003,f004,f005,f006) values(?,?,?,?,?,?)
"
;
PreparedStatement ps
=
con.prepareStatement(sql);
ps.setString(
1
,ss[
0
]);
ps.setString(
2
,ss[
1
]);
ps.setString(
3
,ss[
2
]);
ps.setString(
4
,ss[
3
]);
ps.setString(
5
,ss[
4
]);
ps.setString(
6
,ss[
5
]);
ps.executeUpdate();
}
]]>
java中读取中文文件经常出Cؕ码,是因为java~码的问题,以下是一个简单的c,实现d中文?br /> 在用inputstreamd的时候,最好是一ơ读取多个字节,q样节io操作Q提高速度?/font>
import
java.io.BufferedReader;
import
java.io.ByteArrayOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileReader;
import
java.io.FilterInputStream;
import
java.io.InputStream;
public
class
Stream
{
public
static
void
main(String[] args)
{
try
{
InputStream r
=
new
FileInputStream (
"
c:/a.txt
"
);
ByteArrayOutputStream byteout
=
new
ByteArrayOutputStream();
byte
tmp []
=
new
byte
[
256
];
byte
context [];
int
i
=
0
;
while
((i
=
r.read(tmp))
!=-
1
)
{
byteout.write(tmp);
}
context
=
byteout.toByteArray();
String str
=
new
String(context,
"
gb2312
"
);
//
分隔?/span>
String stra []
=
str.split(
"
\n
"
);
for
(
int
n
=
0
;n
<
stra.length;n
++
)
{
System.out.println(stra[n]
+
"
++++
"
);
}
//
System.out.println(str);
}
catch
(Exception e)
{
//
TODO: handle exception
}
}
}
]]>
2 import java.util.*
;
3 import javax.servlet.*
;
4 import javax.servlet.http.*
;
5 import org.apache.commons.fileupload.*
;
6
7 public class Upload extends
HttpServlet {
8
9 private String uploadPath = "C:\\upload\\"; // 用于存放上传文g的目?/span>
10 private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文g的目?/span>
11
12 public void
doPost(HttpServletRequest request, HttpServletResponse response)
13 throws
IOException, ServletException
14
{
15
}
16
}
17
18 //当servlet收到览器发出的Posth后,在doPost()Ҏ中实现文件上传。以下是CZ代码Q?/span>
19
20 public void
doPost(HttpServletRequest request, HttpServletResponse response)
21 throws
IOException, ServletException
22
{
23 try
{
24 DiskFileUpload fu = new
DiskFileUpload();
25 // 讄最大文件尺寸,q里?MB
26 fu.setSizeMax(4194304
);
27 // 讄~冲区大,q里?kb
28 fu.setSizeThreshold(4096
);
29 // 讄临时目录Q?/span>
30
fu.setRepositoryPath(tempPath);
31
32 // 得到所有的文gQ?/span>
33 List fileItems =
fu.parseRequest(request);
34 Iterator i =
fileItems.iterator();
35 // 依次处理每一个文Ӟ
36 while
(i.hasNext()) {
37 FileItem fi =
(FileItem)i.next();
38 // 获得文g名,q个文g名包括\径:
39 String fileName =
fi.getName();
40 if(fileName!=null
) {
41 //
在这里可以记录用户和文g信息
42 //
43 // 写入文ga.txtQ你也可以从fileName中提取文件名Q?/span>
44 fi.write(new File(uploadPath + "a.txt"
));
45
}
46
}
47 // 跌{C传成功提C页?/span>
48
}
49 catch
(Exception e) {
50 // 可以跌{出错面
51
}
52
}
53
54 //如果要在配置文g中读取指定的上传文g夹,可以在init()Ҏ中执行:
55
56 public void init() throws
ServletException {
57 uploadPath =
.
58 tempPath =
.
59 // 文g夹不存在p动创建:
60 if(!new
File(uploadPath).isDirectory())
61 new
File(uploadPath).mkdirs();
62 if(!new
File(tempPath).isDirectory())
63 new
File(tempPath).mkdirs();
64
}
65
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
2 enctype="multipart/form-data" name="form1">
3 <input type="file" name="file">
4 <input type="submit" name="Submit" value="upload">
5 </form>
摘自Q?/font>
http://www.j2medev.com/Article/Class10/j2eeopensource/200409/62.html
]]>
1 如何获得某一个目录下的文件列表?
2
3 String[] FileNames = MyDir.list();
3 Swing: JFileChooserc?/span>+ FileFilterc?/span>
3 利用FileReader/FileOutputStream拯中文文g出错Q?
利用如下代码片断拯中文文g不会出错Q?
2
3 while ((c = MyFileReader.read()) != -1
)
4
5 MyFileWriter.write(c);
2
3 while ((c = MyFileReader.read()) != -1
)
4
5 MyFileOutputStream.write(c);
0 ?5535Q通常来说是两个字节的QFileWriter.write(int c)向文件写
入一个intQ通常来说也是两个字节的,如果某个字符的高位字节ؓI,?
么其高位字节被舍弃QFileOutputStream.write(int b)虽然接受一?
int作ؓ参数Q实际上只向文g写入一个字节,如果传递过来的参数是一?
双字节的汉字Q其高位字节被舍弃Q造成文g内容错误?
Q永q只使用InputStream/OutputStreamq行IO操作?
利用如下代码片断拯中文文g不会出错Q?
2
3 while ((c = MyFileInputStream.read()) != -1
)
4
5 MyFileOutputStream.write(c);
使用l一码Unicode可以昄和存储拉丁语a中的Ҏ字符。具体应用范?
如下Q?
2
3 MyJTextArea.append("\u00E2"
);
4
5 MyJTextArea.append("\u00E3"
);
6
7 MyJTextArea.append("\u00E4"
);
8
9 MyJTextArea.append("\u00E5"
);
10
11
12
13 MyFileOutputStream.write(MyJTextArea.getText().getBytes("UTF-8"
));
14
15 MyFileOutputStream.close();
2
3 FileInputStream in = new
FileInputStream(MyFile);
4
5
in.read(b);
6
7 MyJTextArea.append(new String(b, "UTF-8"));
对于一般的U学计算应用E序QDataInputStream和DataOutputStreamc?
常是最好的选择。这两个cL供了存取各种数据的方法。下面的范例演示?
构造DataInputStream和DataOutputStream的方法:
2
3 new
FileInputStream(MyInputFile));
4
5 MyDataOutputStream = new
DataOutputStream(
6
7 new FileOutputStream(MyOutputFile));
要注意的是这样做增加了硬盘的开销Q因行对象序列化q程d了一
些额外的信息。在利用ObjectInputStream和ObjectOutputStreamq行通讯
的时候,虽然数据发收q程得到了大大简化,但是对带宽的要求也大大的
提高了?
6 文g操作的基本原则是什么?
a. 避免多次讉K盘Q例如一ơ读出n个字节就比每ơ读?个字节的讉K
效率要高很多?
b. 避免多次讉K操作pȝ?
c. 避免多次调用文g存取Ҏ?
d. 避免字节和字符h处理Q在Java语言中字节与字符的概忉|不一?
的,在涉及到双字节字W的问题上更是容易出错?
7 如何获得可用的硬盘空_
目前未发现有Q何干净利落的纯JavaҎ能够解决q个问题。通常的解
x案是直接讉K操作pȝ获得q些信息。有一个被UCؓJConfig的类库提
供了一些方法可以获得磁盘和文g信息Q但是可以肯定这个类库用了JNI
Ҏ?
下蝲地址Qhttp://www.tolstoy.com/samizdat/jconfig.html
如果你用的是晕倒死pd操作pȝQ那么下面的Ҏ也许能够获得正确
的结果。我之所以说也许Q是因ؓ我在多个晕倒死q_上作q实际测试,
在英文版的晕倒死上基本上都能够得到正的l果Q在中文版的晕倒死?
基本上都不能够获得正的l果?
2
3 String command = ""
;
4
5 if (osname.indexOf("NT") > -1
)
6
7 command = "c:\\winnt\\System32\\cmd.exe"
;
8
9 else if (osname.indexOf("Windows") > -1
)
10
11 command = "c:\\windows\\command.com"
;
12
13
14
15 Process p =
Runtime.getRuntime().exec(
16
17 command + " /c dir > c:\\dir.txt"
);
18
19
p.waitFor();
20
如果你用的是UNIX/Linux操作pȝQ你可以使用cM的方法来获得相关
信息。徏议用的命o是df -k > dir.txt?
8 我能够用Java来格式化我的盘或者是软盘么?
关于q个问题Q想来在不久的将来仍然是不会有纯Java的解x案了。如
果你一定要在你的Java应用E序里面格式化你的C盘的话,下面的这个方?
也许会有所帮助。当Ӟ在你使用q个Ҏ之前Q请仔细备䆾好女朋友l你
的情书或者是C和下一个网友约会的日期?
建立一个称为FormatDrive.bat的文Ӟ该文件必L在当前目录或者是p?
l\径下Q文件的内容如下Q?
rundll32.exe shell32.dll, SHFormatDrive
格式化硬盘的Ҏ可以q样写:
2
3
{
4
5 try
6
7
{
8
9 Process p = Runtime.getRuntime().exec("FormatDrive.bat"
);
10
11
p.waitfor();
12
13 } catch
(Exception e)
14
15
{
16
17
System.out.println(e);
18
19
}
20
21
}
22
在UNIX/Linux下你通常没有必要兛_q个问题Q只要记住那个斜杠就可以了?
在晕倒死下硬盘可以有多个逻辑分区Q可应用下面的方法找出来Q?
2
3
{
4
5 File[] roots =
File.listRoots();
6
7 for (int i=0
; i
8
{
9
10
System.out.println(roots[i]);
11
12
}
13
14
}
15
明。该|站是一个优U的JavaE序设计|站Q值得各位朋友l常前去讉K?br />
摘自Q?/font>
http://www.cn-java.com/target/news.php?news_id=992
]]>
Listing A包含了一个简单示例的代码Q这个示例会说明常用JTable的行为。用戯够更改JTable的布局、拖攑֮的栏Q或者通过拖动标题的分隔线来改变其大小?/font>
q些列被保存在一个String数组里:
JTable是用data和columnNames构成的:
JTable table = new JTable(data, columnNames);
查看JTable
JTable的高度和宽度按照下面的方法来讑֮Q?br />table.setPreferredScrollableViewportSize(new Dimension(300, 80));
如果JTable的一个列或者JTableH口自n的大被重新定Q那么其他列会被相应的羃或者放大,以适应新的H口。用setAutoResizeMode()Ҏp够控制这U行为:
表格的缺省?/font>
单元格内Ҏ坐标U的~省颜色是Color.gray。要更改q些Ҏ坐标U的颜色Q就要用刎ͼ
各个单元格的高度等于行的高度减去行间的距离?/font>
在缺省情况下Q内容的前景颜色和背景颜色的选择都是由Swing的所见即所得的实现来确定的。你可以使用下面的方法来更改选择的颜Ԍ
列的宽度
JTablelg有几个控制表格特性的cd接口。TableColumn会不断追t列的宽度,q负责列大小的调_包括最大和最宽度?/font>
TableColumnModel理着TableColumns的集合以及列的选择。要讄某个列的宽度Q就要ؓ表格列的模型讄一个参照。然后,取得惌的TableColumnq调用其setPreferredWidth()ҎQ?/font>
标题
JtableHeader会处理JTable标题的显C。你可以l分JtableHeader以获得自定义的布局。例如,如果你的应用E序需要一个跨多个列的标题,那么只用单地l分JtableHeaderq将它集成到你的JTable里就行了?/font>
你可以通过为当前JTable的JtableHeader讄一个参照或者调用其setReorderingAllowed()ҎQ来指定标题的重新排序是否被允许Q?/font>
选择模式
在缺省状况下Q当用户在JTable里选择一个单元格的时候,整个行都被选中了。有多种Ҏ能够让用戯定义选择的方式。利用ListSelectionModel接口Q你可以允许用户选择单个或者多个行Q?/font>
ListSelectionModel有下面这些字D:
* SINGLE_SELECTION允许一ơ选择一行?br /> * SINGLE_INTERVAL_SELECTION允许选择盔R的一pd行?br /> * MULTIPLE_INTERVAL_SELECTION也允讔R择盔R的列Q但是带有扩展功能。它允许用户使用[Ctrl]键进行多个互不相ȝ选择Q即选择不相ȝ行)?/font>
setCellSelectionEnabled()Ҏ让用戯够同旉择单个单元格或者整个行Q?/font>
~辑单元?/font>
我们q个单的表格允许用户~辑表格里的M单元根{Listing B列出了一个表|它允许由E序员来军_哪些单元D够被~辑。第一步是创徏一个自定义的TableModelQ?/font>
单的表格验证
你需要确保用户只输入整数|假如_向第二列Q“盒子的数量”这一列)输入值来强制替代setValueAt()ҎQƈ验证逻辑包括q这个新Ҏ里。首先,你要查列是否是整敎ͼ以及q个列是否只应该包含整数|
背景颜色
Listing C包含了用于ColorTable.java的代码,它说明了如何向JTable加入颜色。你可以通过强制替代其prepareRenderer()Ҏ来向JTable加入背景颜色Q?/font>
一切皆在掌握中
我们的例子只是JTable其他部分的基。通过使用q些工具Q你能够快速和L地掌控对Java应用E序所生成的表格的格式化,q样p够让你的用户在进行正怋用的时候不到障碍?/font>
摘自Q?a >http://www.7dspace.com/doc/21/0601/20061905111047137.htm
<!--默认首页-->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
2.spring的配|文Ӟ主配|文?br /><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<beans>
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!-- =======事务理======== -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- ===========IBATIS SQLMAP配置============== -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userManager" class="wh.logic.UserManager">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
</beans>
3.spring的servlet配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
<beans>
<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>action</value>
</property>
<property name="defaultMethodName">
<value>index</value>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
</bean>
<bean name="/userController.do" class="wh.servlet.UserController">
<property name="methodNameResolver">
<ref bean="methodNameResolver"/>
</property>
</bean>
</beans>
4.ibatis配置文g
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
"
<sqlMapConfig>
<sqlMap resource="wh/domain/User.xml"/>
</sqlMapConfig>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "
<sqlMap namespace="User">
<resultMap id="result" class="wh.domain.UserBean">
<result property="id" column="id" columnIndex="1"/>
<result property="name" column="name" columnIndex="2"/>
<result property="pwd" column="pwd" columnIndex="3"/>
</resultMap>
<select id="getUser" resultMap="result">
select id,name,pwd from [user] where id = #value#
</select>
<select id="getUserList" resultMap="result">
select id,name,pwd from [user]
</select>
</sqlMap>
5.log4j配置文g
log4j.rootLogger=info, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%t] %d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=${srping.root}/WEB-INF/spring.log
log4j.appender.logfile.MaxFileSize=512KB
# Keep three backup files.
log4j.appender.logfile.MaxBackupIndex=3
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
6.jdbc.propertis
# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "dataAccessContext-local.xml".
# Targeted at system administrators, to avoid touching the context XML files.
jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
jdbc.url=jdbc:jtds:sqlserver://127.0.0.1:1433/test
jdbc.username=sa
jdbc.password=123123