在SQlServer数据库上构建JAVA应用程序理论课.docx
- 文档编号:30294720
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:31
- 大小:247.57KB
在SQlServer数据库上构建JAVA应用程序理论课.docx
《在SQlServer数据库上构建JAVA应用程序理论课.docx》由会员分享,可在线阅读,更多相关《在SQlServer数据库上构建JAVA应用程序理论课.docx(31页珍藏版)》请在冰豆网上搜索。
在SQlServer数据库上构建JAVA应用程序理论课
在SQLServer数据库上构建JAVA应用程序
Ø
⏹本章技能目标
◆掌握在JAVA环境访问SqlServer数据库
会使用事务解决银行转帐问题
1.JDBCDriver简介
SUN定义的四种JDBC驱动程序标准:
ØType1JDBC-ODBC桥
作为JDK1.1后的一部分,是sun.jdbc.odbc包的一部分。
Application-->JDBC-ODBCBridge(Type1jdbcdriver>--->JDBC-ODBCLibrary-->ODBCDriver-->Databaseb5E2RGbCAP
适用于快速的原型系统,没有提供JDBC驱动的数据库如Access
ØType2JAVAtoNativeAPI
利用开发商提供的本地库来直接与数据库通信。
Application--->JDBCDriver(Type2jdbcdriver>--->NativeDatabaselibrary--->Databasep1EanqFDPw
比Type1性能略好。
ØType3Javatonet
Application--->JdbcDriver(Type3jdbcdriver>--->javamiddleware--->JDBCDriver--->DatabaseDXDiTa9E3d
具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的。
ØType4JAVAtonativedababase
Application--->Jdbcdriver(type4jdbcdriver>--->databaseengine--->databaseRTCrpUDGiT
最高的性能,通过自己的本地协议直接与数据库引擎通信,具备在Internet装配的能力。
.
4种类型JDBC驱动程序的比较
Type1
Type2
Type3
Type4
客户端设置
设置ODBC
设置数据库连接的函数库
无
无
服务器端设置
无
无
中间层服务器
无
效能
较差
优
较差
优
100%Java
否
否
是
是
使用时机
测试
数据库连接的函数库以安装
Applet
JavaApplication
MicrosoftSQLServerJDBC驱动程序是与Java数据库连接(JDBC>4.0兼容的驱动程序,可提供对MicrosoftSQLServer数据库的可靠数据访问。
5PCzVD7HxA
SQLServerJDBCDriver在每个安装包中都包括2个JAR类库:
sqljdbc.jar和sqljdbc4.jar。
jLBHrnAILg
sqljdbc.jar类库提供对JDBC3.0的支持。
sqljdbc.jar类库要求使用5.0版的Java运行时环境(JRE>。
连接到数据库时,在JRE6.0上使用sqljdbc.jar会引发异常。
xHAQX74J0X
注意:
JDBCDriver2.0不支持JRE1.4。
使用JDBCDriver2.0时必须将JRE1.4升级至JRE5.0或更高版本。
在某些情况下,您可能需要重新编译应用程序,因为它可能与JDK5.0或更高版本不兼容。
有关详细信息,请参阅SunMicrosystems网站上的文档。
LDAYtRyKfE
sqljdbc4.jar类库提供对JDBC4.0的支持。
它不仅包括sqljdbc.jar的所有功能,还包括新增的JDBC4.0方法。
Zzz6ZB2Ltk
sqljdbc4.jar类库要求使用6.0或更高版本的Java运行时环境(JRE>。
在JRE1.4或5.0上使用sqljdbc4.jar会引发异常。
dvzfvkwMI1
注意:
如果应用程序必须在JRE6.0上运行,即使该应用程序不使用JDBC4.0功能,也应使用sqljdbc4.jar。
rqyn14ZNXI
Ø会创建索引用于升序或降序访问
Ø会创建各种视图方便不同用户查看数据
2.开发环境配置
我们以Eclipse为例介绍。
Ø第一步:
找到jdbc驱动。
可以使用MicrosoftSQLServerJDBC驱动程序。
Ø第二步设置eclipse
选择windows->preferences->java->BuildPath->UserLibarary如下图:
EmxvxOtOco
点击New,输入UserLibararyName如:
oracle10。
确定后,点击AddJARS,选择找到的JDBC驱动目录。
选择目录下的sqljdbc所有文件。
(可以根据JRE不同选择不同的文件>
OK确定完成,就配置了一个用户自定义的类库。
在工程中就可以使用了。
Ø第四步设置工程
首先创建一个工程,如JDBCSqlServerTest.
右键点击工程名->BuildPath->ConfigerBuildPath_>Libraries选项卡->addliabrariesSixE2yXPq5
选择UserLibarary。
选择我们上面创建的Oracle10g用户定义类库。
Ø在MyEclipse插件的DbBrowser中查看SqlServer数据库。
打开DBBrowser视图。
右键选择new,打开如下窗口。
选择驱动程序的模版,编写连接URL,AddJARS选择SqlServer的驱动程序。
下一步。
点击Add按钮。
选择想要查看的SCHEMAS。
OK确定。
完成后,打开新建立的连接。
如下图:
可以查看相关的数据库对象。
3.数据库的访问操作JDBC
下面我们就使用JDBC驱动程序来完成数据库的增删改查以及调用存储过程或函数的相关操作。
3.1基础数据的准备。
我们使用如下表Student完成我们的操作,和我们的SQLSERVER课程中的相同。
整型stuId自增1
字符型stuName
整型age
准备工作:
连接SqlServer数据库的各种sqlserverJDBC驱动程序的步骤。
这一些步骤包括:
1、导入JDBC包
2、注册SqlServerJDBC驱动程序
3、打开数据库连接
4、运行SQLDML语句在数据库表中获取、添加、改正和删除行
3.1.1连接数据库的代码
不论那一种JDBC驱动程序。
都是使用com.microsoft.sqlserver.jdbc.SQLServerDriver类。
6ewMyirQFL
使用import指令导入importjava.sql.*类中的类型。
下面是使用ConnectionManager类管理数据库连接对象。
定义数据库连接使用的一些常量。
如下:
publicclassConnectionManager{
//SQlServer2000
privatestaticfinalStringDRIVER_CLASS="com.microsoft.jdbc.sqlserver.SQLServerDriver"。
privatestaticfinalStringDATABASE_URL="jdbc:
microsoft:
sqlserver:
//localhost:
1433。
DatabaseName=news"。
privatestaticfinalStringDATABASE_USRE="sa"。
privatestaticfinalStringDATABASE_PASSWORD="sa"。
//SQlServer2005
privatestaticfinalStringDRIVER_CLASS="com.microsoft.sqlserver.jdbc.SQLServerDriver"。
privatestaticfinalStringDATABASE_URL="jdbc:
sqlserver:
//localhost:
1433。
DatabaseName=news"。
privatestaticfinalStringDATABASE_USRE="sa"。
privatestaticfinalStringDATABASE_PASSWORD="sa"。
获取连接代码:
publicstaticConnectiongetConnection(>{
ConnectiondbConnection=null。
try{
Class.forName(DRIVER_CLASS>。
dbConnection=DriverManager.getConnection(DATABASE_URL,
DATABASE_USRE,DATABASE_PASSWORD>。
}catch(Exceptione>{
e.printStackTrace(>。
}
returndbConnection。
}
关闭连接代码:
publicstaticvoidcloseConnection(ConnectiondbConnection>{
try{
if(dbConnection!
=null&&(!
dbConnection.isClosed(>>>{
dbConnection.close(>。
}
}catch(SQLExceptionsqlEx>{
sqlEx.printStackTrace(>。
}
}
关闭Statement代码:
publicstaticvoidcloseStatement(PreparedStatementpStatement>{
try{
if(pStatement!
=null>{
pStatement.close(>。
pStatement=null。
}
}catch(SQLExceptione>{
e.printStackTrace(>。
}
}
关闭结果集代码:
publicstaticvoidcloseResultSet(ResultSetres>{
try{
if(res!
=null>{
res.close(>。
res=null。
}
}catch(SQLExceptione>{
e.printStackTrace(>。
}
}
Web应用中可以使用JNDI配置。
如Tomcat下Config.xml文件配置如下。
maxActive="4"maxIdle="2"username="sa"maxWait="5000"driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" password="sa" url="jdbc: sqlserver: //localhost: 1433。 DatabaseName=print"/> importjavax.naming.Context。 importjavax.naming.InitialContext。 importjavax.sql.DataSource。 publicstaticConnectiongetConnection1(>{ ConnectiondbConnection=null。 try{ Contextctx=newInitialContext(>。 DataSourceds=(DataSource>ctx.lookup("java: comp/jdbc/print">。 dbConnection=ds.getConnection(>。 }catch(Exceptione>{ e.printStackTrace(>。 } returndbConnection。 } 3.1.2删除数据代码: 1: 使用参数化方式生成SQL语句 publicstaticintdeleteStudent(intstuID>{ Connectioncon=null。 PreparedStatementpStatement=null。 introw=0。 try{ //获取连接 con=ConnectionManager.getConnection(>。 StringstrSql="deletefromStudentwherestuId=? "。 //编译SQL语句 pStatement=con.prepareStatement(strSql>。 pStatement.setInt(1,stuID>。 row=pStatement.executeUpdate(>。 System.out.println("成功删除了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(pStatement>。 ConnectionManager.closeConnection(con>。 } returnrow。 } 3: 使用存储过程的方式 删除存储过程代码如下: CREATEPROCEDURE[dbo].[usp_DeleteStudent] @stuIDint AS --SETNOCOUNTON DELETEFROM[dbo].[Student] WHERE [stuID]=@stuID 使用CallableStatement执行存储过程的调用。 调用的时候注意使用包名.过程名,代码如下: publicstaticintdeleteStudentsp(intstuID>{ Connectioncon=null。 CallableStatementcstm=null。 introw=0。 try{ //获取连接 con=ConnectionManager.getConnection(>。 cstm=con.prepareCall("{callusp_DeleteStudent(? >}">。 cstm.setInt(1,stuID>。 row=cstm.executeUpdate(>。 System.out.println("成功删除了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(cstm>。 ConnectionManager.closeConnection(con>。 } returnrow。 } 使用PreparedStatement执行存储过程的调用 publicstaticintdeleteStudentsp1(intstuID> { Connectioncon=null。 PreparedStatementpstm=null。 introw=0。 try{ //获取连接 con=ConnectionManager.getConnection(>。 pstm=con.prepareCall("{callusp_DeleteStudent(? >}">。 pstm.setInt(1,stuID>。 row=pstm.executeUpdate(>。 System.out.println("成功删除了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(pstm>。 ConnectionManager.closeConnection(con>。 } returnrow。 } 3.1.3插入数据代码: 1: 使用格式化字符串方式生成SQl语句 publicstaticintinsertStudent0(intage,StringstuName>{ Connectioncon=null。 PreparedStatementpStatement=null。 introw=0。 try{ //获取连接 con=ConnectionManager.getConnection(>。 StringstrSql="insertintostudent(age,stuName>values({0,number,#},''{1}''>"。 Object[]testArgs={newInteger(age>,stuName}。 strSql=java.text.MessageFormat.format(strSql,testArgs>。 System.out.println(strSql>。 //编译SQL语句 pStatement=con.prepareStatement(strSql>。 row=pStatement.executeUpdate(>。 System.out.println("成功插入了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(pStatement>。 ConnectionManager.closeConnection(con>。 } returnrow。 } Object[]testArgs={null,stuName}。 可以在age字段插入NULL值。 kavU42VRUs 2: 使用参数化方式生成SQL语句。 publicstaticintinsertStudent(intage,StringstuName> { introw=0。 Connectioncon=null。 PreparedStatementpStatement=null。 try{ //获取连接 con=ConnectionManager.getConnection(>。 StringstrSql="insertintoStudent(stuName,age>values(? ? >"。 //编译SQL语句 pStatement=con.prepareStatement(strSql>。 pStatement.setString(1,stuName>。 pStatement.setInt(2,age>。 row=pStatement.executeUpdate(>。 System.out.println("成功插入了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(pStatement>。 ConnectionManager.closeConnection(con>。 } returnrow。 } pStatement.setObject(2,null>。 可以在age字段插入NULL值 3: 使用存储过程的方式。 添加代码如下: CreatePROCEDURE[dbo].[usp_InsertStudent1] @stuNamevarchar(50>, @ageint AS --SETNOCOUNTON --declare@stuIDint INSERTINTO[dbo].[Student]( [stuName], [age] >VALUES( @stuName, @age > 调用代码如下: publicstaticintinsertStudent1(intage,StringstuName>{ Connectioncon=null。 CallableStatementcstm=null。 introw=0。 try{ //获取连接 con=ConnectionManager.getConnection(>。 cstm=con.prepareCall("{callstuPack.usp_InsertStudent(? ? >}">。 cstm.setString(1,stuName>。 cstm.setInt(2,age>。 row=cstm.executeUpdate(>。 System.out.println("成功插入了"+row+"行数据! ">。 }catch(SQLExceptionsqlE>{ sqlE.printStackTrace(>。 }finally{ ConnectionManager.closeStatement(cstm>。 ConnectionManager.closeConnection(con>。 } returnrow。 } 4: 使用存储过程的方式 这次我们需要返回生成stuID,作为输出参数输出。 添加代码如下: CREATEPROCEDURE[dbo].[usp_InsertStudent] @stuNamevarchar(50>, @ageint, @stuIDintOUTPUT AS --SETNOCOUNTON INS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQlServer 数据库 构建 JAVA 应用程序 理论