最新更新 sitemap 网站制作设计本站搜索
网页设计
国外网站 韩国网站 个人主页 手提袋设计 CSS 网页特效 平面设计 网站设计 Flash CMS技巧 服装网站 php教程 photoshop 画册 服务器选用 数据库 Office
虚拟主机 域名注册 云主机 网页设计 客服QQ:8208442
当前位置:首页 > 编程开发 > jsp教程

jsp中的关于数据库的编程

日期:10-14    来源:中国设计秀    作者:cnwebshow.com

一,SQL复习ANA中国设计秀
1,SQL语句分为两类:DDL(Data Definition Language)和DML(Dat Manipulation Languge,数据操作语言)。前者主要是定义数据逻辑结构,包括定义表、视图和索引;DML主要是对数据库进行查询和更新操作。ANA中国设计秀
2,Create Table(DDL):ANA中国设计秀
Create Table tabName(ANA中国设计秀
colName1 colType1 [else],ANA中国设计秀
colName2 colType2 [else],ANA中国设计秀
...,ANA中国设计秀
colNamen colTypen [else]ANA中国设计秀
);ANA中国设计秀
例如:Cteate Table pJoiner(ANA中国设计秀
pno char(6) not null,ANA中国设计秀
eno char(6) nut nullANA中国设计秀
);ANA中国设计秀
char int varchar等等都是用来定义列数据类型的保留字,其中varchar表示可变字符类型。ANA中国设计秀
3,Select <col1>,<col2>,...,<coln>ANA中国设计秀
From <tab1>,<tab2>,...,<tabm>ANA中国设计秀
[Where<条件>]ANA中国设计秀

条件中的子查询:ANA中国设计秀
Where Not Exists(ANA中国设计秀
Select * From tab2 Where col1=col2ANA中国设计秀
)//当查询结果为空时,条件为真。ANA中国设计秀

4,INSERT INTO <tab1> VALUES(<col1>, ...<coln>)ANA中国设计秀
5,DELETE FROM <tab1> [WHERE<条件>]ANA中国设计秀
6,UPDATE <tab1>ANA中国设计秀
SET <tab1>=<vlu1>ANA中国设计秀
...ANA中国设计秀
<tabn>=<vlun>ANA中国设计秀
[WHERE<条件>]ANA中国设计秀
例如:ANA中国设计秀
Update exployeeANA中国设计秀
Set age=27ANA中国设计秀
Where name='赵一'ANA中国设计秀
二,JDBC 主要接口:ANA中国设计秀
java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。ANA中国设计秀
java.sql.Connection,指应用程序与特定数据库的连接。ANA中国设计秀
java.sql.Statement,用于一般sql语句的执行(可以是查询、更新甚至可以创建数据库的执行过程)ANA中国设计秀
java.sql.ResultSet,查询所返回的结果保存在此对象中,用它可以浏览和存取数据库内的记录。ANA中国设计秀

1,通过jdbc-odbc桥使用odbc数据库(并不需要jdbc Drivers)ANA中国设计秀

先在odbc DSN(Data Source Name)设置处设置pubs sysDSN,sa为username,密码为空ANA中国设计秀
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序ANA中国设计秀
con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubsANA中国设计秀
con.close();ANA中国设计秀
//应当catch ClassNotFoundException和SQLExceptionANA中国设计秀

Connection的getWarning方法返回一个SQLWarning对象,在连接之前应当先检查。ANA中国设计秀
使用jdbc-odbc的最大好处是:免费的。但是性能受odbc的限制,而且一般odbc驱动比较昂贵。ANA中国设计秀
2,使用专门的jdbc驱动程序。//此处是mm jdbc DriverANA中国设计秀
先将jar文件放在ClassPath里面。ANA中国设计秀
Class.forName("org.gjt.mm.MySQL.Driver");ANA中国设计秀
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");ANA中国设计秀
con.close();ANA中国设计秀

可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。ANA中国设计秀
三,查询数据库ANA中国设计秀
Statement stmt=con.createStatement();ANA中国设计秀
stmt.setMaxRows()可以控制输出记录最大数量;ANA中国设计秀
ResultSet rs=stmt.executeQuery("select .....");ANA中国设计秀

ResultSet指向当前记录:ANA中国设计秀
int userId=rs.getInt("userid");ANA中国设计秀
String userName=rs.getString("username");ANA中国设计秀
...或者用序号(从1开始的)ANA中国设计秀
int userId=rs.getInt(1);ANA中国设计秀
Stirng userName=rs.getString(2);ANA中国设计秀

ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的ANA中国设计秀
SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()ANA中国设计秀
catch(SQLException e){ANA中国设计秀
out.PRintln(e.getMessage());ANA中国设计秀
while(e=e.getNextException()){ANA中国设计秀
out.println(e.getMessage());ANA中国设计秀
}ANA中国设计秀
}ANA中国设计秀

一般来说并不建议在jsp中编写数据库的访问程序,可以将数据库的访问封装在一个javabean中。ANA中国设计秀
四,ResultSet深入ANA中国设计秀
1,ResultSetMetaDataANA中国设计秀
ResultSet rs=stmt.executeQuery("select....");ANA中国设计秀
ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象ANA中国设计秀
int numberOfColumns=rsmd.getColumnCount();//返回列数ANA中国设计秀
boolean b=rsmd.isSearchable(int i);//返回第i列是否可以用于where子句ANA中国设计秀
String c=rsmd.getColumnLabel(int i);//获取第i列的列标ANA中国设计秀
Objcet obj=rs.getObject();ANA中国设计秀
if(obj!=null)out.println(obj.toString());ANA中国设计秀
else println("");ANA中国设计秀
2,SQL类型与ResultSet的getObject返回类型及对应的XXX getXXX()方法ANA中国设计秀
SQL类型 JSP类型 对应的getXXX()方法ANA中国设计秀
————————————————————————————————————————————ANA中国设计秀
CHAR String String getString()ANA中国设计秀
VARCHAR String String getString()ANA中国设计秀
LONGVARCHAR String InputStream getAsciiStream()/getUnicodeStream()ANA中国设计秀
NUMERIC java.math.BigDecimal java.math.BigDecimal getBigDecimal()ANA中国设计秀
DECIMAL 同上ANA中国设计秀
BIT Boolean boolean getBoolean()ANA中国设计秀
TINYINT Integer byte getByte()ANA中国设计秀
SMALLINT Integer short getShort()ANA中国设计秀
INTEGER Integer int getInt()ANA中国设计秀
BIGINT Long long getLong()ANA中国设计秀
REAL Float float getFloat()ANA中国设计秀
FLOAT Double double getDouble()ANA中国设计秀
DOUBLE Double double getDouble()ANA中国设计秀
BINARY byte[] byte[] getBytes()ANA中国设计秀
VARBINARY byte[] byte[] getBytes()ANA中国设计秀
LONGVARBINARY byte[] InputStream getBinaryStream()ANA中国设计秀
DATE java.sql.Date java.sql.Date getDate()ANA中国设计秀
TIME java.sql.Time java.sql.Time getTime()ANA中国设计秀
TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()ANA中国设计秀

3,nullANA中国设计秀
int i=rs.getInt("age");ANA中国设计秀
if(!rs.wasNull())....//RecordSet::wasNull()用来检查nullANA中国设计秀
4,存取大字符串和二进制文本ANA中国设计秀
对于数据库中longvarchar和langvarbinary进行流操作ANA中国设计秀
ResultSet rs=stmt.executeQueryString("select ...");ANA中国设计秀
BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串ANA中国设计秀
BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));ANA中国设计秀
BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二进制文本ANA中国设计秀
//取数据必须在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后马上进行ANA中国设计秀

ANA中国设计秀
五,浏览ResultSetANA中国设计秀
1,JDBC2.0提供了更多浏览ResultSet的方法ANA中国设计秀
首先,确定你的jdbc驱动程序支持jdbc2.0ANA中国设计秀
其次,由Connection生成Statement时要指定参数ANA中国设计秀
Statement stmt=con.getStatement("游标类型", "记录更新权限");ANA中国设计秀
游标类型:ANA中国设计秀
ResultSet.TYPE_FORword_ONLY:只可以向前移动ANA中国设计秀
ResultSet.TYPE_SCROLL_INSENSITIVE:可卷动。但是不受其他用户对数据库更改的影响。ANA中国设计秀
ResultSet.TYPE_SCROLL_SENSITIVE:可卷动。当其他用户更改数据库时这个记录也会改变。ANA中国设计秀
记录更新权限:ANA中国设计秀
ResultSet.CONCUR_READ_ONLY,只读ANA中国设计秀
ResultSet.CONCUR_UPDATABLE,可更新ANA中国设计秀

getStatement()缺省参数:getStatement(ResultSet.TYPE_FORword_ONLY, ResultSet.CONCUR_READ_ONLY)ANA中国设计秀
2,如果ResultSet是可卷动的,以下函数可以使用:ANA中国设计秀
rs.absolute()//绝对位置,负数表示从后面数ANA中国设计秀
rs.first()第一条ANA中国设计秀
rs.last()最后一条ANA中国设计秀
rs.previoust()前一条ANA中国设计秀
rs.next()后一条ANA中国设计秀
rs.beforeFirst()第一条之前ANA中国设计秀
rs.afterLast()最后之后ANA中国设计秀
rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLastANA中国设计秀
注意,刚打开的时候是处于第一条记录之前的ANA中国设计秀

六,更新数据库ANA中国设计秀
1,stmt.executeUpdate("strSql"),strSql是一条sql更新语句。update,insert,delete返回影响到的条数ANA中国设计秀
2,stmt.execute()方法在不知道sql语句是查询还是更新的时候用。如果产生一条以上的对象时,返回true,此时可用 stmt.getResultSet()和stmt.getUpdateCount()来获取execute结果,如果不返回ResultSet对象则返回false.ANA中国设计秀
3,除了Statement的executeUpdate之外还可以用ResultSet:ANA中国设计秀
rs.updateInt(1,10);ANA中国设计秀
rs.updateString(2,"sfafd");ANA中国设计秀
rs.updateRow();ANA中国设计秀

七,使用预编译PreparedStatementANA中国设计秀
PreparedStatement对象和Statement对象类似,都可以用来执行SQL语句。不同在于,数据库会对PreparedStatement的SQL语句进行预编译,而且仍旧能输入参数并重复执行编译好的查询速度比未编译的要快。ANA中国设计秀
PreparedStatement stmt=con.preparedStatement("Insert Into users(userid, username) values(?,?)");ANA中国设计秀
stmt.clearParameters();ANA中国设计秀
stmt.setInt(1,2);ANA中国设计秀
stmt.setString(2,"Big");ANA中国设计秀
stmt.executeUpdate();ANA中国设计秀

八,执行存储过程ANA中国设计秀
1,JDBC调用存储过程,并使用存储过程的返回值。这样可以将处理工作分为服务端和客户端两部分,并大大加快系统的设计和开发的时间。比如可以重复使用服务器上的组件。使用存储过程之后大量诸计算工作可以交给数据库服务器来处理,这将降低Web服务器的负载,从而提高整个系统的性能。ANA中国设计秀
2,有两个表UserMain{UserID,UserName,UserType},UserRef{BrefID, UserID, UserBrief}ANA中国设计秀
下面的存储过程可以接受jdbc传来的参数,新增内容到UserMain和UserRef,并输出一个OutUserID.ANA中国设计秀
CREATE PROCEDURE ap_adduserANA中国设计秀
(ANA中国设计秀
@OutUserID int output, //此为输出参数,output标记ANA中国设计秀
@UserName varchar(25), //参数表示方法:"@XXX"为变量名,"变量名 类型 [output]"ANA中国设计秀
@UserType tinyint,ANA中国设计秀
@UserBrief varchar(255),ANA中国设计秀
)ANA中国设计秀
ASANA中国设计秀
Declare @UserID int //定义局部变量ANA中国设计秀
insert into UserMain(UserName, UserType)ANA中国设计秀
values(@UserName,@UserType)ANA中国设计秀
select @UserID=@@IDENTITY //赋值用select,此处自动获得IDANA中国设计秀
insert into UserRef(UserID, UserBrief)ANA中国设计秀
select @OutUserID=@UserIDANA中国设计秀
GO/*结束,基本结构:ANA中国设计秀
CREATE PROCEDURE procedureName(ANA中国设计秀
parametersANA中国设计秀
)ANA中国设计秀
ASANA中国设计秀
actionsANA中国设计秀
GOANA中国设计秀
*/ANA中国设计秀

ANA中国设计秀
JSP页面中这样使用:ANA中国设计秀
CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");ANA中国设计秀
stmt.registerOutParameter(1,Types.INTEGER,1);//注册输出变量ANA中国设计秀
stmt.setString(2,"edmund");ANA中国设计秀
stmt.setInt(3,1);ANA中国设计秀
stmt.setString(4,"description");ANA中国设计秀
stmt.execute();ANA中国设计秀
int userid=stmt.getInt(1);ANA中国设计秀
stmt.close()ANA中国设计秀

八,使用事务ANA中国设计秀
1,事务中的操作是一个整体,要么都执行成功要么都不成功:事务开始后,如果所有的改变都正确,则使用commit方法将这些动作全部存入数据库,否则就使用rollback取消所有的改变动作,而这时数据库中的数据和执行事务前的是相同的。ANA中国设计秀
2,使用事务时应当先用 con.setAutoCommit(false),最后使用commit或者rollbackANA中国设计秀
3,rollback一般在catch段执行ANA中国设计秀
九,数据库连接池ANA中国设计秀
1,如果有一个数据库连接请求并且连接中没有连接,则生成一个新的连接。这个连接使用完之后并不关闭它,而是将它放入连接池。在这个过程中,还要判断连接池中的连接是否超期。如果超期则将它关闭。ANA中国设计秀
2,有很多已有的Connection Pool包可以使用。ANA中国设计秀
3,一般将Connection Pool作为一个application作用域的变量使用ANA中国设计秀
<jsp:useBean id="pool" scope="application" class="javastart.tools.ConnectionPool" />ANA中国设计秀
<%@page import="java.sql.*"%>ANA中国设计秀
<%@page import="javastart.tools.*"%>ANA中国设计秀
<!--javastart.tools是你的Connection Pool所在的地方-->ANA中国设计秀
DBConnection con=null;ANA中国设计秀
try{ANA中国设计秀
con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");ANA中国设计秀
Statement stmt=con.createStatement();ANA中国设计秀
stmt.setMaxRows(10);ANA中国设计秀
String query=request.getParameter("quey");ANA中国设计秀
ResultSet rs=stml.executeQuery(query);ANA中国设计秀
ResultSetMetaData rsmd=rs.getMetaData();ANA中国设计秀
}ANA中国设计秀
.....ANA中国设计秀
finally{ANA中国设计秀
pool.releaseConnection(con);ANA中国设计秀
}ANA中国设计秀

也可以使用一个Servlet初始化连接池ANA中国设计秀

本文引用地址:/bc/article_46672.html
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明