开源数据库连接池

l 现在很多 WEB 服务器 ( Weblogic , WebSphere , Tomcat) 都提供了 DataSoruce 的实现,即连接池的实现。通常我们把 DataSource 的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
l 也有一些开源组织提供了数据源的独立实现:
• DBCP 数据库连接池
• C3P0 数据库连接池
l 实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。 程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

DBCP数据源

l DBCP 是 Apache 软件基金组织下的开源连接池实现,使用 DBCP 数据源,应用程序应在系统中增加如下两个 jar 文件:
• Commons-dbcp.jar :连接池的实现
• Commons-pool.jar :连接池实现的依赖库
l Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

DBCP数据源

static{

InputStream in =JdbcUtil.class.getClassLoader().

getResourceAsStream("dbcpconfig.properties");

Properties prop = newProperties();

prop.load(in);

BasicDataSourceFactoryfactory =newBasicDataSourceFactory();

dataSource =factory.createDataSource(prop);

}

C3P0数据源

JNDI技术简介

l JNDI(Java Naming and DirectoryInterface) , Java 命名和目录接口,它对应于 J2SE 中的 javax.naming 包,
l 这套 API 的主要作用在于:它可以把 Java 对象放在一个容器中( JNDI 容器),并为容器中的 java 对象取一个名称,以后程序想获得 Java 对象,只需通过名称检索即可。
l 其核心 API 为 Context ,它代表 JNDI 容器,其 lookup 方法为检索容器中对应名称的对象。

编写自己的JDBC框架

元数据-DataBaseMetaData

l 元数据:数据库、表、列的定义信息。
l Connection.getDatabaseMetaData ()
l DataBaseMetaData 对象
• getURL () :返回一个 String 类对象,代表数据库的 URL 。
• getUserName () :返回连接当前数据库管理系统的用户名。
• getDatabaseProductName () :返回数据库的产品名称。
• getDatabaseProductVersion () :返回数据库的版本号。
• getDriverName () :返回驱动驱动程序的名称。
• getDriverVersion () :返回驱动程序的版本号。
• isReadOnly () :返回一个 boolean 值,指示数据库是否只允许读操作。

元数据-ParameterMetaData

l PreparedStatement . getParameterMetaData ()
• 获得代表 PreparedStatement 元数据的 ParameterMetaData 对象。
• Select* from user where name=? And password=?
l ParameterMetaData 对象
• getParameterCount ()
• 获得指定参数的个数
• getParameterType ( int   param )
• 获得指定参数的 sql 类型

元数据-ResultSetMetaData

l ResultSet . getMetaData ()
• 获得代表 ResultSet 对象元数据的 ResultSetMetaData 对象。
l ResultSetMetaData 对象
• getColumnCount ()
• 返回 resultset 对象的列数
• getColumnName ( int  column)
• 获得指定列的名称
•   getColumnTypeName ( int  column)
• 获得指定列的类型

使用元数据简化JDBC代码

l 业务背景:系统中所有实体对象都涉及到基本的 CRUD 操作:
• 所有实体的 CUD 操作代码基本相同,仅仅发送给数据库的 SQL 语句不同而已,因此可以把 CUD 操作的所有相同代码抽取到工具类的一个 update 方法中,并定义参数接收变化的 SQL 语句。
• 实体的 R 操作,除 SQL 语句不同之外,根据操作的实体不同,对 ResultSet 的映射也各不相同,因此可义一个 query 方法,除以参数形式接收变化的 SQL 语句外,可以使用策略模式由 qurey 方法的调用者决定如何把 ResultSet 中的数据映射到实体对象中。

O-RMapping简介

l 什么是 O-R Mapping
l 常用 O-R Mapping 映射工具
• Hibernate
• Ibatis
• Commons DbUtils ( 只是对 JDBC 简单封装 )

Apache—DBUtils框架

l commons- dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库,它是对 JDBC 的简单封装,学习成本极低,并且使用 dbutils 能极大简化 jdbc 编码的工作量,同时也不会影响程序的性能。因此 dbutils 成为很多不喜欢 hibernate 的公司的首选。
l API 介绍:
• org.apache.commons.dbutils.QueryRunner
• org.apache.commons.dbutils.ResultSetHandler
• 工具类
• org.apache.commons.dbutils.DbUtils 、。   

DbUtils类

l DbUtils :提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类,里面的所有方法都是静态的。主要方法如下:
• public static void close(…) throws java.sql.SQLException : DbUtils 类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是 NULL ,如果不是的话,它们就关闭 Connection 、 Statement 和 ResultSet 。
• public static void closeQuietly (…): 这一类方法不仅能在 Connection 、 Statement 和 ResultSet 为 NULL 情况下避免关闭,还能隐藏一些在程序中抛出的 SQLEeception 。
• public static void commitAndCloseQuietly (Connection conn) : 用来提交连接,然后关闭连接,并且在关闭连接时不抛出 SQL 异常。
• public static boolean loadDriver ( java.lang.String driverClassName ) :这一方装载并注册 JDBC 驱动程序,如果成功就返回 true 。使用该方法,你不需要捕捉这个异常 ClassNotFoundException 。

QueryRunner类

l 该类简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
l QueryRunner 类提供了两个构造方法:
• 默认的构造方法
• 需要一个 javax.sql.DataSource 来作参数的构造方法。

QueryRunner类的主要方法

l publicObject query(Connection conn, String sql , Object[] params , ResultSetHandler rsh ) throws SQLException :执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。 该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭 。
l publicObject query(String sql , Object[] params , ResultSetHandler rsh ) throws SQLException : 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源 ( DataSource ) 或使用的 setDataSource 方法中重新获得 Connection 。
l
l publicObject query(Connection conn, String sql , ResultSetHandler rsh ) throws SQLException : 执行一个不需要置换参数的查询操作。
l
l public int update(Connection conn, String sql , Object[] params ) throws SQLException : 用来执行一个更新(插入、更新或删除)操作。
l
l public int update(Connection conn, String sql ) throws SQLException :用来执行一个不需要置换参数的更新操作。

ResultSetHandler接口

l 该接口用于处理 java.sql.ResultSet ,将数据按要求转换为另一种形式。
l ResultSetHandler 接口提供了一个单独的方法: Object handle ( java.sql.ResultSet . rs ) 。

ResultSetHandler接口的实现类

l ArrayHandler :把结果集中的第一行数据转成对象数组。
l ArrayListHandler :把结果集中的每一行数据都转成一个数组,再存放到 List 中。
l BeanHandler :将结果集中的 第一行 数据封装到一个对应的 JavaBean 实例中。
l BeanListHandler :将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List 里。
 
l ColumnListHandler :将结果集中某一列的数据存放到 List 中。
l KeyedHandler (name) :将结果集中的每一行数据都封装到一个 Map< 列名 , 列值 > 里,再把这些 map 再存到一个 map 里,其 key 为指定的 key 。
l MapHandler :将结果集中的第一行数据封装到一个 Map 里, key 是列名, value 就是对应的值。
l MapListHandler :将结果集中的每一行数据都封装到一个 Map 里,然后再存放到 List
注意事项
l 不管 java 的对象存在何种关系,反映到关系型数据库中,都是使用外键表示纪录(即对象)的关联关系。
l 设计 java 对象如涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系 ( 或使用延迟加载的方式 ) 。

jdbc详解(三)的更多相关文章

  1. JDBC详解系列(三)之建立连接(DriverManager.getConnection)

      在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...

  2. JDBC详解系列(二)之加载驱动

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)---   在JDBC详解系列(一)之流程中 ...

  3. JDBC详解(一)

    一.相关概念介绍 1.1.数据库驱动 这里驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡,同样道理 ...

  4. Java基础-面向接口编程-JDBC详解

    Java基础-面向接口编程-JDBC详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.JDBC概念和数据库驱动程序 JDBC(Java Data Base Connectiv ...

  5. JDBC详解1

    JDBC详解1 JDBC整体思维导图 JDBC入门 导jar包:驱动! 加载驱动类:Class.forName("类名"); 给出url.username.password,其中u ...

  6. .NET DLL 保护措施详解(三)最终效果

    针对.NET DLL 保护措施详解所述思路完成最终的实现,以下为程序包下载地址 下载 注意: 运行环境为.net4.0,需要安装VS2015 C++可发行组件包vc_redist.x86.exe.然后 ...

  7. Android 之窗口小部件详解(三)  部分转载

    原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...

  8. Spring4 JDBC详解

    Spring4 JDBC详解 在之前的Spring4 IOC详解 的文章中,并没有介绍使用外部属性的知识点.现在利用配置c3p0连接池的契机来一起学习.本章内容主要有两个部分:配置c3p0(重点)和 ...

  9. WebSocket安卓客户端实现详解(三)–服务端主动通知

    WebSocket安卓客户端实现详解(三)–服务端主动通知 本篇依旧是接着上一篇继续扩展,还没看过之前博客的小伙伴,这里附上前几篇地址 WebSocket安卓客户端实现详解(一)–连接建立与重连 We ...

  10. logback -- 配置详解 -- 三 -- <encoder>

    附: logback.xml实例 logback -- 配置详解 -- 一 -- <configuration>及子节点 logback -- 配置详解 -- 二 -- <appen ...

随机推荐

  1. 【转】Android C程序也可自己手动用交叉编译器编译 (

    原文网址:http://blog.sina.com.cn/s/blog_533074eb0101ez5q.html Android 编译环境 本身比较复杂,且不像普通的编译环境:只有顶层目录下才有 M ...

  2. svn小技巧——重定向svn diff

    svn diff的默认输出模式比较冗长,如果遇到修改比较多的情况,有时会较难看清diff.svn本身提供了自定义diff输出的选项,可能的修改方法如下: 建立一个脚本文件(如svndiff.sh),调 ...

  3. MATLAB三维曲面

    今天终于测试了,发下来第一张试卷中只会做一小题.我蒙了!!! 所以呢,我现在再做一下,总结总结! 作函数 f(x)=2(x1-1)4+2x22 的三维图. 这道题要用到的知识点有函数meshgrid. ...

  4. UESTC_秋实大哥去打工 2015 UESTC Training for Data Structures<Problem G>

    G - 秋实大哥去打工 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  5. 二分搜索(Binary Search)

    当我们在字典中查找某个单的时候,一般我们会翻到一个大致的位置(假设吧,翻到中间位置),开始查找.如果翻到的正好有我们要的词,那运气好,查找结束.如果我们要找的词还在这个位置的前面,那我们对前面的这一半 ...

  6. 剑指offer-面试题9.斐波拉契数列

    题目一:写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列的定义如下: { n=; f(n)={ n=; { f(n-)+f(n-) n>; 斐波拉契问题很明显我们会想到用递归来解决: ...

  7. HDU 1272 小希的迷宫(并查集) 分类: 并查集 2015-07-07 23:38 2人阅读 评论(0) 收藏

    Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就 ...

  8. hdu 5463 Clarke and minecraft(贪心)

    Problem Description Clarke is a patient with multiple personality disorder. One day, Clarke turned i ...

  9. Spring的AOP1

    引用:http://my.oschina.net/huangyong/blog/161338 是一个周末,刚给宝宝喂完牛奶,终于让她睡着了.所以现在我才能腾出手来,坐在电脑面前给大家写这篇文章. 今天 ...

  10. Unity之极光推送

    Android应用中大多数应用使用了推送,游戏中当然也可以使用推送!下面在Unity3D做个测试!(下面是客套话,大家可以忽略) 1.1 什么是推送技术? 推送技术,又名反向AJAX,指的是一种基于I ...