当前位置: 首页 > 图文教程 > 网络编程 > JSP > JSP中SQL数据库编程技术

JSP
JavaBeans 程序开发从入门到精通教程
企业级应用中的Applet和Servlet的通信(一)
企业级应用中的Applet和Servlet的通信(三)
企业级应用中的Applet和Servlet的通信 (二)
Web开发中防止浏览器的刷新键引起系统操作重复提交
谈一下关于XHTML网页的制作
40种网页常用小技巧(javascript)←↓------[不时之需]
使用xmlhttp和Java session监听改善站内消息系统
JSP简明教程:行为标签与实例(转
jsp与javascript的结合在页面间传递参数
最基本的一个转换密码字符串为乱码以及解码的程序
55种网页常用小技巧(javascript)
jsp中标签的部署与调用
用jsp动态输出excel文档和中文乱码问题的解决
J2SDK和TOMCAT的安装及配置
web开发中的多条件查询处理技巧1则
JSP连接Mysql数据库攻略
Tomcat的Servlet配制
JSP/Servlet 中的汉字编码问题
Taglib原理和实现 第五章:再论支持El表达式和jstl标签

JSP中SQL数据库编程技术


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 45 ::
收藏到网摘: n/a

JSP中SQL数据库编程技术
一,SQL复习
 1,SQL语句分为两类:DDL(Data Definition Language)和DML(Dat Manipulation Languge,数据操作语言)。前者主要是定义数据逻辑结构,包括定义表、视图和索引;DML主要是对数据库进行查询和更新操作。
 2,Create Table(DDL):
  Create Table tabName(
   colName1 colType1 [else],
   colName2 colType2 [else],
   ...,
   colNamen colTypen [else]
  );
  例如:Cteate Table pJoiner(
   pno char(6) not null,
   eno char(6) nut null
   );
  char int varchar等等都是用来定义列数据类型的保留字,其中varchar表示可变字符类型。
 3,Select <col1>,<col2>,...,<coln>
  From <tab1>,<tab2>,...,<tabm>
  [Where<条件>]
  
  条件中的子查询:
   Where Not Exists(
    Select * From tab2 Where col1=col2
   )//当查询结果为空时,条件为真。
   
 4,INSERT INTO <tab1> VALUES(<col1>, ...<coln>)
 5,DELETE FROM <tab1> [WHERE<条件>]
 6,UPDATE <tab1>
  SET <tab1>=<vlu1>
  ...
  <tabn>=<vlun>
  [WHERE<条件>]
  例如:
   Update exployee
   Set age=27
   Where name='赵一'
二,JDBC 主要接口:
 java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。
 java.sql.Connection,指应用程序与特定数据库的连接。
 java.sql.Statement,用于一般sql语句的执行(可以是查询、更新甚至可以创建数据库的执行过程)
 java.sql.ResultSet,查询所返回的结果保存在此对象中,用它可以浏览和存取数据库内的记录。
 
 1,通过jdbc-odbc桥使用odbc数据库(并不需要jdbc Drivers)
 
  先在odbc DSN(Data Source Name)设置处设置pubs sysDSN,sa为username,密码为空
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序
  con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs   
  con.close();
  //应当catch ClassNotFoundException和SQLException
 
  Connection的getWarning方法返回一个SQLWarning对象,在连接之前应当先检查。
    使用jdbc-odbc的最大好处是:免费的。但是性能受odbc的限制,而且一般odbc驱动比较昂贵。
 2,使用专门的jdbc驱动程序。//此处是mm jdbc Driver
  先将jar文件放在ClassPath里面。
  Class.forName("org.gjt.mm.mysql.Driver");
  con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");
  con.close();
  
  可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。
三,查询数据库
 Statement stmt=con.createStatement();
 stmt.setMaxRows()可以控制输出记录最大数量;
 ResultSet rs=stmt.executeQuery("select .....");
 
 ResultSet指向当前记录:
  int userId=rs.getInt("userid");
  String userName=rs.getString("username");
  ...或者用序号(从1开始的)
  int userId=rs.getInt(1);
  Stirng userName=rs.getString(2);
 
 ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的
 SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()
  catch(SQLException e){
   out.println(e.getMessage());
   while(e=e.getNextException()){
    out.println(e.getMessage());
   }
  }
   
 一般来说并不建议在jsp中编写数据库的访问程序,可以将数据库的访问封装在一个javabean中。
四,ResultSet深入
 1,ResultSetMetaData
  ResultSet rs=stmt.executeQuery("select....");
  ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象
  int numberOfColumns=rsmd.getColumnCount();//返回列数
  boolean b=rsmd.isSearchable(int i);//返回第i列是否可以用于where子句
  String c=rsmd.getColumnLabel(int i);//获取第i列的列标
  Objcet obj=rs.getObject();
  if(obj!=null)out.println(obj.toString());
  else println("");
 2,SQL类型与ResultSet的getObject返回类型及对应的XXX getXXX()方法
  SQL类型  JSP类型   对应的getXXX()方法
  ????????????????????????????????????????????
  CHAR                         String                                            String getString()
  VARCHAR                 String                                            String getString()
  LONGVARCHAR      String                                            InputStream getAsciiStream()/getUnicodeStream()
  NUMERIC                  java.math.BigDecimal              java.math.BigDecimal getBigDecimal()
  DECIMAL                   同上
  BIT                              Boolean                                       boolean getBoolean()
  TINYINT                     Integer                                          byte getByte()
  SMALLINT                 Integer                                          short getShort()
  INTEGER                  Integer                                          int getInt()
  BIGINT                       Long                                             long getLong()
  REAL                         Float                                              float getFloat()
  FLOAT                       Double                                          double getDouble()
  DOUBLE                   Double                                          double getDouble()
  BINARY                     byte[]                                              byte[] getBytes()
  VARBINARY              byte[]                                              byte[] getBytes()
  LONGVARBINARY   byte[]                                              InputStream getBinaryStream()
  DATE                          java.sql.Date                               java.sql.Date getDate()
  TIME                           java.sql.Time                               java.sql.Time getTime()
  TIMESTAMP              java.sql.Timestamp                   java.sql.Timestamp getTimestamp()
  
 3,null 
  int i=rs.getInt("age");
  if(!rs.wasNull())....//RecordSet::wasNull()用来检查null
 4,存取大字符串和二进制文本
  对于数据库中longvarchar和langvarbinary进行流操作
  ResultSet rs=stmt.executeQueryString("select ...");
  BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串
  BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));
  BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二进制文本
  //取数据必须在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后马上进行