2011级-csdn-java-张侃— JDBC开发—连接池(二)
l 配置Tomcat数据源
示例代码:
context.xml
<Context>
<Resource name="jdbc/testDB"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
maxActive="8"
maxIdle="4" />
</Context>
DemoServlet.java
package com.hbsi.servlet;
import java.io.IOException;
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//初始化jndi容器
Context initCxt = new InitialContext();
//检索出web服务器中的jndi容器
Context envCxt =(Context) initCxt.lookup("java:comp/env");
//从jndi容器中检索出连接池
DataSource ds = (DataSource) envCxt.lookup("jdbc/testDB");
Connection conn = ds.getConnection();
System.out.println(conn);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
运行结果:
JNDI技术简介
lJNDI(Java Naming and DirectoryInterface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
l 这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
l 其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
编写自己的JDBC框架
l 元数据-DataBaseMetaData
l 元数据:数据库、表、列的定义信息。
lConnection.getDatabaseMetaData()
lDataBaseMetaData对象
lgetURL():返回一个String类对象,代表数据库的URL。
lgetUserName():返回连接当前数据库管理系统的用户名。
lgetDatabaseProductName():返回数据库的产品名称。
lgetDatabaseProductVersion():返回数据库的版本号。
lgetDriverName():返回驱动驱动程序的名称。
lgetDriverVersion():返回驱动程序的版本号。
lisReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
l 元数据-ParameterMetaData
lPreparedStatement .getParameterMetaData()
l 获得代表PreparedStatement元数据的ParameterMetaData对象。
lSelect * from user where name=?And password=?
lParameterMetaData对象
lgetParameterCount()
l 获得指定参数的个数
lgetParameterType(int param)
l 获得指定参数的sql类型
lResultSet. getMetaData()
l 获得代表ResultSet对象元数据的ResultSetMetaData对象。
lResultSetMetaData对象
lgetColumnCount()
l 返回resultset对象的列数
lgetColumnName(int column)
l 获得指定列的名称
lgetColumnTypeName(int column)
l 获得指定列的类型
l 使用元数据简化JDBC代码
l 业务背景:系统中所有实体对象都涉及到基本的CRUD操作:
l 所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
l 实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
Apache—DBUtils框架
lcommons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。
l API介绍:
•org.apache.commons.dbutils.QueryRunner--BDManager
•org.apache.commons.dbutils.ResultSetHandler—处理结果集
• 工具类
•org.apache.commons.dbutils.DbUtils、。
DbUtils类
lDbUtils :提供如关闭连接、装载JDBC驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
•public static void close(…)throws java.sql.SQLException: DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
•public static voidcloseQuietly(…): 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLEeception。
•public static voidcommitAndCloseQuietly(Connection conn):用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
•public static booleanloadDriver(java.lang.String driverClassName):这一方装载并注册JDBC驱动程序,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。
QueryRunner类
l 该类简单化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
lQueryRunner类提供了两个构造方法:
• 默认的构造方法
• 需要一个javax.sql.DataSource 来作参数的构造方法。
QueryRunner类的主要方法
lpublic Object query(Connectionconn, String sql, Object[] params,ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。
lpublic Object query(String sql,Object[] params, ResultSetHandler rsh) throwsSQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource方法中重新获得Connection。
lpublic Object query(Connectionconn, String sql, ResultSetHandler rsh) throwsSQLException : 执行一个不需要置换参数的查询操作。
lpublic int update(Connectionconn, String sql, Object[] params) throwsSQLException:用来执行一个更新(插入、更新或删除)操作。
lpublic int update(Connectionconn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。
ResultSetHandler接口
l 该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。
lResultSetHandler 接口提供了一个单独的方法:Object handle(java.sql.ResultSet .rs)。
ResultSetHandler 接口的实现类
lArrayHandler:把结果集中的第一行数据转成对象数组。
lArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
lBeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
lBeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
ResultSetHandler 接口的实现类
lColumnListHandler:将结果集中某一列的数据存放到List中。
lKeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。
lMapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
lMapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
2011级-csdn-java-张侃— JDBC开发—连接池(二)相关推荐
- 2011级-csdn-java-张侃— JDBC开发—连接池(一)
l 应用程序直接获取链接的缺点 l 缺点:用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需 ...
- java连接池域名切换_java - 使用JDBC的连接池选项:DBCP与C3P0
java - 使用JDBC的连接池选项:DBCP与C3P0 什么是可用于Java / JDBC的最佳连接池库? 我正在考虑2个主要候选人(免费/开源): Apache DBCP - [http://c ...
- JDBC数据源连接池(1)---DBCP
何为数据源呢?也就是数据的来源.我在前面的一篇文章<JDBC原生数据库连接>中,采用了mysql数据库,数据来源于mysql,那么mysql就是一种数据源.在实际工作中,除了mysql,往 ...
- JDBC通过连接池链接数据库总是失败的解决办法
应用服务器:glassfish JDBC通过连接池链接数据库总是失败,通过查看日志,发现是APACHE报DHCP 错误, 只需要通过访问4848端口的管理程序,重新PING下JDBC当前连接池即可.
- 「超市管理系统——商品管理」 · Java Swing + MySQL JDBC开发
项目下载:超市管理系统JavaSwing+MySQLJDBC开发_javamysql超市管理系统-互联网文档类资源-CSDN下载 1.9元付费赞助下载:超市管理系统JavaSwing+MySQLJDB ...
- 「会员卡管理系统」 · Java Swing + MySQL JDBC开发
目录 目录 一.语言和环境 二.实现功能 三.数据库设计 四.具体要求及推荐实现步骤 五.注意事项 六.评分标准 >>>实现代码: 数据库 com.ynavc.Bean com.yn ...
- 「物流跟踪管理系统」 · Java Swing + MySQL JDBC开发,美和易思结业考试机试试题
目录 文档说明: 一.语言和环境 二.技术要求 三.功能要求 四.数据库设计 五.具体要求及推荐实现步骤 六.注意事项 实现代码: 一.数据库 二.Java Swing com.ynavc.Bean ...
- 大数据笔记16—java基础篇12(JDBC 、连接池、事务)
目录 JDBC jdbc概述 jdbc入门案例 API详解 jdbc工具类 预编译执行平台 1.SQL注入问题(安全问题) 2API详解:预处理对象(PreparedStatement) 使用连接池重 ...
- Java 原始的JDBC方式连接MySQL数据库【钢镚核恒】
Java JDBC 简介 JDBC(Java DataBase Connectivity,Java数据库连接) JDBC 可让Java通过程序操作关系型数据库 JDBC 基于驱动程序实现与数据库的连接 ...
最新文章
- Expect自动化控制简单介绍
- 几种流行Webservice框架性能对照
- iOS中加载Flutter中的图片
- Linux下载安装zookeeper
- 【java学习之路】(java SE篇)005.面向对象基础入门part2
- “带锁的门”问题,并有c语言和python代码运行效率对比
- 9-4-插值查找-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版
- visa虚拟卡生成器_英国虚拟卡 获取多张VISA和Mastercard
- spark编程基础python版 pdf_《Spark编程基础(Scala版)》.PDF
- iWebShop 二次开发之商城后台模板渲染流程
- 批量生成MySQL不重复手机号大表
- 我的分形屏保 国王风暴《KingBlizzard》
- 【opencv】轮廓特征(质心,面积,周长,近似轮廓,凸包,凸度,边界矩形,直角矩形,旋转矩形,最小闭合圈,拟合椭圆、直线)
- cisco(思科)交换机操作(基本查询命令)【一】
- 证途网:一建报考条件
- ThingJS技术分享:建筑建模常用软件一览 3D 可视化
- (转) 行人检测资源 综述文献
- 速卖通流量新赛道,AE Mall商家享有权益和招商标准,看这篇文章就好了
- usleep()和sleep()的区别
- 盘点FCPX可能会遇到的问题,快来看看有你遇到的吗
热门文章
- IntelliJ IDEA常用快捷键汇总
- 二维码识别模块在物流仓储、通道闸机的嵌入式应用
- name followed by “::“ must be a class or namespace name
- Base64编码解码原理详解
- 从 Salesforce 与 Veeva 合作历程,浅谈垂直型SaaS的初创及发展思路
- Oracle11gR2集群心跳单网卡改bond实施方案
- swagger2 介绍+注解说明
- 疫情令亚马逊销量大涨,贝索斯身家今年增240亿美元
- 实用汽车英语(一)——汽车基本结构
- 使用Bootstrap Bar来增加Onboarding Progress Bar功能。