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