基于mybatis、spring jdbc、hibernate的通用數據該問層:fastser-dal
fastser-dal
本著不重復造輪子的原則,基于mybatis、spring jdbc、hibernate等ORM的通用數據該問層,支持基于datasource的讀寫分離、主備自動切換和故障轉移,支持簡單的負載均衡。
功能概述
- 基于mybatis、spring jdbc、hibernate等各大orm框架實現通用dal層功能,并可以與已有項目完全兼容。
- 實現dal層cache
- 實現基于多數據源(datasource)的讀寫分離、主備切換、故障轉移、恢復檢測和負載均衡
- 使用該組件必須遵循以下規則:默認字段名稱與數據庫表字段一致,每張表有名稱為id的唯一標識字段
與spring集成
動態數據源可以自動處理故障轉移和恢復檢測,讀寫分離時多個讀庫采用隨機獲取。緩存可以自定義實現,可以統一開啟或關閉,方便在開發環境使用。
<!-- 緩存默認實現,可以自定義實現 --> <bean id="cacheManager" class="org.fastser.dal.cache.support.SimpleCacheManager"></bean> <!-- 配置緩存 --> <bean id="cacheManager" class="org.fastser.dal.cache.support.SimpleCacheManager"> <property name="cache" ref="dalRedisCache"></property> </bean> <!-- 配置數據源解析器 --> <bean id="resolveDatabase" class="org.fastser.dal.descriptor.db.impl.SimpleResolveDatabase"> <property name="dataSource" ref="dataSource" /> <property name="cacheManager" ref="cacheManager" /> </bean> <!-- spring jdbc實現配置 --> <bean id="commonJdbcSupport" class="org.fastser.dal.spring.jdbc.CommonJdbcSupport"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="baseDAL" class="org.fastser.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> <!-- 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="org.fastser.dal.mybatis.CommonMapper" /> </bean> <bean id="baseDAL" class="org.fastser.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> <!-- hibernate實現配置 --> 待實現 <!--可選,動態數據源配置 --> <bean id="dynamicDataSource" class="org.fastser.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>
使用示例
1 現有方法
-
列表查詢
fields需要顯示的字段,queryCriteria查詢條件,seconds緩存時間
QueryResult selectByCriteria(List<String> fields, QueryCriteria queryCriteria); QueryResult selectByCriteria(String[] fields, QueryCriteria queryCriteria); QueryResult selectByCriteria(List<String> fields, QueryCriteria queryCriteria, int seconds); QueryResult selectByCriteria(String[] fields, QueryCriteria queryCriteria, int seconds); QueryResult selectByCriteria(QueryCriteria queryCriteria); QueryResult selectByCriteria(QueryCriteria queryCriteria, int seconds); QueryResult selectPageByCriteria(List<String> fields, QueryCriteria queryCriteria); QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria); QueryResult selectPageByCriteria(List<String> fields, QueryCriteria queryCriteria, int seconds); QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria, int seconds); QueryResult selectPageByCriteria(QueryCriteria queryCriteria); QueryResult selectPageByCriteria(QueryCriteria queryCriteria, int seconds);
-
統計查詢
queryCriteria查詢條件,seconds緩存時間
int countByCriteria(QueryCriteria queryCriteria); int countByCriteria(QueryCriteria queryCriteria, int seconds);
-
主鍵查詢
Object帶主鍵對象實體,fields需要顯示的字段,queryCriteria查詢條件,seconds緩存時間,clazz對象實例類型,id對象主鍵
QueryResult selectByPrimaryKey(Object obj); QueryResult selectByPrimaryKey(Object obj, int seconds); QueryResult selectByPrimaryKey(List<String> fields, Object obj); QueryResult selectByPrimaryKey(String[] fields, Object obj); QueryResult selectByPrimaryKey(List<String> fields, Object obj, int seconds); QueryResult selectByPrimaryKey(String[] fields, Object obj, int seconds); QueryResult selectByPrimaryKey(Class<?> clazz, Object id); QueryResult selectByPrimaryKey(Class<?> clazz, Object id, int seconds); QueryResult selectByPrimaryKey(List<String> fields, Class<?> clazz, Object id); QueryResult selectByPrimaryKey(List<String> fields, Class<?> clazz, Object id, int seconds);
-
插入
Object帶主鍵對象實體
int insert(Object obj);
-
更新
Object帶主鍵對象實體,queryCriteria查詢條件
int updateByCriteria(Object obj, QueryCriteria queryCriteria); int updateByPrimaryKey(Object obj);
-
刪除
Object帶主鍵對象實體,queryCriteria查詢條件,clazz對象實例類型,id對象主鍵
int deleteByPrimaryKey(Object obj); int deleteByPrimaryKey(Class<?> clazz, Object id); int deleteByCriteria(QueryCriteria queryCriteria);
-
其他操作
database數據名稱,tableName表名稱
void reloadTable(String tableName); void clearCache(String tableName); void reloadTable(String database, String tableName); void clearCache(String database, String tableName);
2 使用示例
-
數據庫user表字段
CREATE TABLE `user` (
id
int(11) NOT NULL AUTO_INCREMENT,name
varchar(20) DEFAULT NULL COMMENT '用戶名',pwd
varchar(50) DEFAULT NULL '密碼'email
varchar(30) DEFAULT NULL '郵箱',status
int(11) DEFAULT '0' COMMENT '1正常0禁用',age
int(11) DEFAULT NULL '年齡', PRIMARY KEY (id
), UNIQUE KEYunique_user_userName
(userName
) ) ENGINE=MyISAM AUTO_INCREMENT=167 DEFAULT CHARSET=utf8; -
dto對象User.class
import java.io.Serializable; public class User implements Serializable { /** * */ private static final long serialVersionUID = 4799201163494761002L; public static final String ID = "id"; public static final String NAME = "name"; public static final String PWD = "pwd"; public static final String EMAIL = "email"; public static final String STATUS = "status"; public static final String AGE = "age"; private int id; private String name; private String pwd; private String email; private int status; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }
}
-
列表查詢
-
示例1
QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); Criteria critera = queryCriteria.createCriteria(); critera.andColumnGreaterThan(User.AGE, 18); critera.andColumnEqualTo(User.STATUS, 1); //查詢所有字段并緩存 QueryResult result = baseDAL.selectByCriteria(queryCriteria); //查詢部分字段不緩存 QueryResult result = baseDAL.selectByCriteria(new String[]{"name","pwd"},queryCriteria, BaseDal.NO_CACHE); List<User> users = result.asList(User.class);
-
示例2
QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); queryCriteria.setPageIndex(1); queryCriteria.setPageSize(20); queryCriteria.setOrderByClause(User.AGE+" desc"); //分頁查詢 QueryResult result = baseDAL.selectPageByCriteria(queryCriteria); List<Map<String, Object>> list = result.getList(); Map<String, Object> page = result.getPage();
-
-
主鍵查詢
-
示例1
User user = new User(); user.setId(1); //緩存20秒 QueryResult result = baseDAL.selectByPrimaryKey(user, 20); user = result.as(User.class);
-
示例2
Model model = new Model(User.class); model.setSinglePrimaryKey(1); //顯示部分字段 QueryResult result = baseDAL.selectByPrimaryKey(new String[]{"user","pwd"}, model); Map<String, Object> result = result.get();
-
示例3 //不使用緩存 QueryResult result = baseDAL.selectByPrimaryKey(User.class, 1,BaseDal.NO_CAHCE);
-
-
插入
-
示例1
User user = new User(); user.setName("fastser"); user.setPwd("faster"); int result = baseDAL.insert(user);
-
-
更新
-
示例1
User user = new User(); user.setName("fastser-dal-mybatis"); QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); Criteria critera = queryCriteria.createCriteria(); critera.andColumnEqualTo(User.NAME, "fastser"); int result = baseDAL.updateByCriteria(user, queryCriteria);
-
示例2
User user = new User(); user.setEmail("ywj_316@qq.com"); user.setId(1); int result = baseDAL.updateByPrimaryKey(user);
-
-
刪除
-
示例1
Model model = new Model(User.class); model.setSinglePrimaryKey(1); int result = baseDAL.deleteByPrimaryKey(model);
-
示例2
User user = new User(); user.setId(1); int result = baseDAL.deleteByPrimaryKey(user);
-
示例3
int result = baseDAL.deleteByPrimaryKey(User.class, 165);
-
示例4
QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); Criteria critera = queryCriteria.createCriteria(); critera.andColumnEqualTo(User.NAME, "fastser"); int result = baseDAL.deleteByCriteria(queryCriteria);
-
-
其他操作
-
示例1
QueryCriteria queryCriteria = new QueryCriteria(); queryCriteria.setTable(User.class); Criteria critera = queryCriteria.createCriteria(); critera.andColumnGreaterThan(User.AGE, 18); critera.andColumnEqualTo(User.STATUS, 1); //數量統計 int result = baseDAL.countByCriteria(queryCriteria);
-