最原始的使用方法:
1. pom中引入 ibatis的依赖:
1
2
3
4
5
|
<!-- ibatis -->
<dependency>
<groupId>com.taobao.security</groupId>
<artifactId>ibatis</artifactId>
</dependency>
|
2. 书写sqlmapconfig配置文件:
在 sqlmapconfig中具体配置setting,transactionManager (在transactionManager 中配置JDBC的dataSource),sqlmap引用 ;
setting节点进行全局配置,比如最大请求数,最大session数,是否缓存等;
transactionManager 节点定义ibatis的事务管理器,dataSource从属于transactionManager 节点,用于设定ibatis运行期使用的DataSource属性;
sqlmap 节点 指定映射文件的位置,配置中可以出现多颗sqlmap节点;
3. sqlmapClient 的初始化:
1
2
3
4
5
6
|
XmlSqlMapClientBuilder 可以根据配置文件创建sqlmapClient 实例;
String resource =
"com/ibatis/sample/SqlMapConfig.xml"
;
//classpath下SqlMapConfig的相对路径
Reader reader;
reader = Resources.getResourceAsReader(resource);
XmlSqlMapClientBuilder xmlSqlMapClientBuilder =
new
XmlSqlMapClientBuilder();
SqlMapClient sqlMapClient = xmlSqlMapClientBuilder.buildSqlMap(reader);
|
4. 使用 sqlmapClient 对数据 进行增删改查
比如:
1
2
3
|
SqlMapClient sqlMap = getSqlMapClient();
sqlMap.insert(
"User.insertUser"
, user);
sqlMap.queryForObject(
"User.getById"
,
"1"
);
|
引入spring对ibatis的支持后的使用方法:
1. pom中引入 ibatis的依赖:
1
2
3
4
5
|
<!-- ibatis -->
<dependency>
<groupid>com.taobao.security</groupid>
<artifactid>ibatis</artifactid>
</dependency>
|
2. 配置数据库连接的时候,使用spring的 ibatis组件 SqlMapClientFactoryBean 类 包装 datasource
1
2
3
4
5
|
<!-- 直接访问dao的通用sqlMapBean -->
<bean id=
"commonSqlMapBean"
class
=
"org.springframework.orm.ibatis.SqlMapClientFactoryBean"
>
<property name=
"configLocation"
value=
"classpath:persistence/sqlmap-config-common.xml"
>
<property name=
"dataSource"
ref=
"dataSource"
>
</property></property></bean>
|
configLocation 属性 配置的是 我们sqlmap的配置文件(也就是sqlmap汇总的地方)
一般sqlmap-config-common.xml 中的内容如下:
1
2
3
4
5
6
7
8
9
10
|
<!--?xml version=
"1.0"
encoding=
"GBK"
?-->
<sqlmapconfig>
<settings cachemodelsenabled=
"false"
enhancementenabled=
"false"
lazyloadingenabled=
"false"
maxrequests=
"3000"
maxsessions=
"3000"
maxtransactions=
"3000"
usestatementnamespaces=
"false"
>
<sqlmap resource=
"mapping/xxxx-sqlmap.xml"
>
</sqlmap>
</settings>
</sqlmapconfig>
|
在sqlmap中就需要写PODO 属性与数据库字段的映射关系 和 基本的增删改查的sql语句了。
datasource 属性 就是我们连接数据库的基本配置
生成的 commonSqlMapBean 用来初始化 SqlMapClient ,比之前自己初始化的方式简单多了,而且dataSource也可以用了共享了。
3. 同样使用 SqlmapClient 对数据 进行增删改查,只不过 spring 对 sqlmapClient 又进行了封装,封装为 SqlMapClientTemplate ,SqlMapClientDaoSupport 中内嵌了 SqlMapClientTemplate 对象;
我们书写的 DAO 对象 只要继承 SqlMapClientDaoSupport 对象就能使用 SqlMapClientTemplate (对SqlmapClient 的封装)对象来操作数据库。
1
2
3
4
5
6
|
public
class
UserDAOImpl
extends
SqlMapClientDaoSupport
implements
UserDAO {
public
void
select(User user) {
getSqlMapClient().delete(
"selectUser "
,user.getId());
}
}
|
总结:
使用 spring 对 ibatis 的支持类,资源统一管理,简化了相关配置,也自动完成了 SqlmapClient 的自动注入,数据库连接bean也可以复用;
在Spring-ibatis 的基础上引入 common-dao 对多数据库操作的使用方法:
1. pom中引入 ibatis的依赖:
1
2
3
4
5
6
7
8
9
10
|
<!-- ibatis -->
<dependency>
<groupid>com.taobao.security</groupid>
<artifactid>ibatis</artifactid>
</dependency>
<dependency>
<groupid>com.taobao.common.dao</groupid>
<artifactid>common-dao</artifactid>
<version>
1.0
.
3
</version>
</dependency>
|
<!-- 行癫 写的代码是不是值得好好看看呢 -->
2. 在 spring-ibatis 上做了 对 SqlMapClientDaoSupport 的扩展,其他配置都是一样的。
common-dao.jar 在什么场景下产生的,具体做了什么事情,解决了什么问题?
产生场景:
2005年 淘宝随着业务量的增长,系统在数据库读写上出现了瓶颈(单数据库连接数不够),所以进行了数据库的拆分,当时的数据库是两台oracle,故我们能看到有db1 和 db2 的出现,后来 又把评价、收藏夹、论坛等拆除独立的数据库;那么我们的程序如何控制访问不同的数据库呢?common-dao.jar就诞生了,通过 对 SqlMapClientDaoSupport 的改造 和 添加路由配置管理 实现了对多数据库读写的支持。
解决了什么问题:
单数据库数据库读写连接数不够的瓶颈;支持多数据库连接;
做了什么事情:
common-dao 其实做了一件事: 对多数据库连接的支持。
SqlMapClientDaoSupport 里面内嵌的 SqlMapClientTemplate 对象只能设置一个dataSource;而common-dao包中的SqlMapBaseDAOSupport 内嵌的是一个List类型的SqlMapClientTemplate ,用来支持多数据库连接信息的存储,每个SqlMapClientTemplate 都有一个路由规则与之对应;
SqlMapBaseDAOSupport 作为一个内嵌对象在 SqlMapBaseDAO 类中,在 SqlMapBaseDAO 类中实现了基本的增删改查的操作,这些操作方法中一般都会呆上 路由规则参数,方便通过getSqlMapClient()方法获取相应的数据库连接 对象SqlMapClientTemplate 。
其次对 DBRoute做了配置(DBRouteConfig)和管理(DBRouteManager);
3. 使用方法:
SqlMapBaseDAO 的初始化(意味着SqlMapClient也会被初始化):
首先 SqlMapBaseDAO 需要 SqlMapBaseDAOSupport 对象初始化
1
2
3
4
|
<!-- DAO base bean -->
<bean id=
"sqlMapBaseDAO"
class
=
"com.taobao.common.dao.persistence.SqlMapBaseDAO"
>
<property name=
"sqlDaoBaseSupport"
ref=
"sqlDaoBaseSupport"
>
</property></bean>
|
其次 SqlMapBaseDAOSupport 对象 需要 DBRouteManager 和 sqlMapList 进行初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!-- multi db Dao support -->
<bean id=
"sqlDaoBaseSupport"
class
=
"com.taobao.common.dao.persistence.SqlMapBaseDAOSupport"
init-method=
"init"
>
<property name=
"dbRouteManager"
ref=
"dbRouteManager"
>
<property name=
"sqlMapList"
>
<map>
<entry key=
"taeAdminSqlMap"
value-ref=
"taeAdminSqlMap"
>
<!--在这里可以配置多个spring-ibatis数据库连接-->
<!-- key 是指定路由规则,也称路由节点-->
<!-- value 是 SqlMapClientFactoryBean 多对应的bean-->
</entry></map>
</property>
</property></bean>
|
然后 DBRouteManager 初始化需要 DBRouteConfig 的初始化
1
2
3
4
|
<!-- db route manager -->
<bean id=
"dbRouteManager"
class
=
"com.taobao.common.dao.persistence.DBRouteManager"
>
<property name=
"dbRouteConfig"
ref=
"dbRouteConfig"
>
</property></bean>
|
最后 DBRouteConfig 的初始化是设置所有 spring-ibatis数据库连接 的对象bean 和 设置默认数据库连接bean
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- db route config -->
<bean id=
"dbRouteConfig"
class
=
"com.taobao.common.dao.persistence.DBRouteConfig"
init-method=
"init"
>
<property name=
"allNodeNameList"
>
<list>
<value>taeAdminSqlMap</value>
</list>
</property>
<property name=
"defaultNodeNameList"
>
<list>
<value>taeAdminSqlMap</value>
</list>
</property>
</bean>
|
这样就完成了 SqlMapBaseDAO 的初始化任务;
Java 类中使用方法
1
2
3
4
5
6
7
|
public
class
AnswerDAOImpl
extends
SqlMapBaseDAO
implements
AnswerDAO {
public
AnswerDO insertAnswerInfo( AnswerDO answerDO)
throws
DAOException {
super
.executeInsert(
"AnswerDAO.insert"
, answerDO,
null
);
return
answerDO;
}
}
|
备注: common-dao 对多数据库的支持不同于TDDL,common-dao 做路由是在SqlMapBaseDAOSupport层,通过指定SqlMapBaseDAOSupport从而确定所要路由的数据库,然后 TDDL 是在dataSource 层做路由,TDDL 管理了一系列单数据库连接的集合。
common-dao:
|-- SqlMapBaseDAOSupport |--sqlmapconfig common-dao ---|-- SqlMapBaseDAOSupport ---| |-- SqlMapBaseDAOSupport |--dataSource (single datasource)
TDDL:
|-appName(muti datasource) dataSource -- TDDL(TDataSource) --|-useLocalConfig |-appRuleFile