|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具 |
|