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
From
[Where<条件>]
条件中的子查询:
WhereNotExists(
Select*Fromtab2Wherecol1=col2
)//当查询结果为空时,条件为真。
4,INSERTINTO
5,DELETEFROM
6,UPDATE
SET
...
[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()等之后马上进行