仓酷云

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

[学习教程] JAVA网站制作之jsp中的数据库编程

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:20:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
他们对jsp,servlet,javabean进行封装就是为了展示他们的某个思想,与java的开发并没有必然的关系,也不见得在所以情况下,别人使用起来会简单。js|编程|数据|数据库一,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初始化毗连池


唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具
透明 该用户已被删除
沙发
发表于 2015-1-20 20:49:24 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
再现理想 该用户已被删除
板凳
发表于 2015-1-25 10:08:25 来自手机 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
活着的死人 该用户已被删除
地板
发表于 2015-1-26 23:00:33 来自手机 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
admin 该用户已被删除
5#
发表于 2015-2-5 16:58:18 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
6#
发表于 2015-2-6 09:52:28 | 只看该作者
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
爱飞 该用户已被删除
7#
发表于 2015-2-15 22:21:18 | 只看该作者
是一种突破用户端机器环境和CPU
谁可相欹 该用户已被删除
8#
发表于 2015-3-1 17:02:15 | 只看该作者
是一种为 Internet发展的计算机语言
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-5 07:21:28 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
老尸 该用户已被删除
10#
发表于 2015-3-6 20:04:46 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
兰色精灵 该用户已被删除
11#
发表于 2015-3-9 00:27:00 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
愤怒的大鸟 该用户已被删除
12#
发表于 2015-3-16 19:07:55 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
变相怪杰 该用户已被删除
13#
发表于 2015-3-22 23:50:08 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 21:24

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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