- 浏览: 430057 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
Glogo:
楼主您好,我在试验您的代码的时候发现新开的三个子线程并没有一直 ...
java 高并发 ReentrantLock -- 可重入的锁 -
univasity:
最近发觉也被限速了,投诉一下就好一会~~ 看来明天又要和电信M ...
ADSL上网速度慢 都是帐号限速惹的祸 -
liuyuanhui0301:
java 高并发 ReentrantLock -- 可重入的锁 -
dang_java:
呵.很好的说明文档.
JXTA技术与应用发展 -
helloqidi:
谢谢,学习了
SQL中exists和in的区别
ibatis初步介绍(DBCP连接池)
【虎.无名】注意,如何在iBatis中配置DBCP而不是SIMPLE数据库连接池。
http://www.blogcn.com/user24/zjpsh/blog/5346535.html
[转]ibatis初步介绍
<script type="text/javascript"></script>
在开发过程中最能帮助你的是什么?是框架,一个优秀的框架可以极大的提高你的效率。struts给了我们什么?MVC的实现,国际化、灵活。还有很多。不过,在一个通常的WEB应该中,是不能缺少数据库的,而struts在这方面并没有给我们提供什么有效的帮助。通常情况下我们做这个的时候有几个选择。
最直接的当然是JDBC啊,自己写connect、statment和resultset等等的代码,结果是累死自己。
然后一种方法是EJB,EJB确实是一个好东西,可惜在很多场合用不上,起码它很烦,速度很慢
还有一种选择就是JDO及类似的东西。最著名是free的应该是castor,hibernate等。
现在我们又多了一种选择,就是ibatis Db Layer,它的主页是http://www.ibatis.com,为什么说它好,让我们来看看作者自己的说明吧,使用ibatis的理由
10、知道怎样操作10种以上的数据库
9 、可配置的caching(包括从属)
8、支持DataSource、local transaction managemen和global transaction
7、简单的XML配置文档
6、支持Map, Collection, List和简单类型包装(如Integer, String)
5、支持JavaBeans类(get/set 方法)
4、支持复杂的对象映射(如populating lists, complex object models)
3、对象模型从不完美(不需要修改)
2、数据模型从不完美(不需要修改)
1、你已经知道SQL,为什么还要学习其他东西
另外一点它是100% Open Source Freeware
下面我们就来看一看,做一个简单的ibatis需要哪一些工作。然后一步一步深入探索它的强大功能。在实践中来看它的好处在哪里。
在ibatis的网站上有一个它自己的petstore,在我个人看来是最简洁的petstore了,跟struts1.0结合。应该说是一个不错的教程。希望大家能够好好研究。当然,作为入门。我们先来做一个简单的程序。所采用的库嘛,就仍然是用petstore的了。数据库也是选择Oracle(为什么选择Oracle,很多朋友不理解,怎么不用mysql之类的呢,一个主要的原因是个人爱好,Oracle毕竟是商业数据库,有它的强大之处,另外在linux下它也是免费的。废话少说,先用jpetstore3.1提供的ddl建立一个库吧。
然后在eclipse里建立一个ibatisDemo的工程。加入ibatis提供的库,建立相就的目录。看一下一个最简单的程序需要哪一些文件。我们选择一个简单表,即Category这个表的操作来演示功能
文件路径 功能说明 备注
config\properties\petstore.properties 可变参数配置文件,所有根据环境不同的参数都放在这里
config\properties\simple\dao.xml dao配置文件,主要存放dao对象和数据池设置
config\properties\simple\sql-map-config-storedb.xml 真正的核心配置文件
config\sqlmap\Category.xml 存放Category的数据操作的SQL
com.ewuxi.champion.exception.DaoException.java 自定义的Exception类,不用说了吧
com.ewuxi.champion.Service.java 一个服务类,用于初始化
com.ewuxi.champion.persistence.dao.DaoCommon Dao层的统一操作类,提供一些公共函数
com.ewuxi.champion.persistence.dao.CategoryDb Category的操作类
com.ewuxi.champion.persistence.vo.Category valueObject 值对象
com.ewuxi.champion.persistence.dao.CategoryDbTest 单元测试类
下面一个一个文件详细说明
petstore.properties
##################################################################
SIMPLE CONFIGURATION SECTION
##################################################################
## SimpleDataSource properties
## Use only if useSimpleConfiguration=true
SimpleDriver=oracle.jdbc.OracleDriver
SimpleUrl=jdbc:oracle:thin:@10.0.0.5:1521:champion
SimpleUsername=pet
SimplePassword=pet
这个不用解释,就是数据库的连接串,如果你在自己的机器上运行,当然这些都是需要改的。
dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dao-config
PUBLIC "-//iBATIS.com//DTD DAO Configuration 1.0//EN"
" " target="_blank">http://www.ibatis.com/dtd/dao.dtd">
<dao-config>
<context name="StoreDaoManager" default="true">
<!-- Configure the transaction pool. -->
<transaction-pool implementation="com.ibatis.db.dao.jdbc.SqlMapDaoTransactionPool">
<property name="sql-map-config-file" value="properties/simple/sql-map-config-storedb.xml"/>
</transaction-pool>
</context>
</dao-config>
上面这一段也是很简单的,连一个dao也没有配置,也就是说,用的是默认的Dao。其中<context name="StoreDaoManager" default="true">表示它是默认的数据库配置(它可以根据名字不同同时连接几个数据库的)。
sql-map-config-storedb.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sql-map-config
PUBLIC "-//iBATIS.com//DTD SQL Map Config 1.0//EN"
" " target="_blank">http://www.ibatis.com/dtd/sql-map-config.dtd">
<sql-map-config>
<properties resource="properties/petstore.properties" />
<settings
maxExecute="0"
maxExecutePerConnection="0"
maxTransactions="0"
cacheModelsEnabled="true"
statementCacheSize="175"
useBeansMetaClasses="false"
useGlobalTransactions="false" />
<datasource name="jpestoreSimple"
factory-class="com.ibatis.db.sqlmap.datasource.DbcpDataSourceFactory"
default="true" >
<property name="JDBC.Driver" value="{SimpleDriver}"/>
<property name="JDBC.ConnectionURL" value="{SimpleUrl}"/>
<property name="JDBC.Username" value="{SimpleUsername}"/>
<property name="JDBC.Password" value="{SimplePassword}"/>
<property name="Pool.MaximumActiveConnections" value="15"/>
<property name="Pool.MaximumIdleConnections" value="15"/>
<property name="Pool.MaximumWait" value="1000"/>
</datasource>
<sql-map resource="sqlmap/Category.xml" />
</sql-map-config>
这里真正实现了数据库连接,我们使用的是dbcp的连接池。JDBC的配置大家都很熟了。{SimpleDriver}就是指的前面petstore.properties中的SimpleDriver的内容。
而<sql-map resource="sqlmap/Category.xml" />则表示包含Category.xml这个文件。
Category.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sql-map
PUBLIC "-//iBATIS.com//DTD SQL Map 1.0//EN"
" " target="_blank">http://www.ibatis.com/dtd/sql-map.dtd">
<sql-map name="Category">
<result-map name="result" class="com.ewuxi.champion.persistence.vo.Category">
<property name="categoryId" column="CATID" columnIndex="1" />
<property name="name" column="NAME" columnIndex="2"/>
<property name="description" column="DESCN" columnIndex="3"/>
</result-map>
<mapped-statement name="findByPrimaryKeyCategoryDao" result-map="result">
select CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#
</mapped-statement>
<dynamic-mapped-statement name="findCategoryDao" result-map="result">
select CATID, NAME, DESCN from CATEGORY
<dynamic prepend="where">
<isNotNull prepend="and" property="categoryId" >
CATID = #categoryId#
</isNotNull>
<isNotNull prepend="and" property="name" >
NAME = #name#
</isNotNull>
<isNotNull prepend="and" property="description">
DESCN = #description#
</isNotNull>
</dynamic>
</dynamic-mapped-statement>
<mapped-statement name="findCategoryDaoCount" result-class="java.lang.Integer">
select count(1) as value from CATEGORY
</mapped-statement>
<!-- =============================================
mapped-statement
============================================= -->
<dynamic-mapped-statement name="updateByPrimaryKeyCategoryDao">
update CATEGORY
<dynamic prepend="set">
<isNotNull prepend="," property="name" >
NAME = #name#
</isNotNull>
<isNotNull prepend="," property="description">
DESCN = #description#
</isNotNull>
</dynamic>
where
CATID =#categoryId#
</dynamic-mapped-statement>
<!-- =============================================
mapped-statement
============================================= -->
<mapped-statement name="deleteByPrimaryKeyCategoryDao">
delete from CATEGORY
where CATID =#categoryId#
</mapped-statement>
<!-- =============================================
OPTIONAL EXPLICIT PARAMETER MAP
============================================= -->
<parameter-map name="insert-params">
<property name="categoryId"/>
<property name="name" type="VARCHAR"/>
<property name="description" type="VARCHAR"/>
</parameter-map>
<!-- =============================================
MAPPED STATEMENTS - w/Explicit Parameter Map
============================================= -->
<mapped-statement name="insertCategoryDao" parameter-map="insert-params" >
insert into CATEGORY (
CATID,NAME,DESCN)
values (
?,?,?
)
</mapped-statement>
</sql-map>
上述文件就是真正的SQL所存在的地方。
<result-map name="result" class="com.ewuxi.champion.persistence.vo.Category">
<property name="categoryId" column="CATID" columnIndex="1" />
<property name="name" column="NAME" columnIndex="2"/>
<property name="description" column="DESCN" columnIndex="3"/>
</result-map>
这一段的内容表示返回的对象是com.ewuxi.champion.persistence.vo.Category,也就是我们值对象。当执行查询的时候,dblay会封装出一个Category对象或者一个Category的list集合。其中数据列CATID就对象javabean的categoryId值。name是自定义的
<mapped-statement name="findByPrimaryKeyCategoryDao" result-map="result">
select CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#
</mapped-statement>
此处result-map="result"表示返回结果以后,就会参照前面的result来返回对象。select CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#标准的SQL,只不过这一点CATID = #categoryId#有些不同,#categoryId#表示传递一个Category对象时,Dblay会自动取得categoryId的值来执行SQL
再来看一个
<dynamic-mapped-statement name="updateByPrimaryKeyCategoryDao">
update CATEGORY
<dynamic prepend="set">
<isNotNull prepend="," property="name" >
NAME = #name#
</isNotNull>
<isNotNull prepend="," property="description">
DESCN = #description#
</isNotNull>
</dynamic>
where
CATID =#categoryId#
</dynamic-mapped-statement>
这个地方就体现了dblayer的强大之处,动态SQL。平常我们经常碰到的情况是根据不同的情况,执行的SQL有一点点不一样。写在程序里,要写不少的if then之类的,在这里,dbLayer给你一下解决了。比如在这里,我们三个值都是String对象,所以通过isNotNull就可以实现几种不同的update了,比如,如果我只想修改DESCN
发表评论
-
Android 数字签名学习笔记
2012-04-25 11:03 990在 Android系统中,所有安装到系统的应用程序都必有 ... -
序列化:serializable,hessian,protobuf性能对比
2011-10-31 17:08 1261分布式应用系统中,系统之间的通讯的质量决定了系统的可用性 ... -
JAR 文件揭密
2011-10-18 01:28 895JAR 文件是什么? ... -
SSL双向认证java实现
2011-10-17 23:49 1026本文通过模拟场景,介绍SSL双向认证的java实现默认的情况下 ... -
Benchmark Analysis: Guice vs Spring
2011-04-19 14:35 1050The original link can be found ... -
Java Network Launching Protocol
2011-04-18 17:43 944在java开发的早期,重点被放在了客户端开发。语言中对于app ... -
NIO 包及工作原理
2011-03-11 11:14 1757NIO 包及工作原理 针对 ... -
使用Java NIO编写高性能的服务器
2011-03-11 01:19 817从JDK 1.4开始,Java的标 ... -
RMI, RMI-IIOP,JNDI
2009-05-21 17:31 15291. RMI-IIOP(Java Remote ... -
企业中的 RMI-IIOP
2009-05-21 17:13 1017RMI 和 CORBA 常被视 ... -
JMX
2009-05-21 15:44 1010JMX规范 1.1 J ... -
使用Eclipse IDE的技巧
2009-02-24 11:00 1798使用Eclipse IDE的技巧 作 ... -
spring quartz 动态定时任务
2009-01-22 13:31 4508什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什 ... -
基于struts+spring+ibatis的轻量级
2009-01-12 16:21 1041基于struts+spring+ibatis的轻量级J2 ... -
Log4j配置实例[经典]
2009-01-12 14:53 1291Log4j配置实例[经典] 0 推荐 ... -
jbpm工作流学习心得
2008-09-19 13:59 1306一,装载流程: 第一种: java 代码 JbpmCo ... -
jbpm请假工作流
2008-09-19 13:56 1856请假流程(备用) 工作中要用到JBPM写工作流,自习的时 ... -
利用JExcel API操作EXCEL文件
2008-09-08 10:52 1476使用Windows操作系统的朋 ... -
jExcel API讲解
2008-09-08 10:51 1496转自:http://jhobby.iteye.com/blog ... -
Tomcat5.0乱码全解决方案
2008-09-02 11:56 1103http://hi.baidu.com/liet2008/bl ...
相关推荐
DBCP(DataBase Connection Pool)是Apache组织提供的一款Java数据库连接池组件,它是Tomcat服务器默认使用的连接池组件。数据库连接池技术的主要目的是提高系统性能,减少数据库操作中的资源开销,通过预先创建并...
DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,它的全称是Apache Commons DBCP。DBCP的主要功能是管理数据库连接,通过池化技术提高数据库操作的性能,减少创建和释放数据库连接...
本文将深入探讨如何在Spring环境下配置几种常用的数据库连接池,包括HikariCP、Druid和Apache DBCP2。 一、HikariCP HikariCP被誉为最快的Java数据库连接池,它的设计目标是提供最小的延迟和最大的并发性能。在...
而c3p0则是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,提供了比DBCP更好的性能和更全面的配置选项。 **一、iBatis与c3p0集成** 1. **添加依赖**: 首先,需要在项目的类路径下添加c3p0的jar包。如果你使用的...
以下是一个简单的Java代码示例,展示了如何创建和使用DBCP连接池: ```java package dbcp; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql....
2. 使用DBCP连接池优化数据库操作的技巧。 3. 编写SQL语句和Ibatis映射文件来执行CRUD操作。 4. Spring的依赖注入和事务管理在实际项目中的应用。 5. MVC模式在Struts2中的实现,以及如何设计和组织控制器、模型和...
Proxool是由iBatis团队开发的,其设计目标是提供一个简单易用、功能全面且性能优异的数据库连接池。与C3P0、DBCP、HikariCP等其他连接池相比,Proxool在小型项目或测试环境中表现出色,尤其适合那些对资源管理和性能...
iBatis会根据这些语句动态生成SQL执行代码,并通过DBCP连接池获取数据库连接,执行SQL,最后将结果转换为Java对象。 Apache DBCP(Database Connection Pool)是Apache提供的一个数据库连接池组件,它可以帮助我们...
iBatis本身并不包含数据库连接池,但可以与常见的数据库连接池如C3P0、DBCP或HikariCP等配合使用。数据库连接池负责管理数据库连接的创建、复用和释放,提高了系统的性能和资源利用率。 四、iBatis的映射机制 ...
- `commons-dbcp-xxx.jar` 或 `pool-xxx.jar`(可能包含):数据库连接池,提高数据库连接的复用性,提升性能。 - `spring-xxx.jar`(如果与Spring集成):Spring框架的相关库,用于实现依赖注入和事务管理。 5. ...
- `commons-dbcp.jar`:数据库连接池的实现。 - `commons-logging-api.jar`:日志API。 - `commons-logging.jar`:日志实现。 - `commons-pool.jar`:对象池的实现。 - `hsqldb.jar`:HSQLDB数据库驱动。 - `ibatis-...
- **连接池配置**:如果使用`DBCP`类型的`dataSource`,还可以设置连接池的相关参数,如最大活动连接数、最大空闲连接数等。 7. **SQL映射文件`<sqlMap>`**: ```xml ``` 指定了ibatis的SQL映射文件路径。每...
- DBCP(Database Connection Pool)数据源工厂利用Apache Commons DBCP库实现数据库连接池功能,适用于高性能的应用场景。 3. **JNDI**:`com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory` - JNDI...
3. commons-dbcp.jar 或 c3p0.jar:这些是数据库连接池的实现,用于高效管理数据库连接。 4. mybatis-spring.jar:这是Spring与iBatis之间的桥梁,提供了将iBatis SqlSessionTemplate和SqlSessionFactoryBean集成到...
它不仅负责管理事务连接池,还能够处理多个ORM(Object Relational Mapping)环境下的事务操作。本文将深入探讨iBATIS DAO事务管理的具体实现方式及其配置细节,并通过分析相关的类结构图来更好地理解其内部工作原理...
例如,它可以与C3P0、DBCP等连接池配合使用。 4. 参数映射与结果映射:Ibatis提供了强大的参数映射和结果映射机制,能够自动将Java对象与SQL语句中的参数和查询结果进行匹配。通过`<parameterMap>`和`<resultMap>`...
针对不同数据库,可能需要配置不同的连接池实现,如 HikariCP、C3P0 或者 DBCP。 5. **驱动程序管理**:在项目中,需要为每种数据库添加对应的 JDBC 驱动依赖,并在配置中指定正确的驱动类名。 6. **事务管理**:...