仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1445|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页设计JSP中SQL数据库编程手艺

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:34:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。js|编程|数据|数据库JSP中SQL数据库编程手艺
一,SQL温习
1,SQL语句分为两类:DDL(DataDefinitionLanguage)和DML(DatManipulationLanguge,数据操纵言语)。前者次要是界说数据逻辑布局,包含界说表、视图和索引;DML次要是对数据库举行查询和更新操纵。
2,CreateTable(DDL):
CreateTabletabName(
colName1colType1[else],
colName2colType2[else],
...,
colNamencolTypen[else]
);
比方:CteateTablepJoiner(
pnochar(6)notnull,
enochar(6)nutnull
);
charintvarchar等等都是用来界说列数据范例的保存字,个中varchar暗示可变字符范例。
3,Select<col1>,<col2>,...,<coln>
From<tab1>,<tab2>,...,<tabm>
[Where<前提>]

前提中的子查询:
WhereNotExists(
Select*Fromtab2Wherecol1=col2
)//当查询了局为空时,前提为真。

4,INSERTINTO<tab1>VALUES(<col1>,...<coln>)
5,DELETEFROM<tab1>[WHERE<前提>]
6,UPDATE<tab1>
SET<tab1>=<vlu1>
...
<tabn>=<vlun>
[WHERE<前提>]
比方:
Updateexployee
Setage=27
Wherename=赵一
二,JDBC次要接口:
java.sql.DriverManager类用于处置驱动程序的调进而且对新的数据库毗连供应撑持。
java.sql.Connection,指使用程序与特定命据库的毗连。
java.sql.Statement,用于一样平常sql语句的实行(能够是查询、更新乃至能够创立数据库的实行历程)
java.sql.ResultSet,查询所前往的了局保留在此对象中,用它能够扫瞄和存取数据库内的纪录。

1,经由过程jdbc-odbc桥利用odbc数据库(其实不必要jdbcDrivers)

先在odbcDSN(DataSourceName)设置处设置pubssysDSN,sa为username,暗码为空
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序
con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs
con.close();
//应该catchClassNotFoundException和SQLException

Connection的getWarning办法前往一个SQLWarning对象,在毗连之前应该先反省。
利用jdbc-odbc的最年夜优点是:收费的。可是功能受odbc的限定,并且一样平常odbc驱动对照高贵。
2,利用专门的jdbc驱动程序。//此处是mmjdbcDriver
先将jar文件放在ClassPath内里。
Class.forName("org.gjt.mm.mysql.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");
con.close();

可见利用何种体例毗连何种数据库与数据库的操纵和毗连数据库是有关的。
三,查询数据库
Statementstmt=con.createStatement();
stmt.setMaxRows()能够把持输入纪录最年夜数目;
ResultSetrs=stmt.executeQuery("select.....");

ResultSet指向以后纪录:
intuserId=rs.getInt("userid");
StringuserName=rs.getString("username");
...大概用序号(从1入手下手的)
intuserId=rs.getInt(1);
StirnguserName=rs.getString(2);

ClassNotFoundException是因为Class.forName()没法载进jdbc驱动程序触发的
SQLException是jdbc在实行过程当中产生成绩时发生。有一个分外的办法getNextException()
catch(SQLExceptione){
out.println(e.getMessage());
while(e=e.getNextException()){
out.println(e.getMessage());
}
}

一样平常来讲其实不倡议在jsp中编写数据库的会见程序,能够将数据库的会见封装在一个javabean中。
四,ResultSet深切
1,ResultSetMetaData
ResultSetrs=stmt.executeQuery("select....");
ResultSetMetaDatarsmd=rs.getMetaData();//猎取ResultSetMateData对象
intnumberOfColumns=rsmd.getColumnCount();//前往列数
booleanb=rsmd.isSearchable(inti);//前往第i列是不是能够用于where子句
Stringc=rsmd.getColumnLabel(inti);//猎取第i列的列标
Objcetobj=rs.getObject();
if(obj!=null)out.println(obj.toString());
elseprintln("");
2,SQL范例与ResultSet的getObject前往范例及对应的XXXgetXXX()办法
SQL范例JSP范例对应的getXXX()办法
――――――――――――――――――――――――――――――――――――――――――――
CHARStringStringgetString()
VARCHARStringStringgetString()
LONGVARCHARStringInputStreamgetAsciiStream()/getUnicodeStream()
NUMERICjava.math.BigDecimaljava.math.BigDecimalgetBigDecimal()
DECIMAL同上
BITBooleanbooleangetBoolean()
TINYINTIntegerbytegetByte()
SMALLINTIntegershortgetShort()
INTEGERIntegerintgetInt()
BIGINTLonglonggetLong()
REALFloatfloatgetFloat()
FLOATDoubledoublegetDouble()
DOUBLEDoubledoublegetDouble()
BINARYbyte[]byte[]getBytes()
VARBINARYbyte[]byte[]getBytes()
LONGVARBINARYbyte[]InputStreamgetBinaryStream()
DATEjava.sql.Datejava.sql.DategetDate()
TIMEjava.sql.Timejava.sql.TimegetTime()
TIMESTAMPjava.sql.Timestampjava.sql.TimestampgetTimestamp()

3,null
inti=rs.getInt("age");
if(!rs.wasNull())....//RecordSet::wasNull()用来反省null
4,存取年夜字符串和二进制文本
关于数据库中longvarchar和langvarbinary举行流操纵
ResultSetrs=stmt.executeQueryString("select...");
BufferedReaderbr=newBufferedReader(newInputStream(rs.getAsciiStream("vol1")));//长文本串
BufferedReaderbr=newBufferedReader(newInputStream(rs.getUnicodeStream("vol1")));
BufferedReaderbr=newBufferedReader(newInputStream(rs.getBinaryStream("vol2")));//长二进制文本
//取数据必需在rs.getAsciiStream(),rs.getUnicodeStream(),rs.getBinaryStream()等以后即刻举行

五,扫瞄ResultSet
1,JDBC2.0供应了更多扫瞄ResultSet的办法
起首,断定你的jdbc驱动程序撑持jdbc2.0
其次,由Connection天生Statement时要指定参数
Statementstmt=con.getStatement("游标范例","纪录更新权限");
游标范例:
ResultSet.TYPE_FORWORD_ONLY:只能够向前挪动
ResultSet.TYPE_SCROLL_INSENSITIVE:可卷动。可是不受其他用户对数据库变动的影响。
ResultSet.TYPE_SCROLL_SENSITIVE:可卷动。当其他用户变动数据库时这个纪录也会改动。
纪录更新权限:
ResultSet.CONCUR_READ_ONLY,只读
ResultSet.CONCUR_UPDATABLE,可更新

getStatement()缺省参数:getStatement(ResultSet.TYPE_FORWORD_ONLY,ResultSet.CONCUR_READ_ONLY)
2,假如ResultSet是可卷动的,以下函数可使用:
rs.absolute()//相对地位,正数暗示从前面数
rs.first()第一条
rs.last()最初一条
rs.previoust()前一条
rs.next()后一条
rs.beforeFirst()第一条之前
rs.afterLast()最初以后
rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLast
注重,刚翻开的时分是处于第一笔记录之前的

六,更新数据库
1,stmt.executeUpdate("strSql"),strSql是一条sql更新语句。update,insert,delete前往影响到的条数
2,stmt.execute()办法在不晓得sql语句是查询仍是更新的时分用。假如发生一条以上的对象时,前往true,此时可用stmt.getResultSet()和stmt.getUpdateCount()来猎取execute了局,假如不前往ResultSet对象则前往false.
3,除Statement的executeUpdate以外还能够用ResultSet:
rs.updateInt(1,10);
rs.updateString(2,"sfafd");
rs.updateRow();

七,利用预编译PreparedStatement
PreparedStatement对象和Statement对象相似,都能够用来实行SQL语句。分歧在于,数据库会对PreparedStatement的SQL语句举行预编译,并且仍然能输出参数偏重复实行编译好的查询速率比未编译的要快。
PreparedStatementstmt=con.preparedStatement("InsertIntousers(userid,username)values(?,?)");
stmt.clearParameters();
stmt.setInt(1,2);
stmt.setString(2,"Big");
stmt.executeUpdate();
八,实行存储历程
1,JDBC挪用存储历程,并利用存储历程的前往值。如许能够将处置事情分为服务端和客户端两部分,并年夜年夜加速体系的计划和开辟的工夫。好比能够反复利用服务器上的组件。利用存储历程以后大批诸盘算事情能够交给数据库服务器来处置,这将下降Web服务器的负载,从而进步全部体系的功能。
2,有两个表UserMain{UserID,UserName,UserType},UserRef{BrefID,UserID,UserBrief}
上面的存储历程能够承受jdbc传来的参数,新增内容到UserMain和UserRef,并输入一个OutUserID.
CREATEPROCEDUREap_adduser
(
@OutUserIDintoutput,//此为输入参数,output标志
@UserNamevarchar(25),//参数暗示办法:"@XXX"为变量名,"变量名范例[output]"
@UserTypetinyint,
@UserBriefvarchar(255),
)
AS
Declare@UserIDint//界说部分变量
insertintoUserMain(UserName,UserType)
values(@UserName,@UserType)
select@UserID=@@IDENTITY//赋值用select,此处主动取得ID
insertintoUserRef(UserID,UserBrief)
select@OutUserID=@UserID
GO/*停止,基础布局:
CREATEPROCEDUREprocedureName(
parameters
)
AS
actions
GO
*/


JSP页面中如许利用:
CallableStatementstmt=con.prepareCall("{callap_adduser(?,?,?,?)}");
stmt.registerOutParameter(1,Types.INTEGER,1);//注册输入变量
stmt.setString(2,"edmund");
stmt.setInt(3,1);
stmt.setString(4,"description");
stmt.execute();
intuserid=stmt.getInt(1);
stmt.close()
八,利用事件
1,事件中的操纵是一个全体,要末都实行乐成要末都不乐成:事件入手下手后,假如一切的改动都准确,则利用commit办法将这些举措全体存进数据库,不然就利用rollback作废一切的改动举措,而这时候数据库中的数据和实行事件前的是不异的。
2,利用事件时应该先用con.setAutoCommit(false),最初利用commit大概rollback
3,rollback一样平常在catch段实行
九,数据库毗连池
1,假如有一个数据库毗连哀求而且毗连中没有毗连,则天生一个新的毗连。这个毗连利用完以后其实不封闭它,而是将它放进毗连池。在这个过程当中,还要判别毗连池中的毗连是不是超期。假如超期则将它封闭。
2,有良多已有的ConnectionPool包可使用。
3,一样平常将ConnectionPool作为一个application感化域的变量利用
<jsp:useBeanid="pool"scope="application"class="javastart.tools.ConnectionPool"/>
<%@pageimport="java.sql.*"%>
<%@pageimport="javastart.tools.*"%>
<!--javastart.tools是你的ConnectionPool地点的中央-->
DBConnectioncon=null;
try{
con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");
Statementstmt=con.createStatement();
stmt.setMaxRows(10);
Stringquery=request.getParameter("quey");
ResultSetrs=stml.executeQuery(query);
ResultSetMetaDatarsmd=rs.getMetaData();
}
.....
finally{
pool.releaseConnection(con);
}

也能够利用一个Servlet初始化毗连池


Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.
金色的骷髅 该用户已被删除
沙发
发表于 2015-1-21 10:33:38 | 只看该作者
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
小妖女 该用户已被删除
板凳
发表于 2015-1-30 15:13:54 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
透明 该用户已被删除
地板
发表于 2015-2-1 11:06:24 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-7 04:27:16 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
小女巫 该用户已被删除
6#
发表于 2015-2-10 10:05:23 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
莫相离 该用户已被删除
7#
发表于 2015-3-1 08:12:44 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
精灵巫婆 该用户已被删除
8#
发表于 2015-3-10 12:59:37 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
谁可相欹 该用户已被删除
9#
发表于 2015-3-16 22:16:52 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
深爱那片海 该用户已被删除
10#
发表于 2015-3-23 04:30:23 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
第二个灵魂 该用户已被删除
11#
发表于 2015-3-27 01:10:19 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
再现理想 该用户已被删除
12#
发表于 2015-4-9 12:23:43 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
admin 该用户已被删除
13#
发表于 2015-4-11 01:25:35 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
再见西城 该用户已被删除
14#
发表于 2015-4-11 08:11:22 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
只想知道 该用户已被删除
15#
发表于 2015-4-22 11:46:00 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
灵魂腐蚀 该用户已被删除
16#
发表于 2015-5-4 07:33:41 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
海妖 该用户已被删除
17#
发表于 2015-5-10 11:34:53 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
变相怪杰 该用户已被删除
18#
发表于 2015-6-5 06:20:53 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
分手快乐 该用户已被删除
19#
发表于 2015-6-12 15:17:45 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
若天明 该用户已被删除
20#
发表于 2015-6-22 05:14:16 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 16:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表