JSP培训(10)——使用JavaBean封装对数据库的访问、连接池的配置和使用

目标:
l         掌握如何共享连接数据库的代码;
l         掌握PrepareSatement的使用;
l         掌握数据库连接池的配置和使用;
主要内容:
l         通过对数据库的访问过程进行分析,把数据库访问过程封装成DBBean;
l         修改User.java中的根据页码查询用户的方法,使用DBBean完成对数据库的操作;
l         修改User.java中的添加用户信息的方法,使用DBBean完成对数据库的操作;
l         配置数据库连接池;
l         修改DBBean中连接数据库的代码,使用连接池完成连接
1、 DBBean的编写
在前面的几讲中,有多个方法连接数据库对数据库进行操作,并且我们编写代码的过程中存在很多复制和粘贴,这意味着在各个方法中有很多代码可以共享。那么在连接数据库的代码中有过程是可以共享的?
对数据库操作的基本过程如下:
l         加载驱动程序;
l         创建连接;
l         编写SQL语句;
l         创建语句对象;
l         执行SQL语句;
l         对结果进行处理;
l         关闭相关对象。
在上面的过程中,很多操作都是相同的,不同的方面包括:不同的功能需要编写不同的SQL语句,对结果的处理。
对这个过程进行封装,得到下面的代码(封装的方式有很多种):
package javabean;
 
import java.sql.*;
import java.util.*;
public class DBBean {
       private Connection con;
       private PreparedStatement stmt;
       private ResultSet rs;
      
       // 获取连接对象
       public Connection getConnection() throws Exception{
              if(con == null){
                     // 指出连接数据库所需要的驱动程序
                     Class.forName("oracle.jdbc.driver.OracleDriver");
 
                     // 建立与数据库之间的连接
                     con = DriverManager.getConnection(
                                   "jdbc:oracle:thin:@192.168.0.170:1521:fhdn", "scott",
                                   "tiger");
              }
              return con;
       }
      
       // 创建语句对象
       public PreparedStatement getStatement(String sql) throws Exception{
              con = getConnection();
              stmt = con.prepareStatement(sql);
              return stmt;   
       }
      
       // 执行有结果集的查询
       public ResultSet executeQuery(String sql,ArrayList paras) throws Exception{
              stmt = getStatement(sql);
              if (paras != null) {
                     Object o[] = paras.toArray();
                     for (int i = 0; i < o.length; i++) {
                            if (o[i] instanceof String) {
                                   stmt.setString(i + 1, (String) o[i]);
                            }
                     }
              }
              return stmt.executeQuery();
       }
       // 执行没有结果集的查询
       public int executeUpdate(String sql,ArrayList paras) throws Exception{
              stmt = getStatement(sql);
              if (paras != null) {
                     Object o[] = paras.toArray();
                     for (int i = 0; i < o.length; i++) {
                            if (o[i] instanceof String) {
                                   stmt.setString(i + 1, (String) o[i]);
                            }
                     }
              }
              return stmt.executeUpdate();       
       }
      
       // 关闭对象
       public void close(){
              try{
                     rs.close();
              }catch(Exception e){}
              try{
                     stmt.close();
              }catch(Exception e){}
              try{
                     con.close();
              }catch(Exception e){}
       }
}
注意:因为采用预编译的语句对象,所以在执行SQL语句的时候需要提供参数,因为参数的个数不定,所以采用ArrayList对象进行封装,而代码中只对String类型的参数进行了处理,如果使用其它类型的参数,需要再编写支持代码。
2、 修改getUserByPage方法
使用DBBean中方法的基本过程如下:
l         创建DBBean的对象;
l         编写SQL语句;
l         封装SQL语句需要的参数;
l         执行SQL语句;
l         关闭对象。
    public ArrayList getUserByPage(int pageNo) {
              int number = 10;
              // 每一页显示的记录数
 
              int begin = (pageNo * number) - 9;
              int end = pageNo * number;
              int index = 1;
             
              DBBean db = new DBBean();
              // 要返回的结果对象
              ArrayList users = new ArrayList();
             
              String sql = "select * from usertable";
              ResultSet rs;
              try{
                     rs = db.executeQuery(sql,null);
                     while (rs.next()) {
                            // 在begin之前的记录是不显示的
                            if (index < begin) {
                                   index++;
                                   continue;
                            }
 
                            // 在end之后的记录也不显示
                            if (index > end)
                                   break;
 
                            index++;
 
                            String username = rs.getString(1);
                            String userpass = rs.getString(2);
                            // java.util.Date birthday = rs.getDate(3);
                            // int age = rs.getInt(4);
                            User user = new User();
                            user.setUsername(username);
                            user.setUserpass(userpass);
                            users.add(user);
                     }
              }catch(Exception e){
                     e.printStackTrace();
              }finally{
                     db.close();
              }
              return users;
       }
3、 修改addUser方法
以addUser方法为例介绍具有参数的SQL语句的执行。
基本访问过程与2中介绍的相同,修改后的addUser方法的代码如下:
public boolean addUser() {
        DBBean db = new DBBean();
        String sql = "insert into usertable values(?,?)";
        ArrayList<String> paras = new ArrayList<String>();
        paras.add(username);
        paras.add(userpass);
        int n=0;
        try{
               n = db.executeUpdate(sql,paras);
        }catch(Exception e){
               System.out.println(e.toString());
        }
        db.close();
        boolean b; // 表示添加成功与否
        if (n > 0)
               b = true;
        else
               b = false;
        return b;
}
4、 使用连接池的好处
在前面的例子中,对于每个用户的每次访问都要先创建数据库连接,使用完之后释放连接。如果能够让用户多次访问之间共享数据库连接,则可以大幅度提供访问的效率。可以使用数据库连接处完成连接的共享,在服务器启动的时候,创建多个连接,如果用户需要访问数据库,直接从连接池中得到一个连接使用,使用完之后直接放回连接池。
使用连接池的另外一个好处是,如果客户端太多,连接池可以通过控制连接的数量来保护数据库服务器,不会让数据库的响应变得非常缓慢,从而影响服务器的性能。
5、 Tomcat中连接池的配置
连接池的配置包括3个部分:
l         把数据库JDBC驱动程序放到Tomcat安装目录的lib下面。有些版本的Tomcat应该放在安装目录的common/lib下面。
l         配置安装目录下的conf/server.xml
打开server.xml文件,在</host>之前添加如下代码:
<Context path="/ch10" docBase="ch10"
        debug="5" reloadable="true" crossContext="true">
 <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="scott"
password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
               url="jdbc:oracle:thin:@myserver:1521:mydb"/>
path是应用的访问路径,docBase是应用的根目录,Resource其他红色部分分别是用户名、口令、驱动程序和url。
</Context>
l         配置工程的web.xml文件
在web.xml中添加如下代码。注意:元素res-ref-name的值应该和前面配置的Resource的名字相同。
 <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
 </resource-ref>
6、 在Java代码中使用连接池
修改DBBean.java中的getConnection方法,修改后的代码如下:
public Connection getConnection() throws Exception{
        if (con == null) {
               Context initContext = new InitialContext();
               Context envContext = (Context) initContext.lookup("java:/comp/env");
               DataSource ds = (DataSource) envContext.lookup("jdbc/TestDB");
               con = ds.getConnection();
        }
        return con;
}
注意:在类头需要引入javax.sql包和javax.naming包。
7、运行代码进行测试。
参考教材:《Java Web程序设计基础教程》

JSP培训目录:

JSP培训(1)——概述
JSP培训(2)——运行原理、文档结构、简单输入输出
JSP培训(3)——客户端验证、常用输出方式、JSTL基本用法
JSP培训(4)——实例:登录功能、jsp:forward标签、jsp:include标签、include指令、EL、c:if
JSP培训(5)——使用JavaBean完成业务逻辑
JSP培训(6)——使用Servlet作为控制器实现MVC模式
JSP培训(7)——使用JDBC完成动态验证、采用MVC完成数据查询
JSP培训(8)——添加功能和分页显示
JSP培训(9)——使用MVC模式完成删除和修改功能
JSP培训(10)——使用JavaBean封装对数据库的访问、连接池的配置和使用
JSP培训(11)——Java Web中的安全控制
JSP培训(12)——Java Web应用国际化
JSP培训(13)——异常处理
JSP培训(14)——购物车实例(上)
JSP培训(15)——购物车实例(下)及小结
返回JSP培训目录
李绪成 CSDN Blog: http://blog.csdn.net/javaeeteacher
想加我为好友请点击:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5

你可能感兴趣的:(sql,数据库,jsp,exception,String,数据库连接池)