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

告别CH340!手把手教你用STM32的USB CDC虚拟串口实现零成本串口通信 本文详细介绍了如何利用STM32的USB CDC虚拟串口技术替代传统CH340芯片,实现零成本的串口通信方案。通过CDC ACM协议,开发者可以免驱动实现高效数据传输,节省硬件成本和PCB空间。文章包含硬件配置、软件实现、性能优化及常见问题解决方案,是嵌入式开发的实用指南。 阅读详情
 
目标:
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程序设计基础教程》

DBBean.java jsp连接mysql 立即下载

相关推荐

Java Web应用开发 43 课堂案例-应用JavaBean封装数据库访问操作.docx

Java Web应用开发 43 课堂案例-应用JavaBean封装数据库访问操作.docx 学习资料 复习资料 教学资源

javabean连接mysql数据库,jsp+javabean 链接 mysql 数据库

JSP+JavaBean html一、JavaBean类java首先先澄清 这个三个都是绝对路径 没有相对路径, E://test.txt 和 E:/test.txt 是一个意思 E:\\text.txt 用这样的写法是 \\ 转义了 ‘\’.linux为何有\\ 的写法 和 / 这样的写法呢 ,由于window 默认的是\\ 这样的写法 若是你把这样的写法放到了 linux系统下面,...

weixin_32760125的博客 743

CMU开源NavRL:深度强化学习如何破解无人机动态避障难题?

卡内基梅隆大学(CMU)开源了NavRL框架,利用深度强化学习解决无人机在复杂环境中的动态避障难题。该框架通过创新的状态表示、多目标奖励函数设计以及独立的安全屏障机制,使无人机能够通过仿真训练自主学会灵活、安全的导航策略,并成功实现从仿真到真实环境的零样本迁移。

hope8的博客 721

DBbean

import java.sql.*; public class DBBean { private String driverStr = "com.mysql.jdbc.Driver"; private String connStr = "jdbc:mysql://localhost/context"; private String username = ""; private...

bby12345的博客 707

使用项目管理画布启动项目

许多人对商业模式画布并不陌生,它是亚历山大·奥斯特瓦德(Alexander Osterwalder)、伊夫·皮尼厄(Yves Pigneur)在《商业模式新生代》(Business Model Generation)中提出的一种用来描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。 在我们做敏捷软件项目inception(项目启动规划)的时候经常会用到商业画布,此时它的作用是帮助我们快速了解客户的业务、产品和市场,帮助客户梳理自己的资源、优势和盈利模式,总的来说,商业画布是一种简单实用的

IDEAL Garden 1224

Windows10 使用Apple Studio Display显示器的设置

AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...

爱意随风起,人生不可弃。 1万+

JavaBean封装数据库连接

1、创建数据库 【服务】窗口->右击【Java DB】命令->【创建数据库】命令 单击【确定】 2、连接数据库 【服务】窗口->右击【Java DB】->【启动服务】命令 在输出窗口中如下显示(有时第一步完成就能看到下面内容) 右击【数据库】->【新建连接】命令,打开【新建连接对话框】 单击【下一步】 信息填完单击【测试链接】...

weixin_30279671的博客 412

避开集成插件!手把手教你用URL登录实现Finereport与致远OA的无缝跳转

本文详细介绍了如何通过URL登录机制实现Finereport与致远OA的无缝跳转,无需复杂插件配置。文章涵盖用户体系同步、环境配置、URL登录核心设置及安全加固方案,特别适合企业数字化转型中BI工具与OA系统的轻量化集成需求。

weixin_29215815的博客 75

数据库连接池原理

基本原理 在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。 如外部使用者可通过getConnection方法获取数据库连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时的连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。 线程池作用 ①资源重用 由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统...

selt791的博客 254

NVIDIA Tao Toolkit环境配置踩坑

请搭配食用该文章为 Tao 安装中可能出现的问题进行解答,如果存在本文章中没出现的问题,欢迎提问,由我复现后更新文章。由于大部分云服务器厂商不能支持 docker,因此我使用的环境为2023年5月27日在平台租的 3080 旧版环境进行实验。

qq_36630208的博客 772

使用Transformer实现自动调制识别(RML2018)

image_size = 1024 # resize重置输入大小patch_size = 16 # 从输入图片中将被提取的块大小# 分成 num_patches 个块num_patches = (image_size // patch_size) #(72/6)**2 横着裁剪),],return x})

QAQIknow的博客 1324

利用tcpcopy引流做模拟在线测试

本文转自 http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html

朝着梦想 渐行前进 7197

华为OD机试2025C卷 - CPU调度策略 (C++ & Python & JAVA & JS & GO)

华为OD机试 2025C卷 CPU调度策略,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解

qq_45776114的博客 1297

【性能测试】利用tcpcopy引流做模拟在线测试

转自:http://www.searchtb.com http://www.searchtb.com/2012/05/using-tcpcopy-to-simulate-traffic.html

zsch591488385的专栏 792

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

利用 tcpcopy 引流做模拟在线测试

一、工具介绍Tcpcopy是一个分布式在线压力测试工具,可以将线上流量拷贝到测试机器,实时的模拟线上环境,达到在程序不上线的情况下实时承担线上流量的效果,尽早发现bug,增加上线信心。Tcpcopy是由网易技术部于2011年9月开源的一个项目,现在已经更新到0.4版本。与传统的压力测试工具(如:abench)相比,tcpcopy的最大优势在于其实时及真实性,除了少量的丢包,完全拷贝线上流量到测试机...

测试帮日记 844

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: JSP培训(9)——使用MVC模式完成删除和修改功能
下一篇: Java代码编写规范
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值