Java基于数据源的数据库访问
☞ 概述
最早接触的Java访问数据库,是通过jdbc接口。后来工作之后,一般是在服务器(如weblogic)配置数据源,通过JNDI使用数据源;最近需要在程序中动态构造数据源,查了些资料,备录于此。
☞ 体系结构

我暂时没有系统的学习过UML,对各种图的规范画法不了解。所以上面的图仅供参考,不保证其合乎规范。
对于上图,需要说明:
- 组件之间的依赖关系,从上至下;即上面的组件依赖于下面的。
- spring-jdbc和commons-dbcp分别是对应jar包的名称;忽略了版本号。
上述5个组件的作用分别如下:
- 数据库驱动包
各数据库厂商提供的jdbc实现;其实数据源也是基于jdbc技术的。- properties配置文件
jdbc链接的相关配置,和数据源的相关配置。- commons-dbcp
提供数据源的实现,依赖与配置文件和驱动包。- spring-jdbc
主要是使用其中的JdbcTemplate工具类,而它依赖于数据源;JdbcTemplate提供了很多实用的方法,具体请参考spring的api。- 业务代码
基于JdbcTemplate进行数据库交互
☞ 组件内容
- 配置文件
在这里,我们是通过 org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(java.util.Properties prop) 来创建数据源实例,但是要求Properties的属性名称要和BasicDataSourceFactory声明的Field的名称相一致。除了jdbc链接的相关配置之外,其他的应该(猜测)都有其默认值,不是必须要配置的。配置文件的内容如下:driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@dzzx-db1.hnisi.com.cn:1523/zxkfk
username=***
password=*** # if you want to change the following config, make sure you konw their meanings, otherwise you should not to change them
initialSize=10
maxIdle=3
minIdle=2
maxActive=10
maxWait=10000各属性的名称,可以参考BasicDataSourceFactory源代码,这里仅对我用到的几个进行介绍:
- driverClassName
驱动类名称 - url
数据库连接url,不同数据库的写法有所不同 - username
数据库用户名 - password
数据库用户密码 - initialSize
数据源连接池初始连接数 - maxIdle
连接池中允许空闲连接的最大数 - minIdle
连接池中允许空闲连接的最小数 - maxActive
连接池中允许的活动连接的最大数 - maxWait
连接的最长等待时间,单位为毫秒
在上述配置项中,前四个是必要的jdbc连接配置,在jdbc编程中经常遇到;后面五个是数据源连接池相关的配置,根据其介绍,我们可以用一个猜想的场景对其进行不严谨的解释:
按照上述配置,初始情况下会有10个数据库连接(initialSize)
在初始情况下一般不会有数据库访问,即10连接都是空闲的,所以连接会被释放,连接数将减少到3(maxIdle) -- 所以配置时initialSize=maxIdle较好
等到有连接被请求使用了,此时空闲连接数将减少,等少于2(minIdle)时,会创建新的连接
如果业务代码请求连接,10秒(maxWait)还没有获取到,可能会抛出异常
业务代码使用完,释放连接之后,连接池中空闲的连接数会增加,所以将会减少连接,保持maxIdle的限制再次声明,上述的模式只是猜测,没有经过测试。
- driverClassName
- 创建数据源
我们通过 java.io.InputStream java.lang.Class.getResourceAsStream(String name) 来加载资源文件,获得InputStrInputStreameam实例;
通过 void java.util.Properties.load(InputStream inStream) 来加载属性配置到Properties实例;
通过 DataSource org.apache.commons.dbcp.BasicDataSourceFactory.createDataSource(Properties prop) 来获取数据源实例。Properties prop = new Properties();
InputStream is = SendUtil.class.getResourceAsStream("/cn/sinobest/jzpt/jgbm/common/message/sendMessage.properties");
prop.load(is);
DataSource ds = BasicDataSourceFactory.createDataSource(prop);当然,也可以不用工厂模式,以普通的方式创建数据源:
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
bds.setUrl("jdbc:oracle:thin:@dzzx-db1.hnisi.com.cn:1523/zxkfk");
bds.setUsername("***");
bds.setPassword("***");
bds.setInitialSize(10);
bds.setMaxIdle(3);
bds.setMinIdle(2);
bds.setMaxActive(10);
bds.setMaxWait(10 * 1000); - 访问数据库
我比较喜欢使用 org.springframework.jdbc.core.JdbcTemplate 这个工具类,他对增删改查都有封装,支持批处理;没有特殊的语法,写过jdbc代码的可以很容易过渡。我们只需要对其提供数据源实例,由他负责数据库连接的获取和释放,我们只管提供sql语句、参数和参数类型,其他的都不用我们操心。我的使用样例如下:String sql = "insert into S_SMS_WAITING_LIST (systemid,receiver,msg_content,senttime) values(?, ?, ?, ?)"
String systemid="1";
String phone="159********";
String content="您有一条短信";
String currtime=new Timestamp(System.currentTimeMillis());
Object[] args = {systemid, phone, content, currtime};
int[] argTypes = {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.TIMESTAMP};
JdbcTemplate jdbcTem = new JdbcTemplate(ds); // 上一步创建的数据源
jdbcTem.update(sql, args, argTypes);更多JdbcTemplate的方法,请查询相关API。
2015-08-19 19:42:02
Java基于数据源的数据库访问的更多相关文章
- 基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
在我的各种开发框架中,数据访问有的基于微软企业库,有的基于EFCore的实体框架,两者各有其应用场景,不过多的去比较.最近在使用SqlSugar的时候,觉得这个数据访问处理的组件确实很灵活,据说性能也 ...
- 基于SqlSugar的数据库访问处理的封装,支持.net FrameWork和.net core的项目调用
由于我们有时候需要在基于.net framework的项目上使用(如Winform端应用),有时候有需要在.net core的项目上使用(如.net core的WebAPI),那么我们把基于SQLSu ...
- 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...
- Druid数据源对数据库访问密码加密好麻烦
开发中,druid数据源对数据库密码进行了加密,每次切换数据库或者修改密码后,感觉很麻烦. 解决办法: 1.用工具类中的Java代码进行加解密. 需要用到com.alibaba.druid.filte ...
- java web-----DAO设计模式(数据库访问)
一,DAO设计模式用于 j2ee 的数据层访问,包括五部分, 数据库连接类(包含数据库的连接与关闭操作的一个类), VO类(私有变量与数据库表格对应,接收数据库中表格各字段内容), DAO接口类(包含 ...
- Java 测试连接Oracle数据库是否成功,ojdbc7.jar包下载
需要用到的jar 包: 链接:https://pan.baidu.com/s/1I1pC2f81IvbphZ6tWpVFOg 密码:uq0u 测试结果: package pkg; import jav ...
- Java实战之03Spring-04Spring的数据库访问
四.Spring的数据库访问 1.DAO模式 /** * 抽取的一个类 * @author zhy * */ public class JdbcDaoSupport { private QueryRu ...
- 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计
(12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...
- java文件来演示如何访问MySQL数据库
java文件来演示如何访问MySQL数据库. 注:在命令行或用一个SQL的前端软件创建Database. 先创建数据库: CREATE DATABASE SCUTCS; 接着,创建表: CREATE ...
随机推荐
- 什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系
TLD TLD的全称是Top Level Domain,顶级域名,它是一个因特网域名的最后部分,也就是任何域名的最后一个点后面的字母组成的部分. 最早的顶级域名有:.com(公司和企业)..net(网 ...
- HDU 2154 跳舞毯 | DP | 递推 | 规律
Description 由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准确地说是减肥. 小黑买来一块圆形的毯子,把它们分成三等分,分别标上A,B,C,称之为“跳舞毯”,他的运动方式是 ...
- [SDOI2011] 染色(Luogu 2486)
题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...
- svn: Checksum mismatch while updating 错误
最近使用svn客户端更新代码的时候出现 Checksum mismatch while updating 的错误 解决办法 在出错文件的目录下,用update to reversion , 先选onl ...
- 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件
两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...
- Apache 文件服务器
1.安装apache服务器yum install httpd 2.启动httpd服务service httpd start 3.查看httpd服务器的版本httpd -v 4.修改访问端口和文件路径, ...
- bzoj 2144: 跳跳棋——倍增/二分
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...
- python初步学习-python数据类型-字典(dict)
字典 字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起.注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息. 注意,你只 ...
- PHP路由代码
<?php /** * 路由 * @author 角度 QQ:1286522207 * */ class Dispatcher extends Action { private ...
- Python——format()/str.format()函数
格式化输出,除了类似于C语言的格式化输出外,还有str.format()方法,Python内建的format()函数,允许用户将待输出值以参数的形式,调用format()函数,在Python交互式sh ...