原文地址: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. 灵活的运用Model类

    1.定义接口 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespac ...

  2. Debian9.5 VNC Server远程桌面配置

    VNC概述 VNC (Virtual Network Console)是虚拟网络控制台的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 ...

  3. Linux下CD/DVD刻录软件

    1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...

  4. R与并行计算

    本文在Creative Commons许可证下发布 什么是并行计算? 并行计算,准确地说应该包括高性能计算机和并行软件两个方面.不过,近年来随着个人PC机,廉价机群,以及各种加速卡(NVIDIA GP ...

  5. WPF 支持的多线程 UI 并不是线程安全的

    原文:WPF 支持的多线程 UI 并不是线程安全的 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载.使用.重新发布,但务必保留文章署名吕毅(包含链 ...

  6. Windows系统的关机、休眠和睡眠状态究的区别

    原文:Windows系统的关机.休眠和睡眠状态究的区别 相信有些小伙伴跟我一样,对电脑的一些常用操作或名词不太熟悉,今天我们就简单来聊聊电脑的关机.休眠和睡眠状态究竟有何区别吧! 如果你在电脑左下角的 ...

  7. CCF模拟题 最优灌溉

    最优灌溉 时间限制: 1.0s 内存限制: 256.0MB   问题描述 雷雷承包了很多片麦田,为了灌溉这些麦田,雷雷在第一个麦田挖了一口很深的水井,所有的麦田都从这口井来引水灌溉. 为了灌溉,雷雷需 ...

  8. qqwry - 纯真ip库的golang服务

    qqwry 纯真 IP 库的一个服务.通过http提供一个ip地址归属地查询支持 软件介绍 我们大家做网站的时候,都会需要将用户的IP地址转换为归属地址功能,而之前的作法大都是从硬盘的数据文件中读取, ...

  9. struts.xml配置action没用,任意href自动跳到主页,在action中print没用?????

    今晚弄了好久都搞不清楚,晕死我了. 上网找也没找到解决办法. 然后看了Build Path.好吧,有几个没用的jar包,remove之.我去,马上正常了,具体原因未知. 总结:删除jar包不代表Bui ...

  10. udacity android 学习笔记: lesson 4 part a

    udacity android 学习笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...