博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于一些分页的封装和一些DAO的封装
阅读量:6998 次
发布时间:2019-06-27

本文共 32440 字,大约阅读时间需要 108 分钟。

/**	 * 查询物流市列表	 * http://localhost:8080/mall/mallLogisticsCity/getLogisticsCityList.json	 * @param productName	 * @return	 */	@RequestMapping("/getLogisticsCityList.json")	public Object getLogisticsCityList(@RequestParam(value="cityCode",required=false)String cityCode,			@RequestParam(value="provinceId",required=false)String provinceId,Model model) {		log.info("LogisticsCityController.getLogisticsCityList()");		try {			Map
cxtj = new HashMap
(); cxtj.put("cityCode", cityCode); cxtj.put("provinceId", provinceId); PagedListData pm = new PagedListData((PageList) logisticsCityService, cxtj); PageUtil page = new PageUtil(); page.setPageNow(pm.getTotalPage()); page.setDatas((List
) pm.getData()); page.setPageCount(pm.getTotalRecords() / pm.getPageSize()); page.setPageRowCount(pm.getTotalRecords()); page.setPageSize(pm.getPageSize()); model.addAttribute("cxtj", cxtj); model.addAttribute("page", page); } catch (Exception e) { e.printStackTrace(); log.error("getLogisticsCityList error:" + e.getLocalizedMessage()); return "/operate/config/logistics_template"; } return "/operate/config/logistics_template"; }

  以上是一个非常简单的Controller,我这里就简单粗暴一点,直接上代码,先把思路搞清楚,然后在想如何写代码!

PagedListData pm = new PagedListData((PageList) logisticsCityService, cxtj); 这句话肯定是调用了PageListData的构造函数,这里是将你需传值进去的参数封装成map集合,另一个就是接口,被强转为PageList类型  好了,我们看看PageListData是如何写的
package com.maidan.util;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Collection;import java.util.Map;import javax.servlet.http.HttpServletRequest;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.springframework.aop.support.AopUtils;import org.springframework.context.NoSuchMessageException;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import com.maidan.util.Constants;import com.maidan.util.StringUtil;public class PagedListData extends JsonReturn{    private static Log log = LogFactory.getLog(PagedListData.class);    private Integer totalRecords;//总记录数    private Integer totalPage;//当前页    private Integer pageSize;//页大小    private Map
cxtj;//查询条件 protected PageList pagelist;//结果集 //protected Map
orderMap = new LinkedHashMap
(); // //排序字段 private Collection data; private String forMethod = ""; private boolean inited = false; protected boolean hasNext = false; /** * 获取HttpServletRequest对象 * * @return HttpServletRequest */ protected HttpServletRequest getRequest(){ return ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 从request获取name对应的值 * * @param name * @return * @see */ public String getParameter(String name){ return StringUtil.trim(getRequest().getParameter(name)); } /** * 为了可以使一个Manager可以进行多个分页添加此方法将count和doPage转换为count*,do**.Page *
例如forMethod等于test将调用countTest,doTestPage * @param forMethod * @return */ public PagedListData forMethod(String forMethod){ this.forMethod = StringUtil.toUpperCaseAny(forMethod);; return this; } /** * 构造一个PagedListDataModel对象 * @param request * @param pagelist * @param cxtj */ public PagedListData(PageList pagelist,Map
cxtj) { this.cxtj = cxtj; this.pagelist = pagelist; init(); } public PagedListData(PageList pagelist,Integer currentPage,Integer pageSize,Map
cxtj) { this.cxtj =cxtj; this.pagelist = pagelist; this.pageSize = pageSize; this.totalPage =currentPage; //原有类当前页写成了总页 } //初始化分页配置 private void init(){ try{ String rows=this.getParameter("rows"); this.pageSize =(rows!=null ? Integer.valueOf(rows) : 10); }catch(Exception e){ //log.warn("在request中获取页大小出错将使用默认页大小"+Constants.DEFAULT_PAGESIZE, e); this.pageSize = 10; } if(this.pageSize==null){ //log.warn("页大小小于1将使用默认页大小"+Constants.DEFAULT_PAGESIZE); this.pageSize=10; } try{ String currentPage= this.getParameter("page"); this.totalPage = (currentPage!=null ? Integer.parseInt(currentPage):1); }catch(Exception e){ //log.warn("在request中获取当前页出错将使用默认使用第一页", e); this.totalPage =1; } if(this.totalPage==null){ //log.warn("当前页小于1将使用默认页大小"); this.totalPage=1; } } /** * 获取分页的数据 * @return */ public Collection getData() { if(!inited){ initData(); inited=true; } return data; } /** * 加载数据 */ private void initData(){ this.data = this.getDatas(); this.totalRecords =Integer.parseInt(this.getCount().toString()); if((this.getCount()/this.pageSize)>totalPage){ hasNext = true; } } /** * 执行forMethod对应的方法 * @param method * @param param * @return */ private Object invoke(Method method,Object []param){ try { if(AopUtils.isJdkDynamicProxy(this.pagelist)){ return Proxy.getInvocationHandler(this.pagelist).invoke(this.pagelist, method, param); } return AopUtils.invokeJoinpointUsingReflection(this.pagelist, method, param); }catch (Throwable e) { e.printStackTrace(); return null; } } /** * 返回总记录数 * @return */ public Integer getTotalRecords() { if(!inited){ initData(); inited=true; } return totalRecords; } /** * 获取分页的数据 * @return */ private Collection getDatas() { if(this.pagelist!=null){ Method dompage = null; if(StringUtil.isEmpty(this.forMethod)){ return this.pagelist.doPage(this.totalPage,this.pageSize, cxtj,null,null); }else{ Class temp = AopUtils.getTargetClass(this.pagelist); String m = null; m = "do"+this.forMethod+"Page"; while(temp!=null){ try { dompage = temp.getDeclaredMethod(m, int.class,int.class,Map.class,String.class); break; } catch (NoSuchMethodException e) { temp = temp.getSuperclass(); e.printStackTrace(); } } if(temp==null){ throw new NoSuchMessageException(m+"(int start,int pagesize,Map
cxtj) 没有该方法"); } return (Collection) this.invoke(dompage,new Object[]{ this.totalPage,pageSize,cxtj}); } } return null; } /** * 统计总记录数 * @return */ private Long getCount(){ if(this.pagelist!=null){ String m = null; if(StringUtil.isEmpty(this.forMethod)){ return this.pagelist.count(cxtj); }else{ Method count = null; Class temp = AopUtils.getTargetClass(this.pagelist); m = "count"+this.forMethod; while(temp!=null){ try { count = temp.getDeclaredMethod(m,Map.class); break; } catch (NoSuchMethodException e) { temp = temp.getSuperclass(); e.printStackTrace(); } } if(temp==null){ throw new NoSuchMessageException(m+"(int start,int pagesize,Map
cxtj) 没有该方法"); } return (Long) this.invoke(count,new Object[]{cxtj}); } } return Constants.LONG_ZERO; } /** * 返回当前页 * @return */ public Integer getTotalPage() { return totalPage; } /** * 设置当前页在获取总记录数或分页数据前有效 * @param page */ public void setTotalPage(Integer totalPage) { this.totalPage = totalPage; } /** * 获取页大小 * @return */ public Integer getPageSize() { return pageSize; } /** * 设置页大小在获取总记录数或分页数据前有效 * @param pageSize */ public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public boolean isHasNext() { return hasNext; } public void setHasNext(boolean hasNext) { this.hasNext = hasNext; } /* public Map
getOrderMap() { return orderMap; } *//** * 排序 * @param order 排序条件,map的key为实体的属性名,value可选asc或desc *//* public void setOrderMap(final Map
orderMap) { this.orderMap = orderMap; }*/ }

这里我就简单的讲解一下

通过这里我们能清晰的看到 这个类的一些属性

有总记录数   当前页   总页数  查询条件  以及结果集

 

 

这里就是刚刚调用的构造函数

 

这里this,pagelist = pagelist    就是将某个service接口传值进去赋值给pagelist,有什么用呢,我们可以继续往下看

 

他会执行init();方法

进入这个方法,他会通过request域中获取前台穿过来的总行数量,如果值为null那么pageSize默认的设置为10

然后去request域中获取当前的页数,如果是null那么currentPage就是1  他这里变量名称取得不是很对,心里明白就好

 

到这里 PagedListData 中 我们设置了当前页 currentPage  和 每页多少条数  pagesize

 

然后我们看controller  

setPageNow(pm.getTotal);

然后他这里通过pm.getData()这个方法就获取当前所需要的list集合,很厉害,我们看看他是如何完成的

这里然后进入initData()方法

他这里加载数据中干了两件事情

this.getDatas()  和  this.getCount()  

这两个方法是分别获取当前页的List集合  和  总数量

 

我们一个一个看,首先我们看this.getDatas();

这里是通过调用this.pagelist.doPage(........)

 

通过 this.pagelist.count(cxtj);

 

以上这里个方法我圈起来的地方,其他的是通过反射,说实话我是没有看懂,只知道这里是反射通过spring中的AOP工具类反射获取该类class

然后通过class.getDeclaredMethod获取该类的方法 然后 invoke去执行

我问过工资是我两倍的这个,他是这么说的

好吧 说的我无言以对,意思就是就你这技术看这个说明你想多了,我们就把能搞懂的先弄懂吧

 

既然两个方法都是pagelist这里接口调用的方法  我们在去看看Pagelist中写了什么

public interface PageList{    /**     * 根据查询条件查询统计符合条件的数据的总数     *      * @param cxtj 查询条件     * @return 返回统计总数     */    Long count(Map
cxtj); /** * 分页查询 * * @param start 开始记录数 * @param pagesize 分页大小 * @param cxtj 查询条件 * @return 返回符合条件的数据从start开始最多pagesize条数据 */ List
doPage(int start,int pagesize,Map
cxtj,String sort, String dir);

这里分装了就是刚刚所需要查的两个方法

 

刚刚我们将某个接口赋值给pagelist,而这个pagelist中只有连个方法,他的实现类在哪里呢?

下面我们来看

这里logisticsCityService接口里面干了什么 ,大家都知道web传统的MVC模式流程   首先是经过controller 层 然后是service层 最后是和数据库打交道的dao层

这个接口继承了一个公共接口

这个公共接口又继承了父类的接口,

这个父类接口阐明了许多CRUD方法  

package com.maidan.mall.base.service.interfaces;import java.io.Serializable;import java.util.List;import java.util.Map;/** * @param 
实体的类型 * @param
实体主键类型 */public interface BaseManager
{ /** * 保存(持久化)对象 * 默认的sqlId=insert * @param o 要持久化的对象 * @return 执行成功的记录个数 */ void save(T ob); /** * 保存(持久化)对象 * 默认的sqlId=insertSelective * @param o 要持久化的对象 * @return 执行成功的记录个数 */ void saveSelective(T ob); /** * 更新(持久化)对象 * 默认的sqlId=updateByPrimaryKey * @param o 要持久化的对象 * @return 执行成功的记录个数 */ Integer update(T ob); /** * 更新(持久化)对象 * 默认的sqlId=updateByPrimaryKey * @param o 要持久化的对象 * @return 执行成功的记录个数 */ Integer updateBlob(T ob); /** * 更新(持久化)对象 * 默认的sqlId=updateByPrimaryKeySelective * @param o 要持久化的对象 * @return 执行成功的记录个数 */ Integer updateSelective(T ob); /** * 获取指定的唯一标识符对应的持久化对象 * 默认的sqlId=selectByPrimaryKey * @param id 指定的唯一标识符 * @return 指定的唯一标识符对应的持久化对象,如果没有对应的持久化对象,则返回null。 */ T getById(Long id); /** * 删除指定的唯一标识符对应的持久化对象 * 默认的sqlId=deleteByPrimaryKey * @param id 指定的唯一标识符 * @return 删除的对象数量 */ Integer deleteById(PK id); /** * 删除指定的唯一标识符数组对应的持久化对象 * 默认的sqlId=deleteByIds * @param ids 指定的唯一标识符数组 * @return 删除的对象数量 */ Integer deleteByIds(String ids); /** * 分页查询 * 默认的sqlId=findPageBy * @param param 查询参数 * @param pageNo 要查询的页号 * @param pageSize 每页数据个数 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查询结果分页数据 */ List
findPageBy( T param, int pageNo, int pageSize, String sort, String dir); /** * 分页查询 * * @param param 查询参数 * @param sqlId sql ID * @param pageNo 要查询的页号 * @param pageSize 每页数据个数 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查询结果分页数据 */ List
findPageBy( T param, String sqlId,int pageNo, int pageSize, String sort, String dir); /** * 获取满足查询参数条件的数据总数 * 默认的sqlId=getCountBy * @param param 查询参数 * @return 数据总数 */ Long getCountBy(T param); Long getCountBy(Map
param); /** * 不分页查询 * 默认的sqlId=findListBy * @param param 查询参数 * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查询结果列表 */ List
findListBy(T param, String sort, String dir); List
findListBy(Map
param, String sort, String dir); /** * 不分页查询 * * @param param 查询参数 * @param sqlId sql ID * @param sort 排序字段名 * @param dir 排序方式(升序(asc)或降序(desc) * @return 查询结果列表 */ List
findListBy(T param,String sqlId, String sort, String dir); List
findListBy(Map
param,String sqlId, String sort, String dir); List
queryByIds(String ids); //查询表中主键的最大值 Integer queryMaxId(String sqlId); }

 

父类接口有自己的实现类 

package com.maidan.mall.base.service.implement;import java.io.Serializable;import java.util.List;import java.util.Map;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import com.maidan.mall.base.persistence.dao.interfaces.IBaseDao;import com.maidan.mall.base.service.interfaces.BaseManager;public class BaseManagerImpl
implements BaseManager
{ protected final Log log = LogFactory.getLog(getClass()); protected IBaseDao
dao; public BaseManagerImpl(IBaseDao
genericDao) { this.dao = genericDao; } public BaseManagerImpl() { } @Override public void save(T ob) { dao.save(ob); } @Override public void saveSelective(T ob) { dao.saveSelective(ob); } @Override public Integer update(T ob) { return dao.update(ob); } @Override public Integer updateBlob(T ob) { return dao.updateBlob(ob); } @Override public Integer updateSelective(T ob) { return dao.updateSelective(ob); } @Override public T getById(Long id) { return dao.getById(id); } @Override public Integer deleteById(PK id) { return dao.deleteById(id); } @Override public Integer deleteByIds(String ids) { return dao.deleteByIds(ids); } @Override public List
findPageBy(T param, int pageNo, int pageSize, String sort, String dir) { return dao.findPageBy(param, pageNo, pageSize, sort, dir); } @Override public List
findPageBy(T param, String sqlId, int pageNo, int pageSize, String sort, String dir) { return dao.findPageBy(param, sqlId, pageNo, pageSize, sort, dir); } @Override public Long getCountBy(T param) { return dao.getCountBy(param); } @Override public Long getCountBy(Map
param) { return dao.getCountBy(param); } @Override public List
findListBy(T param, String sort, String dir) { return dao.findListBy(param, sort, dir); } public List
findListBy(Map
param, String sort, String dir) { return dao.findListBy(param, sort, dir); } @Override public List
findListBy(T param, String sqlId, String sort, String dir) { return dao.findListBy(param, sqlId, sort, dir); } @Override public List
findListBy(Map
param, String sqlId, String sort, String dir) { return dao.findListBy(param, sqlId, sort, dir); } @Override public List
queryByIds(String ids) { // TODO Auto-generated method stub return dao.queryByIds(ids); } @Override public Integer queryMaxId(String sqlId) { // TODO Auto-generated method stub return dao.queryMaxId(sqlId); }}

 

他这里的实现类是通过

IBaseDao与数据库交互的 首先看他这里构造函数,意思就是将传进来某个Dao赋值给这个IBaseDao<T,PK>dao,当然了 你传进来的这个dao也必须继承这个IBaseDao

 

我们先来看看IBaseDao的实现类

package com.maidan.mall.base.persistence.dao.implementes;import java.io.Serializable;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.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.support.SqlSessionDaoSupport;import org.springframework.beans.factory.annotation.Autowired;import com.maidan.mall.base.constants.Constants;import com.maidan.mall.base.exception.SystemException;import com.maidan.mall.base.persistence.dao.interfaces.IBaseDao;import com.maidan.util.BeanMapUtil;import com.maidan.util.ReflectGeneric;import com.maidan.util.StringUtil;public class BaseDaoImpl
extends SqlSessionDaoSupport implements IBaseDao
{ @Autowired public void setSqlSessionFactory(SqlSessionFactory mall_SqlSessionFactory) { super.setSqlSessionFactory(mall_SqlSessionFactory); } public static final String SQLNAME_SEPARATOR = "."; //默认的sql id public static final String SQL_SAVE = "insert"; public static final String SQL_SAVE_SELECTIVE = "insertSelective"; public static final String SQL_UPDATE = "updateByPrimaryKey"; public static final String SQL_UPDATE_BLOBS = "updateByPrimaryKeyWithBLOBs"; public static final String SQL_UPDATE_SELECTIVE = "updateByPrimaryKeySelective"; public static final String SQL_GETBYID = "selectByPrimaryKey"; public static final String SQL_DELETEBYID = "deleteByPrimaryKey"; public static final String SQL_DELETEBYIDS = "deleteByIds"; public static final String SQL_FINDPAGEBY = "findPageBy"; public static final String SQL_FINDPAGEBYCOUNT = "findPageByCount"; public static final String SQL_FINDLISTBY = "findListBy"; public static final String SQL_GETCOUNTBY = "getCountBy"; public static final String SQL_GETlISTByIDS = "getListByIds"; //排序 字段 private static final String SORT_NAME = "sorts"; //排序字段 asc desc private static final String DIR_NAME = "dir"; /** 不能用于SQL中的非法字符(主要用于排序字段名) */ public static final String[] ILLEGAL_CHARS_FOR_SQL = {
",", ";", " ", "\"", "%"}; /** * SqlMapping命名空间 */ private String sqlNamespace = getDefaultSqlNamespace(); /** * 获取默认SqlMapping命名空间。 * 使用泛型参数中业务实体类型的类名作为默认的命名空间。 * 如果实际应用中需要特殊的命名空间,可由子类重写该方法实现自己的命名空间规则。 * com.wetools.emalls.model.ShoppingCart===>>ShoppingCart * @return 返回命名空间字符串 */ @SuppressWarnings("unchecked") protected String getDefaultSqlNamespace() { Class
clazz = ReflectGeneric.getClassGenricType(this.getClass()); String nameSpace =clazz.getName().substring(clazz.getName().lastIndexOf(".")+1) ; return nameSpace; } /** * 将SqlMapping命名空间与给定的SqlMapping名组合在一起。 * @param sqlName SqlMapping名 * @return 组合了SqlMapping命名空间后的完整SqlMapping名 */ protected String getSqlName(String sqlName) { return sqlNamespace + SQLNAME_SEPARATOR + sqlName; } /** * 获取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) { } @Override public void save(T ob) { generateId(ob); this.getSqlSession().insert( getSqlName(SQL_SAVE), ob); } @Override public void saveSelective(T ob) { generateId(ob); this.getSqlSession().insert( getSqlName(SQL_SAVE_SELECTIVE), ob); } @Override public Integer update(T ob) { return this.getSqlSession().update( getSqlName(SQL_UPDATE), ob); } @Override public Integer updateSelective(T ob) { return this.getSqlSession().update( getSqlName(SQL_UPDATE_SELECTIVE), ob); } @SuppressWarnings("unchecked") @Override public T getById(Long id) { return (T) this.getSqlSession().selectOne( getSqlName(SQL_GETBYID), id); } @Override public Integer deleteById(ID id) { return this.getSqlSession().delete( getSqlName(SQL_DELETEBYID), id); } @Override public Integer deleteByIds(String ids) { return this.getSqlSession().delete( getSqlName(SQL_DELETEBYIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR)); } @Override public List
findPageBy(T param, int pageNo, int pageSize, String sort, String dir) { return findPageBy(param, null ,pageNo, pageSize, sort, dir); } public List
findPageBy(Map
param, int pageNo, int pageSize, String sort, String dir) { return findPageBy(param, null ,pageNo, pageSize, sort, dir); } @SuppressWarnings("unchecked") @Override public List
findPageBy(T param, String sqlId, int pageNo, int pageSize, String sort, String dir) { Map
paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("获取参数失败", 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 = (pageNo -1)*pageSize; RowBounds rowBound = new RowBounds(pageNo, pageSize); List
lst = this.getSqlSession().selectList( getSqlName(sqlId == null ? SQL_FINDPAGEBY : sqlId), paramMap, rowBound); return lst; } @SuppressWarnings("unchecked") @Override public List
findPageBy(Map
param, String sqlId, int pageNo, int pageSize, String sort, String dir) { // 排序条件 if (sort != null) { // 排序字段不为空,过滤其中可能存在的非法字符 sort = filterIllegalChars(sort, ILLEGAL_CHARS_FOR_SQL); } if (StringUtil.isEmpty(sort) || StringUtil.isEmpty(dir)) { param.put(SORT_NAME, sort); param.put(DIR_NAME, dir); } // 分页条件 int start = (pageNo -1)*pageSize; RowBounds rowBound = new RowBounds(start, pageSize); List
lst = this.getSqlSession().selectList( getSqlName(sqlId == null ? SQL_FINDPAGEBY : sqlId), param, rowBound); return lst; } @SuppressWarnings("unchecked") @Override public Long getCountBy(T param) { Map
paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("获取参数失败", e); } return (Long)this.getSqlSession().selectOne( getSqlName(SQL_GETCOUNTBY), paramMap); } @Override public Long getCountBy(Map
param) { return (Long)this.getSqlSession().selectOne( getSqlName(SQL_GETCOUNTBY), param); } @Override public List
findListBy(T param, String sort, String dir) { return findListBy(param,null, sort, dir); } public List
findListBy(Map
param, String sort, String dir) { return findListBy(param,null, sort, dir); } @SuppressWarnings("unchecked") @Override public List
findListBy(T param,String sqlId, String sort, String dir) { Map
paramMap = null; try{ paramMap = BeanMapUtil.bean2Map(param); }catch(Exception e){ throw new SystemException("获取参数失败", e); } // 排序条件 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
lst = this.getSqlSession().selectList( getSqlName(sqlId==null ? SQL_FINDLISTBY : sqlId), paramMap); return lst; } public List
findListBy(Map
paramMap,String sqlId, String sort, String dir) { // 排序条件 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
lst = this.getSqlSession().selectList( getSqlName(sqlId==null ? SQL_FINDLISTBY : sqlId), paramMap); return lst; } /** * 从给定字符串中将指定的非法字符串数组中各字符串过滤掉。 * @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; } //=========================以下是对statement进行的简单封装供子类调用start================================================================== /** * 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object)}的代理。 * @param statement 映射的语句ID * @param parameter 参数 * @return 执行结果——插入成功的记录数 * @see org.apache.ibatis.session.SqlSession#insert(java.lang.String, java.lang.Object) */ public int insert(String statement, Object parameter) { return this.getSqlSession().insert( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#insert(java.lang.String)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @param statement 映射的语句ID * @param parameter 参数 * @return 查询结果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String, java.lang.Object) */ @SuppressWarnings("rawtypes") protected List selectList(String statement, Object parameter) { return this.getSqlSession().selectList( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectList(java.lang.String)}的代理。 * @param statement 映射的语句ID * @return 查询结果列表 * @see org.apache.ibatis.session.SqlSession#selectList(java.lang.String) */ @SuppressWarnings("rawtypes") protected List selectList(String statement) { return this.getSqlSession().selectList( getSqlName(statement)); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object)}的代理。 * @param statement 映射的语句ID * @param parameter 参数 * @return 查询结果对象 * @see org.apache.ibatis.session.SqlSession#selectOne(java.lang.String, java.lang.Object) */ public Object selectOne(String statement, Object parameter) { return this.getSqlSession().selectOne( getSqlName(statement), parameter); } /** * 对{@link org.apache.ibatis.session.SqlSession#selectOne(java.lang.String)}的代理。 * @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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @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) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @param statement 映射的语句ID * @param mapKey 数据mapKey * @return 查询结果Map * @see org.apache.ibatis.session.SqlSession#selectMap(java.lang.String, java.lang.String) */ @SuppressWarnings("rawtypes") 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)}的代理。 * @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)}的代理。 * @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)}的代理。 * @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); } @Override public Integer updateBlob(T ob) { // TODO Auto-generated method stub return this.getSqlSession().update( getSqlName(SQL_UPDATE_BLOBS), ob); } @Override public List
queryByIds(String ids) { /* return this.getSqlSession().delete( getSqlName(SQL_DELETEBYIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR));*/ return this.getSqlSession().selectList(getSqlName(SQL_GETlISTByIDS), StringUtil.splitLongArray(ids, Constants.COMMA_SEPARATOR)); } @Override public Integer queryMaxId(String sqlId) { // TODO Auto-generated method stub return this.getSqlSession().selectOne(getSqlName(sqlId)); }}

 

 

然后在看看LogisticsCityService的实现类 

 

 

注意 他将自己的dao传入到父类的构造函数中

在将这个参数传递到父类构造函数中

 

 

然后自己的DAO去继承IBaseDao   这样大家就可以公用所有的方法

 

IBaseDao通过反射获取该类的类名

也就是说他们在这里封装的namespace就是自己的类名

 

 

 

 

 大家也可以百度查询关键词  “mybatis通用DAO”

转载于:https://www.cnblogs.com/ltplol/p/5946928.html

你可能感兴趣的文章