Ibatis使用方法演进

对于 maven工程 如何使用ibatis的基本功能 ?ibatis 的演进是怎么样的呢 ?


最原始的使用方法
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


你可能感兴趣的:(Ibatis使用方法演进)