基于mybatis、spring jdbc、hibernate的通用數據該問層:fastser-dal

jopen 9年前發布 | 36K 次閱讀 持久層框架 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 KEY unique_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);

    項目主頁:http://www.baiduhome.net/lib/view/home/1419560404859

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!