uncode-dal
===========
本着不重复造轮子的原则,基于mybatis、spring jdbc、hibernate、mongo等ORM的通用数据访问层,支持基于datasource的读写分离、主备自动切换和故障转移,支持简单的负载均衡。
[TOC]
## 功能概述
* 基于mybatis、spring jdbc、hibernate等各大orm框架实现通用dal层功能,并可以与已有项目完全兼容。同时也可以在已经实现的orm框架之间任意切换,不需要对代码作任何改动。
* 实现dal层cache,可以自由设置过期时间。
* 实现基于多数据源(datasource)的读写分离、主备切换、故障转移、恢复检测和负载均衡
* 使用该组件必须遵循以下规则:
* 在使用DTO时,字段名称与数据库表字段一致,也可以不使用任何DTO类。
* 不支持连表查询,主要是单表操作,如果需要连表请与原生orm框架配合使用。
* sql默认主键字段为id,nosql默认主键字段为_id。
## 使用场景
随着nosql等新方案的出现,关系型数据库更多的被用在业务数据存储中,对于一些像报表等复杂数据处理的工作大部分公司已经不再使用关系型数据库,而对于业务数据90%以上是不需要连表查询等复杂操作的,该组件设计目标是将这90%的工作量变成零,避免重复工作,提高开发速度。使用该组件后将不再需要mybatis的自动生成,spring jdbc的sql语句,hibernate的各种注解,因为组件可以忙你处理。同时该组件只是基于orm框架对所有单表操作的提取和封装,最终还是由相应的orm框架完成持久化工作,所以不会代替orm的工作。因此论你的项目是新项目,还是老项目都可以使用,不会对原有业务生产任何影响,只是使你的操作更加便利,不再需要无数dao类,只要在需要的service中注入即可。组件需要遵循一定的COC规则,所以存在一定的使用限制,请大家注意。
## maven
目前组件存放于oschina的maven库中,请在项目中添加以下地址:http://maven.oschina.net/content/repositories/thirdparty/
### 1 mybatis
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-mybatis</artifactId>
<version>1.0.3</version>
</dependency>
### 2 spring jdbc
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-spring-jdbc</artifactId>
<version>1.0.3</version>
</dependency>
### 3 mongo
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>cn.uncode</groupId>
<artifactId>uncode-dal-mongo</artifactId>
<version>1.0.3</version>
</dependency>
jar文件下载地址:http://www.uncode.cn/uncode-dal/uncode-dal-all-1.0.3.zip
## spring集成
动态数据源可以自动处理故障转移和恢复检测,读写分离时多个读库采用随机获取。缓存可以自定义实现,可以统一开启或关闭,方便在开发环境使用。
### 1 DataSource配置
可以使用任意数据库连接池组件,建议使用Druid。配置Fastser-DAL动态数据源,将自动实现读写分离、主备自动切换和故障转移等,建议使用。使用Fastser-DAL动态数据源后,在spring jdbc/mybatis配置中将所有的ref="dataSource"换成ref="dynamicDataSource"即可。
<!--可选,动态数据源配置 -->
<bean id="dynamicDataSource" class="cn.uncode.dal.datasource.DynamicDataSource">
<!-- 从数据库配置,用于读操作,目前负载均衡机制为随机取一个 -->
<property name="slaveDataSources">
<map key-type="java.lang.String">
<entry key="readDataSourceOne" value-ref="dataSource3"/>
<entry key="readDataSourceTwo" value-ref="dataSource4"/>
</map>
</property>
<!-- 主数据库配置 -->
<property name="masterDataSource" ref="dataSource1" />
<!-- 备数据库配置 -->
<property name="standbyDataSource" ref="dataSource2" />
</bean>
<!--可选,使用动态数据源读写分离时必选 -->
<bean id="transactionManager" class="cn.uncode.dal.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 可选,Spring事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
### 2 Spring jdbc 实现配置
<!-- 可选,缓存默认实现,集群时建议使用分布式缓存自定义实现 -->
<bean id="dalCache" class="cn.uncode.dal.cache.impl.ConcurrentMapCache"></bean>
<!-- 配置缓存 -->
<bean id="cacheManager" class="cn.uncode.dal.cache.support.SimpleCacheManager">
<property name="cache" ref="dalCache"></property>
</bean>
<!-- 配置数据源解析器 -->
<bean id="resolveDatabase" class="cn.uncode.dal.descriptor.db.impl.SimpleResolveDatabase">
<property name="dataSource" ref="dataSource" />
<property name="cacheManager" ref="cacheManager" />
</bean>
<!-- spring jdbc实现配置 -->
<bean id="commonJdbcSupport" class="cn.uncode.dal.spring.jdbc.CommonJdbcSupport">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="baseDAL" class="cn.uncode.dal.spring.jdbc.SpringJDBCDAL">
<property name="cacheManager" ref="cacheManager" />
<property name="commonJdbcSupport" ref="commonJdbcSupport" />
<property name="resolveDatabase" ref="resolveDatabase" />
<!-- 可选,配置全局不使用缓存,默认为true -->
<property name="useCache" value="false" />
<!-- 可选,乐观锁,如果配置该项并且表中存在字段名为ver的字段,则该表可使用乐观锁机制 -->
<property name="version" value="ver" />
</bean>
### 3 Mybatis 实现配置
<!-- 可选,缓存默认实现,集群时建议使用分布式缓存自定义实现 -->
<bean id="dalCache" class="cn.uncode.dal.cache.impl.ConcurrentMapCache"></bean>
<!-- 配置缓存 -->
<bean id="cacheManager" class="cn.uncode.dal.cache.support.SimpleCacheManager">
<property name="cache" ref="dalCache"></property>
</bean>
<!-- 配置数据源解析器 -->
<bean id="resolveDatabase" class="cn.uncode.dal.descriptor.db.impl.SimpleResolveDatabase">
<property name="dataSource" ref="dataSource" />
<property name="cacheManager" ref="cacheManager" />
</bean>
<!-- mybatis实现配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="commonMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
<property name="mapperInterface" value="cn.uncode.dal.mybatis.CommonMapper" />
</bean>
<bean id="baseDAL" class="cn.uncode.dal.mybatis.MybatisDAL">
<property name="cacheManager" ref="cacheManager" />
<property name="commonMapper" ref="commonMapper" />
<property name="resolveDatabase" ref="resolveDatabase" />
<!-- 可选,配置全局不使用缓存,默认为true -->
<property name="useCache" value="false" />
<!-- 可选,乐观锁,如果配置该项并且表中存在字段名为ver的字段,则该表可使用乐观锁机制 -->
<property name="version" value="ver" />
</bean>
### 4 MongoDB 实现配置
<!-- 可选,缓存默认实现,集群时建议使用分布式缓存自定义实现 -->
<bean id="dalCache" class="cn.uncode.dal.cache.impl