本章没有运行截图,因为电脑没有MySQL,emm主要是懒,实际上MySQL和可视化管理软件Navicat for MySQL一共也不过100M左右,想操作一下还是不麻烦的(提示:记得下载MySQL的jdbc并放在ext文件下,否则程序无法加载数据库驱动),本章的栗子也会在最后给出一个综合性程序用作演示,不再一 一演示。

1.数据库

下面是在JSP中使用数据库的一个简单的例子,在JSP页面中一般只负责显示部分,运算逻辑部分交给Servlet,但是下例中依然把逻辑部分交给了JSP页面。
example7_1.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*" %>
<HTML><body bgcolor=#EEDDFF>
<% Connection con;
Statement sql;
ResultSet rs;
try{ Class.forName("com.mysql.jdbc.Driver"); //加载驱动
}
catch(Exception e){
out.println("忘记把MySQL数据库的JDBC-数据库驱动程序复制到JDK的扩展目录中");
}
try { String uri= "jdbc:mysql://127.0.0.1/warehouse";
String user="root";
String password="";
con=DriverManager.getConnection(uri,user,password);//创建连接
//也可以写成con=DriverManager.getConnection(uri+"?user=root&password=");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM product "); //查询数据
out.print("<table border=2>"); //绘制表格
out.print("<tr>");
out.print("<th width=100>"+"产品号");
out.print("<th width=100>"+"名称");
out.print("<th width=50>"+"生产日期");
out.print("<th width=50>"+"价格");
out.print("</TR>");
while(rs.next()){ //迭代器
out.print("<tr>");
out.print("<td >"+rs.getString(1)+"</td>");
out.print("<td >"+rs.getString(2)+"</td>");
out.print("<td >"+rs.getDate("madeTime")+"</td>");
out.print("<td >"+rs.getFloat("price")+"</td>");
out.print("</tr>") ;
}
out.print("</table>");
con.close();
}
catch(SQLException e){
out.print(e);
}
%>
</body></HTML>

对于SQL语句,上例使用了“SELECT * FROM product ”,查找全部,还有更新(update)、删除(delete)等操作,已经在数据库学过,就不在重复。
当然,上栗是已知数据库结构,对于不知道目标数据库结构的数据库,我们可以使用下面的方法来获取数据库的信息(方法由jdbc提供)。
ResultSetMetaData metaData=rs.getMetaData();
然后调用对应的方法来获取信息。
int columnCount=metaData.getColumeCount(); 获取结果集rs中列的数目。
String columnName=metaData.getColumeName(i); 获取结果集rs中第i列的名字。

2.预处理语句

我们知道,SQL语句是第三代语言,所以数据库需要将它翻译成数据库自己的内部命令,这样在多人访问的时候就会造成数据库压力过大,所以我们需要对SQL语句进行预处理,即在客户端将SQL语句翻译成内部命令然后再访问数据库,减轻数据库负担,提高执行速度。
调用
PreparedStatement pre = con.prepareStatement(String SQL);
即可将SQL语句翻译成内部命令。

3.使用通配符

在对SQL语句进行预处理时可以使用通配符“?”来代替字段的值,只要在预处理语句执行之前再设置通配符所表示的具体值即可。
 
下面是栗子,包括了数据库的连接、查询、语句的预处理、通配符,全部都注释了:
example7_6.jsp

<%@ page contentType="text/html;charset=gb2312" %>
<HTML><body bgcolor=#AAFFEE><font size=2>
<form action="preparedServlet" method=post>
<b>输入主键number是<input type="text" name="number" size=10><br>
   的name,madeTime和price的更新值:<br>
   name:<input type="text" name="name" size=7><br>
   madeTime:<input type="text" name="madeTime" size=10><br>
   price:<input type="text" name="price" size=8><br>
  <input type="submit" name="b" value="提交">
</font></body></HTML>

example7_6_Servlet.java

package myservlet.control;
import mybean.data.Example7_2_Bean; //引入例子2中的Javabean模型
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Calendar;
public class Example7_6_Servlet extends HttpServlet{
   public void init(ServletConfig config) throws ServletException{
      super.init(config);
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response)
               throws ServletException,IOException{
      Example7_2_Bean resultBean=null;
      try{  resultBean=(Example7_2_Bean)request.getAttribute("resultBean");
            if(resultBean==null){
                resultBean=new Example7_2_Bean(); //创建Javabean对象
                request.setAttribute("resultBean",resultBean);
            }
      }
      catch(Exception exp){
            resultBean=new Example7_2_Bean();  //创建Javabean对象
            request.setAttribute("resultBean",resultBean);
      }
     try{  Class.forName("com.mysql.jdbc.Driver");
     }
     catch(Exception e){}
     request.setCharacterEncoding("gb2312");
     String number=request.getParameter("number");
     String name=request.getParameter("name");
     String madeTime=request.getParameter("madeTime");
     String pr=request.getParameter("price");
     if(number==null||number.length()==0) {
        fail(request,response,"更新记录失败,必须给出记录");
        return;
     }
     float price=Float.parseFloat(pr);
     String [] str=madeTime.split("[-/]");//输入的日期必须用-或/格式
     int year=Integer.parseInt(str[0]);
     int month=Integer.parseInt(str[1]);
     int day=Integer.parseInt(str[2]);
     Calendar calendar =Calendar.getInstance();
     calendar.set(year,month-1,day);
     Date date=new Date(calendar.getTimeInMillis());
     Connection con;
     PreparedStatement sql; //预处理语句 ;
     ResultSet rs;
     try{
          String uri="jdbc:mysql://127.0.0.1/warehouse?"+
                      "user=root&password=&characterEncoding=gb2312";
          con=DriverManager.getConnection(uri);//连接数据库
          String condition =
         "UPDATE product SET name = ?,price = ?,madeTime = ?  WHERE number=?";
          sql=con.prepareStatement(condition); //预处理
          sql.setString(1,name);   //设置第1个统配符“?”代表的具体值
          sql.setFloat(2,price);   //设置第2个统配符“?”代表的具体值
          sql.setDate(3,date);     //设置第3个统配符“?”代表的具体值
          sql.setString(4,number); //设置第4个统配符“?”代表的具体值
          sql.executeUpdate();
          sql=con.prepareStatement("select * from product");
          rs=sql.executeQuery();          //执行SQL语句
          ResultSetMetaData metaData = rs.getMetaData();
          int columnCount = metaData.getColumnCount(); //得到结果集的列数
          String []columnName = new String[columnCount];
          for(int i=0;i<columnName.length;i++) {
             columnName[i] = metaData.getColumnName(i+1); //得到列名
          }
          resultBean.setColumnName(columnName);   //更新Javabean数据模型
          rs.last();
          int rowNumber=rs.getRow();  //得到记录数
          String [][] tableRecord=resultBean.getTableRecord();
          tableRecord = new String[rowNumber][columnCount];
          rs.beforeFirst();
          int i=0;
          while(rs.next()){
            for(int k=0;k<columnCount;k++)
              tableRecord[i][k] = rs.getString(k+1);
            i++;
          }
          resultBean.setTableRecord(tableRecord); //更新Javabean数据模型
          con.close();
          RequestDispatcher dispatcher=
          request.getRequestDispatcher("showRecord.jsp");
          dispatcher.forward(request,response);  //转发
     }
     catch(SQLException e){
          System.out.println(e);
          fail(request,response,"更新记录失败:"+e.toString());
     }
   }
   public  void  doGet(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException{
       doPost(request,response);
   }
   public void fail(HttpServletRequest request,HttpServletResponse response,
                      String backNews) {
        response.setContentType("text/html;charset=GB2312");
        try {
         PrintWriter out=response.getWriter();
         out.println("<html><body>");
         out.println("<h2>"+backNews+"</h2>") ;
         out.println("返回");
         out.println("<a href =example7_6.jsp>输入记录</a>");
         out.println("</body></html>");
        }
        catch(IOException exp){}
    }
}

 
 

课后题:

1.加载MySQL的JDBC数据库驱动程序代码是什么?

try{
    Class.forName("com.mysql.jdbc.Driver");
} catch(Exception e){
 }

2.加载SQL server的JDBC数据库驱动程序代码是什么?

try{
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch(Exception e){
 }

4.使用预处理语句的好处是什么?
·   预处理语句PreparedStatement会将传入的SQL命令封装在PreparedStatement对象中,事先进行预编译处理等待使用。
当有单一的SQL语句多次执行时,用PreparedStatement类会比Statement类更有效率。

分类: JSP

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注