本章大部分例子采用的模式是JSP+JavaBean模式,即JSP页面调用bean来完成对数据库的操作,使用的数据库管理系统是SQL Server 2000。
1. SQL Server 2000数据库管理系统
SQL Server 2000是一个网络数据库,可以使远程的计算机访问它所管理的数据库。安装好SQL Server 2000后,需启动SQL Server 2000提供的数据库服务器,以便使远程的计算机访问它所管理的数据库。
如果您已经安装SQL Server 2000,可以如下操作启动SQL Server 2000提供的数据库服务器:单击“开始”→“程序”→“Microsoft SQL Server” →“服务器管理器”。
2. JDBC
JDBC(Java DataBase Connectivity)是Java运行平台的核心类库中的一部分,提供了访问数据库的API,它由一些Java类和接口组成。
JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库
使用JDBC进行如下操作:
与一个数据库建立连接。
向已连接的数据库发送SQL语句。
处理SQL语句返回的结果。
3. 数据库连接的常用方式
1.一种常见方式是建立起一个JDBC-ODBC桥接器:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2.另一种使用纯Java数据库驱动程序
加载SQLServer驱动程序代码如下:
Class.forName("com.microsoft.sqlserver. jdbc .SQLServerDriver");
4.查询操作
与数据库建立连接后,就可以使用JDBC提供的API和数据库交互信息,如查询、修改和更新数据库中的表等。
创建Statement对象
Statement sql=con.createStatement();
sql对象就可以调用相应的方法,实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中
ResultSet rs=sql.executeQuery("SELECT * FROM score");
5. 更新、添加与删除操作
Statement对象调用方法:
public int executeUpdate(String sqlStatement);
通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作.
6.分页显示记录
用户使用分页方式显示ResultSet对象中的数据,就必须始终保持和数据库的连接,直到用户将ResultSet对象中的数据查看完毕。我们知道,每种数据库在同一时刻都有允许的最大连接数目,因此当多个用户同时分页读取数据库表的记录时,应当避免长时间占用数据库的连接资源。
CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection 对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。
假设CachedRowSetImpl对象中有m行记录,准备每页显示n行,那么,总页数的计算公式是:
如果m除以n的余数大于0,总页数等于m除以n的商加1;
如果m除以n的余数等于0,总页数等于m除以n的商。
即总页数=(m%n)==0?(m/n):(m/n+1);
如果准备显示第p页的内容,应当把CachedRowSetImpl对象中的游标移动到第(p-1)*n+1 行记录处。
7.常见数据库连接
(1)连接Oracle数据库
加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
建立连接
Connection conn=DriverManager.getConnection( "jdbc:oracle:thin:
@主机host:端口号:数据库名“, ”用户名“, ”密码“);
(2)连接MySql数据库
加载MySql驱动程序:
try{ Class.forName("com.mysql.jdbc.Driver")
}
catch(Exception e){ }
建立连接
try{ String uri= “jdbc:mysql://localhost/数据库名";
String user=“用户名";
String password=“密码";
con=DriverManager.getConnection(uri,user,password);
}
catch(SQLException e) { }
8.使用连接池
连接池的思想是:Tomcat服务器可以事先预备好若干个连接对象,将这些连接对象存放在一个称作连接池的容器中,通常由链表来担当这一角色。当某用户需要操作数据库时,只要从连接池中取出一个连接对象即可,当用户使用完该连接对象后,将该连接对象放回到连接池中。如果某用户需要操作数据库时,连接池中已没有连接对象可用,那么该用户就必须等待,直到连接池中有连接对象。
9.使用预处理语句
对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么 con就可以调用
prepareStatement(String sql)
方法对参数sql指定的SQL语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在PreparedStatement对象中.
例子1
showByJdbcOdbc.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<HTML><BODY bgcolor=cyan>
<% Connection con;
Statement sql;
ResultSet rs;
try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{ out.print(e);
}
try { con=DriverManager.getConnection("jdbc:odbc:mymoon","sa","sa");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM employee WHERE salary>3000");
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("birthday")+"</td>");
out.print("<td >"+rs.getFloat("salary")+"</td>");
out.print("</tr>") ;
}
out.print("</table>");
con.close();
}
catch(SQLException e)
{ out.print(e);
}
%>
</BODY></HTML>
例子2
showBySQLDriver.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<HTML><BODY bgcolor=cyan>
<% Connection con;
Statement sql;
ResultSet rs;
try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(Exception e)
{ out.print(e);
}
try { String uri= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=factory";
String user="sa";
String password="sa";
con=DriverManager.getConnection(uri,user,password);
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM employee WHERE salary>3000");
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("birthday")+"</td>");
out.print("<td >"+rs.getFloat("salary")+"</td>");
out.print("</tr>") ;
}
out.print("</table>");
con.close();
}
catch(SQLException e)
{ out.print(e);
}
%>
</BODY></HTML>
例子3
QueryBean.java
package database.operation;
import java.sql.*;
public class QueryBean
{ String databaseName=""; //数据库名
String tableName=""; //表名
String user="" ; //用户
String secret="" ; //密码
StringBuffer queryResult; //查询结果
public QueryBean()
{ queryResult=new StringBuffer();
try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(Exception e) {}
}
public void setDatabaseName(String s)
{ databaseName=s.trim();
queryResult=new StringBuffer();
}
public String getDatabaseName()
{ return databaseName;
}
public void setTableName(String s)
{ tableName=s.trim();
queryResult=new StringBuffer();
}
public String getTableName()
{ return tableName;
}
public void setSecret(String s)
{ secret=s.trim();
queryResult=new StringBuffer();
}
public String getSecret()
{ return secret;
}
public void setUser(String s)
{ user=s.trim();
queryResult=new StringBuffer();
}
public String getUser()
{ return user;
}
public StringBuffer getQueryResult()
{ Connection con;
Statement sql;
ResultSet rs;
try { queryResult.append("<table border=1>");
String uri= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName="+databaseName;
String id=user;
String password=secret;
con=DriverManager.getConnection(uri,id,password);
DatabaseMetaData metadata=con.getMetaData();
ResultSet rs1=metadata.getColumns(null,null,tableName,null);
int 字段个数=0;
queryResult.append("<tr>");
while(rs1.next())
{ 字段个数++;
String clumnName=rs1.getString(4);
queryResult.append("<td>"+clumnName+"</td>");
}
queryResult.append("</tr>");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM "+tableName);
while(rs.next())
{ queryResult.append("<tr>");
for(int k=1;k<=字段个数;k++)
{ queryResult.append("<td>"+rs.getString(k)+"</td>");
}
queryResult.append("</tr>");
}
queryResult.append("</table>");
con.close();
}
catch(SQLException e)
{ queryResult.append("请输入正确的用户名和密码");
}
return queryResult;
}
}
inquire.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="database.operation.QueryBean" %>
<jsp:useBean id="base" class="database.operation.QueryBean" scope="session"/>
<jsp:setProperty name= "base" property="*" />
<HTML><Body bgcolor=cyan><Font size=2>
<FORM action="" Method="post" >
输入数据库名: <Input type=text name="databaseName" size=8>
输入表的名字: <Input type=text name="tableName" size=8>
<br>输入用户名:<Input type=text name="user" size=6>
输入密码: <Input type="password" name="secret" size=6>
<Input type=submit name="g" value="提交">
</Form>
在<jsp:getProperty name="base" property="tableName"/>表查询到记录:
<BR> <jsp:getProperty name="base" property="queryResult"/>
</Font></Body></HTML>
例子4
RandomQueryBean.java
package database.operation;
import java.sql.*;
import java.util.*;
public class RandomQueryBean
{ String databaseName=""; //数据库名称
String tableName=""; //表的名字
int count; //记录总数
int randomNumber; //随机输出的记录数
StringBuffer randomQueryResult; //查询结果
Connection con;
Statement sql;
ResultSet rs;
public RandomQueryBean()
{ randomQueryResult=new StringBuffer();
1. SQL Server 2000数据库管理系统
SQL Server 2000是一个网络数据库,可以使远程的计算机访问它所管理的数据库。安装好SQL Server 2000后,需启动SQL Server 2000提供的数据库服务器,以便使远程的计算机访问它所管理的数据库。
如果您已经安装SQL Server 2000,可以如下操作启动SQL Server 2000提供的数据库服务器:单击“开始”→“程序”→“Microsoft SQL Server” →“服务器管理器”。
2. JDBC
JDBC(Java DataBase Connectivity)是Java运行平台的核心类库中的一部分,提供了访问数据库的API,它由一些Java类和接口组成。
JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库
使用JDBC进行如下操作:
与一个数据库建立连接。
向已连接的数据库发送SQL语句。
处理SQL语句返回的结果。
3. 数据库连接的常用方式
1.一种常见方式是建立起一个JDBC-ODBC桥接器:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2.另一种使用纯Java数据库驱动程序
加载SQLServer驱动程序代码如下:
Class.forName("com.microsoft.sqlserver. jdbc .SQLServerDriver");
4.查询操作
与数据库建立连接后,就可以使用JDBC提供的API和数据库交互信息,如查询、修改和更新数据库中的表等。
创建Statement对象
Statement sql=con.createStatement();
sql对象就可以调用相应的方法,实现对数据库中表的查询和修改,并将查询结果存放在一个ResultSet类声明的对象中
ResultSet rs=sql.executeQuery("SELECT * FROM score");
5. 更新、添加与删除操作
Statement对象调用方法:
public int executeUpdate(String sqlStatement);
通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作.
6.分页显示记录
用户使用分页方式显示ResultSet对象中的数据,就必须始终保持和数据库的连接,直到用户将ResultSet对象中的数据查看完毕。我们知道,每种数据库在同一时刻都有允许的最大连接数目,因此当多个用户同时分页读取数据库表的记录时,应当避免长时间占用数据库的连接资源。
CachedRowSetImpl对象可以保存ResultSet对象中的数据,而且CachedRowSetImpl对象不依赖Connnection 对象,这意味着一旦把ResultSet对象中的数据保存到CachedRowSetImpl对象中后,就可以关闭和数据库的连接。
假设CachedRowSetImpl对象中有m行记录,准备每页显示n行,那么,总页数的计算公式是:
如果m除以n的余数大于0,总页数等于m除以n的商加1;
如果m除以n的余数等于0,总页数等于m除以n的商。
即总页数=(m%n)==0?(m/n):(m/n+1);
如果准备显示第p页的内容,应当把CachedRowSetImpl对象中的游标移动到第(p-1)*n+1 行记录处。
7.常见数据库连接
(1)连接Oracle数据库
加载驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");
建立连接
Connection conn=DriverManager.getConnection( "jdbc:oracle:thin:
@主机host:端口号:数据库名“, ”用户名“, ”密码“);
(2)连接MySql数据库
加载MySql驱动程序:
try{ Class.forName("com.mysql.jdbc.Driver")
}
catch(Exception e){ }
建立连接
try{ String uri= “jdbc:mysql://localhost/数据库名";
String user=“用户名";
String password=“密码";
con=DriverManager.getConnection(uri,user,password);
}
catch(SQLException e) { }
8.使用连接池
连接池的思想是:Tomcat服务器可以事先预备好若干个连接对象,将这些连接对象存放在一个称作连接池的容器中,通常由链表来担当这一角色。当某用户需要操作数据库时,只要从连接池中取出一个连接对象即可,当用户使用完该连接对象后,将该连接对象放回到连接池中。如果某用户需要操作数据库时,连接池中已没有连接对象可用,那么该用户就必须等待,直到连接池中有连接对象。
9.使用预处理语句
对于JDBC,如果使用Connection和某个数据库建立了连接对象con,那么 con就可以调用
prepareStatement(String sql)
方法对参数sql指定的SQL语句进行预编译处理,生成该数据库地层的内部命令,并将该命令封装在PreparedStatement对象中.
例子1
showByJdbcOdbc.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<HTML><BODY bgcolor=cyan>
<% Connection con;
Statement sql;
ResultSet rs;
try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{ out.print(e);
}
try { con=DriverManager.getConnection("jdbc:odbc:mymoon","sa","sa");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM employee WHERE salary>3000");
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("birthday")+"</td>");
out.print("<td >"+rs.getFloat("salary")+"</td>");
out.print("</tr>") ;
}
out.print("</table>");
con.close();
}
catch(SQLException e)
{ out.print(e);
}
%>
</BODY></HTML>
例子2
showBySQLDriver.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.sql.*" %>
<HTML><BODY bgcolor=cyan>
<% Connection con;
Statement sql;
ResultSet rs;
try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(Exception e)
{ out.print(e);
}
try { String uri= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=factory";
String user="sa";
String password="sa";
con=DriverManager.getConnection(uri,user,password);
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM employee WHERE salary>3000");
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("birthday")+"</td>");
out.print("<td >"+rs.getFloat("salary")+"</td>");
out.print("</tr>") ;
}
out.print("</table>");
con.close();
}
catch(SQLException e)
{ out.print(e);
}
%>
</BODY></HTML>
例子3
QueryBean.java
package database.operation;
import java.sql.*;
public class QueryBean
{ String databaseName=""; //数据库名
String tableName=""; //表名
String user="" ; //用户
String secret="" ; //密码
StringBuffer queryResult; //查询结果
public QueryBean()
{ queryResult=new StringBuffer();
try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch(Exception e) {}
}
public void setDatabaseName(String s)
{ databaseName=s.trim();
queryResult=new StringBuffer();
}
public String getDatabaseName()
{ return databaseName;
}
public void setTableName(String s)
{ tableName=s.trim();
queryResult=new StringBuffer();
}
public String getTableName()
{ return tableName;
}
public void setSecret(String s)
{ secret=s.trim();
queryResult=new StringBuffer();
}
public String getSecret()
{ return secret;
}
public void setUser(String s)
{ user=s.trim();
queryResult=new StringBuffer();
}
public String getUser()
{ return user;
}
public StringBuffer getQueryResult()
{ Connection con;
Statement sql;
ResultSet rs;
try { queryResult.append("<table border=1>");
String uri= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName="+databaseName;
String id=user;
String password=secret;
con=DriverManager.getConnection(uri,id,password);
DatabaseMetaData metadata=con.getMetaData();
ResultSet rs1=metadata.getColumns(null,null,tableName,null);
int 字段个数=0;
queryResult.append("<tr>");
while(rs1.next())
{ 字段个数++;
String clumnName=rs1.getString(4);
queryResult.append("<td>"+clumnName+"</td>");
}
queryResult.append("</tr>");
sql=con.createStatement();
rs=sql.executeQuery("SELECT * FROM "+tableName);
while(rs.next())
{ queryResult.append("<tr>");
for(int k=1;k<=字段个数;k++)
{ queryResult.append("<td>"+rs.getString(k)+"</td>");
}
queryResult.append("</tr>");
}
queryResult.append("</table>");
con.close();
}
catch(SQLException e)
{ queryResult.append("请输入正确的用户名和密码");
}
return queryResult;
}
}
inquire.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="database.operation.QueryBean" %>
<jsp:useBean id="base" class="database.operation.QueryBean" scope="session"/>
<jsp:setProperty name= "base" property="*" />
<HTML><Body bgcolor=cyan><Font size=2>
<FORM action="" Method="post" >
输入数据库名: <Input type=text name="databaseName" size=8>
输入表的名字: <Input type=text name="tableName" size=8>
<br>输入用户名:<Input type=text name="user" size=6>
输入密码: <Input type="password" name="secret" size=6>
<Input type=submit name="g" value="提交">
</Form>
在<jsp:getProperty name="base" property="tableName"/>表查询到记录:
<BR> <jsp:getProperty name="base" property="queryResult"/>
</Font></Body></HTML>
例子4
RandomQueryBean.java
package database.operation;
import java.sql.*;
import java.util.*;
public class RandomQueryBean
{ String databaseName=""; //数据库名称
String tableName=""; //表的名字
int count; //记录总数
int randomNumber; //随机输出的记录数
StringBuffer randomQueryResult; //查询结果
Connection con;
Statement sql;
ResultSet rs;
public RandomQueryBean()
{ randomQueryResult=new StringBuffer();