JSP中SQL数据库编程技术

js|编程|数据|数据库

 
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()等之后马上进行

五,浏览ResultSet
 1,JDBC2.0提供了更多浏览ResultSet的方法
  首先,确定你的jdbc驱动程序支持jdbc2.0
  其次,由Connection生成Statement时要指定参数
  Statement stmt=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语句进行预编译,而且仍旧能输入参数并重复执行编译好的查询速度比未编译的要快。
 PreparedStatement stmt=con.preparedStatement("Insert Into users(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.
  CREATE PROCEDURE ap_adduser
  (
  @OutUserID int output, //此为输出参数,output标记
  @UserName varchar(25), //参数表示方法:"@XXX"为变量名,"变量名 类型 [output]"
  @UserType tinyint,
  @UserBrief varchar(255),
  )
  AS
  Declare @UserID int //定义局部变量
  insert into UserMain(UserName, UserType) 
  values(@UserName,@UserType)
  select @UserID=@@IDENTITY //赋值用select,此处自动获得ID
  insert into UserRef(UserID, UserBrief)
  select @OutUserID=@UserID
  GO/*结束,基本结构:
   CREATE PROCEDURE procedureName(
    parameters
   )
   AS
    actions
   GO
  */
   
  
  JSP页面中这样使用:
  CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");
  stmt.registerOutParameter(1,Types.INTEGER,1);//注册输出变量
  stmt.setString(2,"edmund");
  stmt.setInt(3,1);
  stmt.setString(4,"description");
  stmt.execute();
  int userid=stmt.getInt(1);
  stmt.close()

八,使用事务
 1,事务中的操作是一个整体,要么都执行成功要么都不成功:事务开始后,如果所有的改变都正确,则使用commit方法将这些动作全部存入数据库,否则就使用rollback取消所有的改变动作,而这时数据库中的数据和执行事务前的是相同的。
 2,使用事务时应当先用 con.setAutoCommit(false),最后使用commit或者rollback
 3,rollback一般在catch段执行
九,数据库连接池
 1,如果有一个数据库连接请求并且连接中没有连接,则生成一个新的连接。这个连接使用完之后并不关闭它,而是将它放入连接池。在这个过程中,还要判断连接池中的连接是否超期。如果超期则将它关闭。
 2,有很多已有的Connection Pool包可以使用。
 3,一般将Connection Pool作为一个application作用域的变量使用
  <jsp:useBean id="pool" scope="application" class="javastart.tools.ConnectionPool" />
  <%@page import="java.sql.*"%>
  <%@page import="javastart.tools.*"%>
  <!--javastart.tools是你的Connection Pool所在的地方-->
  DBConnection con=null;
  try{
   con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");
   Statement stmt=con.createStatement();
   stmt.setMaxRows(10);
   String query=request.getParameter("quey");
   ResultSet rs=stml.executeQuery(query);
   ResultSetMetaData rsmd=rs.getMetaData();
  }
  .....
  finally{
   pool.releaseConnection(con);
  }
  
  也可以使用一个Servlet初始化连接池

时间: 2024-10-03 21:44:19

JSP中SQL数据库编程技术的相关文章

jsp中的数据库编程

js|编程|数据|数据库 一,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 c

在JSP中访问数据库方法

在JSP中访问数据库方法 JSP(JavaServer Pages)是由Sun 公司倡导.许多公司参与建立的一种动态网页技术标准.使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面.使用JSP标识(tag)或者小脚本(Scriptlet)来生成页面上的动态内容.生成内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行. 数据库连接对动态网站来说是最为重要的部分,Java中连接数据库的技术是JDBC(Java Datab

jsp中sql的insert语句问题

问题描述 jsp中sql的insert语句问题 下面这段话有什么问题,输入已有的用户名会执行"该用户名已存在",但是输入新的用户名显示注册成功但是数据库里没有新的记录,应该是赋值语句有问题,请问insert语句哪里错了呢 String username=request.getParameter("r_user"); String password=request.getParameter("r_password"); sql=conn.creat

Android开发中的多线程编程技术

Android开发中的多线程编程技术 [IT168技术]多线程这个令人生畏的"洪水猛兽",很多人谈起多线程都心存畏惧.在Android开发过程中,多线程真的很难吗?多线程程序的"麻烦"源于它很抽象.与单线程程序运行模式不同,但只要掌握了它们的区别,编写多线程程序就会很容易了.下面让我们集中精力开始学习吧! 多线程案例--计时器 我在给我的学生讲多线程的时候都会举一个计时器的案例,因为计时器案例是多线程的经典应用. 这个案例中,屏幕启动之后,进入如图8-1所示的界面.

JSP中操作数据库的常用SQL标签用法总结_JSP编程

<sql:setDataSource>标签设定数据源 语法结构: 复制代码 代码如下:     <sql:setDataSource url="jdbcUrl" driver="driverClassName" user="userName" password="password" [var = "varName"][scope="{page | request | sessio

在JSP中访问数据库大全_JSP编程

现在有好多初学jsp的网友经常会问数据库怎么连接啊,怎么老出错啊?所以我集中的在这写篇文章供大家参考,其实这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学者学习,所以我就这样做了,当大家学到一定程度的时候,可以考虑用MVC的模式开发.在练习这些代码的时候,你一定将jdbc的驱动程序放到服务器的类路径里,然后要在数据库里建一个表test,有两个字段比如为test1,test2,可以用下面SQL建 create table test(test1 varchar(20),test2 va

在JSP中访问数据库大全

js|访问|数据|数据库 一.jsp连接Oracle8/8i/9i数据库(用thin模式) testoracle.jsp如下: <%@ page contentType="text/html;charset=gb2312"%> <%@ page import="java.sql.*"%> <html> <body> <%Class.forName("oracle.jdbc.driver.OracleDr

vs2010中sql数据库中表1中的每一行关联表2中的某些行

问题描述 平台vs2010c#使用sql数据库数据库中有两个表,用户和类型用户表保存用户信息,类型表保存类型我想实现的功能:例如用户表中001张三,共有3种表:热水表.冷水表.煤气表用户002李四,有2种表:冷水表.电表用户003王武,有2种表:冷水表.煤气表.其实是用户表格中引用类型表格中的数据,请问具体实现的思路或代码应该是什么?我尝试过在用户表格中另加5个字段,分别保存为对应的5种表类型,但是觉得不科学,而且不能随着类型表格数据的改变而改变. 解决方案 本帖最后由 syt1128 于 20

软件开发中的数据库测试技术

摘要:根据以往软件测试经验,对数据库测试的内容和方法,进行了详细的分析,阐明了数据库测试在软件开发中的重要性. 关键词:数据库测试:性能测试:DataFactory 1.引言 数据库系统的开发在应用软件开发中所占的比重越来越大,随之而来的问题也越来越突出.比如:数据冗余,功能和性能方面存在的问题已经严重影响应用软件的使用.软件测试人员往往重视对软件功能和编码的测试,而忽略对软件性能,特别是数据库访问并发测试.因为,他们固有的思想中认为数据库设计存在问题对系统性能影响不大,或从根本上忽略了数据库在