原文地址:http://zhaoshijie.iteye.com/blog/2003209

关键字:Mybatis通用DAO设计封装(mybatis)





说明:

mybatis默认分页机制为逻辑分页,所以要处理成物理分页需要自己写一个拦截器(当然也可以不用这个分页机制,自己直接在SQL文件中实现也是可以的)

RowBounds rowBound = new RowBounds(start, pageSize);

具体封装如下:



package util.dao.impl;



import java.io.Serializable;

import java.util.HashMap;

import java.util.List;

import java.util.Map;



import org.apache.commons.lang.StringUtils;

import org.apache.ibatis.session.ResultHandler;

import org.apache.ibatis.session.RowBounds;

import org.mybatis.spring.support.SqlSessionDaoSupport;



import util.bean.BeanMapUtil;

import util.dao.IBaseGenericDAO;

import util.exception.BaseDaoException;

import util.page.GenericDefaultPage;

import util.page.IGenericPage;

import util.reflect.ReflectGeneric;

/**

* 基于Mybatis的基础泛型DAO实现类。

*

* @author 赵士杰

*

* @param <T> 业务实体类型

* @param <ID> ID类型 ,如:String、Long、Integer 等

*/

public abstract class MybatisBaseGenericDAOImpl<T, ID extends Serializable>

extends SqlSessionDaoSupport

implements IBaseGenericDAO<T, ID> {



public static final String SQLNAME_SEPARATOR = ".";



public static final String SQL_SAVE = "save";  

public static final String SQL_UPDATE = "update";  

public static final String SQL_GETBYID = "getById";

public static final String SQL_DELETEBYID = "deleteById";

public static final String SQL_DELETEBYIDS = "deleteByIds";

public static final String SQL_FINDPAGEBY = "findPageBy";  

public static final String SQL_FINDLISTBY = "findListBy";

public static final String SQL_GETCOUNTBY = "getCountBy";



private static final String SORT_NAME = "SORT";



private static final String DIR_NAME = "DIR";

/** 不能用于SQL中的非法字符(主要用于排序字段名) */

public static final String[] ILLEGAL_CHARS_FOR_SQL = {",", ";", " ", """, "%"};



/**

* 获取默认SqlMapping命名空间。

* 使用泛型参数中业务实体类型的全限定名作为默认的命名空间。

* 如果实际应用中需要特殊的命名空间,可由子类重写该方法实现自己的命名空间规则。

* @return 返回命名空间字符串

*/

@SuppressWarnings("unchecked")

protected String getDefaultSqlNamespace() {

Class<T> clazz = ReflectGeneric.getClassGenricType(this.getClass());

String nameSpace = clazz.getName();

return nameSpace;

}



/**

* 将SqlMapping命名空间与给定的SqlMapping名组合在一起。

* @param sqlName SqlMapping名

* @return 组合了SqlMapping命名空间后的完整SqlMapping名

*/

protected String getSqlName(String sqlName) {

return sqlNamespace + SQLNAME_SEPARATOR + sqlName;

}



/**

* SqlMapping命名空间

*/

private String sqlNamespace = getDefaultSqlNamespace();



/**

* 获取SqlMapping命名空间

* @return SqlMapping命名空间

*/

public String getSqlNamespace() {

return sqlNamespace;

}



/**

* 设置SqlMapping命名空间。

* 此方法只用于注入SqlMapping命名空间,以改变默认的SqlMapping命名空间,

* 不能滥用此方法随意改变SqlMapping命名空间。

* @param sqlNamespace SqlMapping命名空间

*/

public void setSqlNamespace(String sqlNamespace) {

this.sqlNamespace = sqlNamespace;

}



/**

* 生成主键值。

* 默认情况下什么也不做;

* 如果需要生成主键,需要由子类重写此方法根据需要的方式生成主键值。

* @param ob 要持久化的对象

/

protected void generateId(T ob) {



}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#save(java.lang.Object)

/

public Integer save(T ob) {

generateId(ob);

return this.getSqlSession().insert(

getSqlName(SQL_SAVE), ob);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#update(java.lang.Object)

/

public Integer update(T ob) {

return this.getSqlSession().update(

getSqlName(SQL_UPDATE), ob);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getById(java.lang.String)

/

@SuppressWarnings("unchecked")

public T getById(String id) {

return (T) this.getSqlSession().selectOne(

getSqlName(SQL_GETBYID), id);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteByIds(ID[])

/

public Integer deleteByIds(ID[] ids) {

return this.getSqlSession().delete(

getSqlName(SQL_DELETEBYIDS), ids);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#deleteById(java.io.Serializable)

/

public Integer deleteById(ID id){

return this.getSqlSession().delete(

getSqlName(SQL_DELETEBYID), id);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findPageBy(java.lang.Object, int, int, java.lang.String, java.lang.String)

/

@SuppressWarnings("unchecked")

public IGenericPage<T> findPageBy(

T param, int pageNo, int pageSize, String sort, String dir) {



// 获取满足条件的记录总数,没有记录时返回空页数据

int count = getCountBy(param);

if (count < 1) {

return GenericDefaultPage.emptyPage();

}



Map<String, Object> paramMap = null;

try{

paramMap = BeanMapUtil.bean2Map(param);

}catch(Exception e){

throw new BaseDaoException("获取参数失败", e);

}

// Where过滤条件

// paramMap.put("param", param);

// 排序条件

if (sort != null) {

// 排序字段不为空,过滤其中可能存在的非法字符

sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL);

}

if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) {

// paramMap.put("sort", null);

// paramMap.put("dir", null);

} else {

paramMap.put(SORT_NAME, sort);

paramMap.put(DIR_NAME, dir);

}

// 分页条件

int start = GenericDefaultPage.getStartOfPage(

pageNo, pageSize) - 1;

RowBounds rowBound = new RowBounds(start, pageSize);



List<T> lst = this.getSqlSession().selectList(

getSqlName(SQL_FINDPAGEBY),

paramMap, rowBound);



return new GenericDefaultPage<T>(pageNo, pageSize, lst, count);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#getCountBy(java.lang.Object)

/

public Integer getCountBy(T param) {

Map<String, Object> paramMap = null;

try{

paramMap = BeanMapUtil.bean2Map(param);

}catch(Exception e){

throw new BaseDaoException("获取参数失败", e);

}

// paramMap.put("param", param);

return (Integer)this.getSqlSession().selectOne(

getSqlName(SQL_GETCOUNTBY), paramMap);

}



/
(non-Javadoc)

* @see com.harmony.framework.dao.mybatis.IBaseGenericDAO#findListBy(java.lang.Object, java.lang.String, java.lang.String)

*/

@SuppressWarnings("unchecked")

public List<T> findListBy(T param, String sort, String dir) {

Map<String, Object> paramMap = null;

try{

paramMap = BeanMapUtil.bean2Map(param);

}catch(Exception e){

throw new BaseDaoException("获取参数失败", e);

}

// Where过滤条件

// paramMap.put("param", param);

// 排序条件

if (sort != null) {

// 排序字段不为空,过滤其中可能存在的非法字符

sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL);

}

if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir)) {

// paramMap.put("sort", null);

// paramMap.put("dir", null);

} else {

paramMap.put(SORT_NAME, sort);

paramMap.put(DIR_NAME, dir);

}

List<T> lst = this.getSqlSession().selectList(

getSqlName(SQL_FINDLISTBY), paramMap);

return lst;

}



public List<T> findListBy(T param){

return findListBy(param, null, null);

}

/**

* 从给定字符串中将指定的非法字符串数组中各字符串过滤掉。

* @param str 待过滤的字符串

* @param filterChars 指定的非法字符串数组

* @return 过滤后的字符串

*/

protected String filterIllegalChars(String str, String[] filterChars) {

String rs = str;

if (rs != null && filterChars != null) {

for (String fc : filterChars) {

if (fc != null && fc.length() > 0) {

str = str.replaceAll(fc, "");

}

}

}

return rs;

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 执行结果——插入成功的记录数

* @see org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)

*/

protected int insert(String statement, Object parameter) {

return this.getSqlSession().insert(

getSqlName(statement), parameter);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @return 执行结果——插入成功的记录数

* @see org.apache.ibatis.session.SqlSession#insert(java.lang.String)

*/

protected int insert(String statement) {

return this.getSqlSession().insert(

getSqlName(statement));

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 执行结果——更新成功的记录数

* @see org.apache.ibatis.session.SqlSession#update(java.lang.String, java.lang.Object)

*/

protected int update(String statement, Object parameter) {

return this.getSqlSession().update(

getSqlName(statement), parameter);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#update(java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 执行结果——更新成功的记录数

* @see org.apache.ibatis.session.SqlSession#update(java.lang.String)

*/

protected int update(String statement) {

return this.getSqlSession().update(

getSqlName(statement));

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 执行结果——删除成功的记录数

* @see org.apache.ibatis.session.SqlSession#delete(java.lang.String, java.lang.Object)

*/

protected int delete(String statement, Object parameter) {

return this.getSqlSession().delete(

getSqlName(statement), parameter);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#delete(java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @return 执行结果——删除成功的记录数

* @see org.apache.ibatis.session.SqlSession#delete(java.lang.String)

*/

protected int delete(String statement) {

return this.getSqlSession().delete(

getSqlName(statement));

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @param rowBounds 用于分页查询的记录范围

* @return 查询结果列表

* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds)

*/

protected List selectList(

String statement, Object parameter, RowBounds rowBounds) {

return this.getSqlSession().selectList(

getSqlName(statement), parameter, rowBounds);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 查询结果列表

* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object)

*/

protected List selectList(String statement, Object parameter) {

return this.getSqlSession().selectList(

getSqlName(statement), parameter);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @return 查询结果列表

* @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String)

*/

protected List selectList(String statement) {

return this.getSqlSession().selectList(

getSqlName(statement));

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @return 查询结果对象

* @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)

*/

protected Object selectOne(String statement, Object parameter) {

return this.getSqlSession().selectOne(

getSqlName(statement), parameter);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @return 查询结果对象

* @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)

*/

protected Object selectOne(String statement) {

return this.getSqlSession().selectOne(

getSqlName(statement));

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @param mapKey 数据mapKey

* @param rowBounds 用于分页查询的记录范围

* @return 查询结果Map

* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String, org.apache.ibatis.session.RowBounds)

*/

protected Map selectMap(

String statement, Object parameter, String mapKey,

RowBounds rowBounds) {

return this.getSqlSession().selectMap(

getSqlName(statement),

parameter, mapKey, rowBounds);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @param mapKey 数据mapKey

* @return 查询结果Map

* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.Object, java.lang.String)

*/

protected Map selectMap(

String statement, Object parameter, String mapKey) {

return this.getSqlSession().selectMap(

getSqlName(statement), parameter, mapKey);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param mapKey 数据mapKey

* @return 查询结果Map

* @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String)

*/

protected Map selectMap(String statement, String mapKey) {

return this.getSqlSession().selectMap(

getSqlName(statement), mapKey);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @param rowBounds 用于分页查询的记录范围

* @param handler 结果集处理器

* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.RowBounds, org.apache.ibatis.session.ResultHandler)

*/

protected void select(

String statement, Object parameter, RowBounds rowBounds,

ResultHandler handler) {

this.getSqlSession().select(

getSqlName(statement),

parameter, rowBounds, handler);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param parameter 参数

* @param handler 结果集处理器

* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, java.lang.Object, org.apache.ibatis.session.ResultHandler)

*/

protected void select(

String statement, Object parameter, ResultHandler handler) {

this.getSqlSession().select(

getSqlName(statement), parameter, handler);

}



/**

* 对{@link org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler)}的代理。

* 将statement包装了命名空间,方便DAO子类调用。

* @param statement 映射的语句ID

* @param handler 结果集处理器

* @see org.apache.ibatis.session.SqlSession#select(java.lang.String, org.apache.ibatis.session.ResultHandler)

/

protected void select(String statement, ResultHandler handler) {

this.getSqlSession().select(

getSqlName(statement), handler);

}



// protected Integer update(String sqlName, Object param){

// return this.getSqlSession().update(sqlNamespace+"."+sqlName, param);

// }

// protected Integer save(String sqlName, Object param){

// return this.getSqlSession().insert(sqlNamespace+"."+sqlName, param);

// }

// protected Integer delete(String sqlName, Object param){

// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);

// }

// protected Integer delete(String sqlName, Object[] param){

// return this.getSqlSession().delete(sqlNamespace+"."+sqlName, param);

// }

// protected List<Object> getMap(String sqlName, Object param){

// Map paramMap = new HashMap();

// paramMap.put("param", param);

// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap);

// }

// protected List<Object> getMap(String sqlName, Map param){

// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);

// }

// protected List findPageBy(String sqlName, Object param,int pageNo, int pageSize,String sort,String dir){

// Map paramMap = new HashMap();

// paramMap.put("param", param);

// if (StringUtils.isEmpty(sort) || StringUtils.isEmpty(dir))

// {

// paramMap.put("sort", null);

// paramMap.put("dir", null);

// }

// int start =0;

// if (pageNo > -1)

// start = (pageNo - 1)
pageSize;

// RowBounds rowBound = new RowBounds(start,pageSize);

// List lst = this.getSqlSession().selectList(sqlNamespace+"."+sqlName, paramMap,rowBound);

// return lst;

// }

//

// protected Integer getCountBy(String sqlName, Object param){

// Map paramMap = new HashMap();

// paramMap.put("param", param);

// return (Integer)this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, paramMap);

// }

// protected Object getBy(String sqlName, String id){

// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, id);

// }

// protected List getListBy(String sqlName,String id) {

// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, id);

// }

// protected List findListBy(String sqlName,Object[] params) {

// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, params);

// }

// protected Object getBy(String sqlName,Object param) {

// return this.getSqlSession().selectOne(sqlNamespace+"."+sqlName, param);

// }

// protected List findByParam(String sqlName,Object param) {

// return this.getSqlSession().selectList(sqlNamespace+"."+sqlName, param);

// }

}

基于mybatis的BaseDao及BaseService深度结合(转)的更多相关文章

  1. mybatis 3.x源码深度解析与最佳实践(最完整原创)

    mybatis 3.x源码深度解析与最佳实践 1 环境准备 1.1 mybatis介绍以及框架源码的学习目标 1.2 本系列源码解析的方式 1.3 环境搭建 1.4 从Hello World开始 2 ...

  2. 基于Mybatis的Dao层的开发

    基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...

  3. 分表需要解决的问题 & 基于MyBatis 的轻量分表落地方案

    分表:垂直拆分.水平拆分 垂直拆分:根据业务将一个表拆分为多个表. 如:将经常和不常访问的字段拆分至不同的表中.由于与业务关系密切,目前的分库分表产品均使用水平拆分方式. 水平拆分:根据分片算法将一个 ...

  4. 基于Mybatis分页插件PageHelper

    基于Mybatis分页插件PageHelper 1.分页插件使用 1.POM依赖 PageHelper的依赖如下.需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 ...

  5. 基于Mybatis的Dao层开发

    转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...

  6. 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)

    一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...

  7. 基于mybatis的CRUD

    u  基于Mybatis的CRUD u  掌握MyBatis的结果类型-resultMap和resultType u  掌握MyBatis的参数类型 u  掌握#和$两种语法 1      基于myb ...

  8. 基于MyBatis实现Dao理论

    基于MyBatis实现Dao理论 推荐使用xml提供sql 实现接口推荐使用Mapper自动实现DAO接口,让我们更关注sql书写本身

  9. 基于MyBatis实现Dao编程

    基于MyBatis实现Dao编程 1.建立mybatis-config.xml文件 <?xml version="1.0" encoding="UTF-8" ...

随机推荐

  1. Exception: Operation xx of contract xx specifies multiple request body parameters to be serialized without any wrapper elements.

    Operation 'CreateProductCodeStock' of contract 'IChileService' specifies multiple request body param ...

  2. WPF中Image控件的Source属性

    原文:WPF中Image控件的Source属性 imgBook 是一个Image控件,在后台代码中我想给它指定Source的属性.我先如下方式进行: Uri uri = new Uri(strImag ...

  3. 五十个UI设计资源网站

    五十个UI设计资源网站 用户体验团队网站 1.UCD大社区 http://ucdchina.com/ 2.腾讯WSD http://wsd.tencent.com/ 3.腾讯CDC http://cd ...

  4. Effective C++ Item 38 通过复合塑模出 has-a 或 is-implemented-in-terms-of

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:在应用域,复合意味着 has-a. 在实现域.复合意味着 is-implemented ...

  5. 第8章7节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-小结

    最后我们对MonkeyRunner启动的过程做一个总结,当然,当中也包括启动Monkey,尽管它不属于启动过程的一部分: monkeyrunner这个shell脚本会先设置一些执行环境的系统属性保存到 ...

  6. 65.Express---express-session

    转自:https://blog.csdn.net/zhangweiwtmdbf/article/details/50723816 第一部分 session概述 1.1 session 是什么? Ses ...

  7. #学习笔记#——JavaScript 数组部分编程(一)

    来自牛客网的js编程题 1.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 function remove(arr, item) { if(!Arra ...

  8. spark源码编译,本地调试

    1.下载源码 2.进入源码根据README.md编译源码,注意使用的是源码目录下的maven编译 3.用idea导入顶层pom文件 4.修改顶层pom文件和example下的pom文件,将scope的 ...

  9. 搭建Spark源码研读和代码调试的开发环境

    转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...

  10. DockerUI(图形化管理)

    由于运行Docker容器和管理它们可能会花费一点点努力和时间,因为基于web的应用程序-DockerUI应运而生,它可以让管理和运行容器变得很简单.DockerUI是一个开源的基于Docker API ...