本章没有运行截图,因为电脑没有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类更有效率。
0 条评论