Spring4.0.9+SpringMVC4.0.9+SpringSecurity3.2.5+MyBatis3.2.5+Activiti5.21即:SSM框架的企业级搭建——二

        在大家的期待中迎来的关于“Spring4.0.9+SpringMVC4.0.9+SpringSecurity3.2.5+MyBatis3.2.5+Activiti5.21即:SSM框架的企业级搭建”的第二篇博客,在这里博主本人要向各位说声抱歉。前一段时间由于项目工期的原因,本打算每周连载的SSM框架企业级搭建暂停了大约三个月的时间,同时视频相关教程也没有来得及录制。其实前一段时间录过一期视频,总体感觉效果不是太好,所以以后只更新博客暂时不出和本套博客相对应的视频了,望大家见谅。
        同时博主打算为大家建一个关于SSM系统集成的QQ群,原因是近些时间加我QQ的人开始陆续增多。这样不方便大家的技术交流。因为同是做技术的大家都比较渴望技术上的交流,所以博主近期开通一个QQ群,希望大家加入进去,咱们共同交流、学习、进步。由于博主本人技术有限,在技术上没有及时予以帮助的,还请见谅了。好了言归正传,下面开始第二篇的征程!

本期博客主要讲解内容
提示:博主打算先实现最核心基础的后端,然后在开始搭建前端。前端利用H+前端框架;

1、根据上一篇博客使之达到能运行的状态,如果没问题的话(数据库名称为ssm,sqlserver2008r2)
2、制定一些基本的命名规则
3、
(1)编写基础实体对象(model层)
(2)基础数据访问层接口(dao层)
(3)基础数据访问层实现类(dao层)
(4)基础业务接口(service层)
(6)上述全部建好后进行用例测试(增、删、改、查)(第三篇博客在进行测试)

2、制定一些基本的命名规则
        在开发的时候,我们需要对项目组的编码进行强制性的一致编码规则,也只有这样编写出来的代码才能被整个项目组的人读懂,使人开着舒心也能达到赏心悦目的感觉,并且从长远角度来讲这样还便于以后维护人员对项目的维护与修改。至于益处有好多,在这里就不一一列举了,相信大家都应该明白这里面的利弊。

一、java文件目录
com.xxx.ssm—项目包路径(公司域名+项目名称,我们这里项目名称为ssm)
(1)、action中的命名规范:
     1、action以下建包命名需要按照命名规范来执行
     2、action一下命名需按照模块名称-功能名称-具体action类来建立
        例如:DeptUserManageAction类(部门用户管理action)
          com.dykj.alespsystem.action.system.rabc
          公司域名.项目名称.action.系统设置.权限管理
          公司域名.项目名称.action.系统模块.功能模块
     3、以此来推来建立action包下的资源文件

(2)、anntion中的命名规范:具体命名规范参照项目MapperUrlAnnotion
(3)、constant中的命名规范:具体命名规范参照项目Constant
(4)、dao中的命名规范(同action)
(5)、interceptor中的命名规范(具体参考项目demo)
(6)、listener中的命名规范(具体参考项目demo)
(7)、model中的命名规范(同action)
(8)、security中的命名规范(暂时不写)
(9)、service中的命名规范(同action)
(10)、utils中的命名规范:
         1、以 xxxUitl规范为准,例如:ModelUtil

二、jsp文件目录
WEB-INFO
   View命名规范
     1、view下文件夹的建立需要同action层的
        @RequestMapping(value = “system/rabc/deptusermanage”)
        来建立文件层有几级建几级

三、注释
类注释(eclipse-Windows-java-CodeStyle-CodeTempdate-Code-NewJavaFile)
${package_declaration}
/**
 * @author 作者 :xxx
 * @version 创建时间:${date} ${time}
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:
 */
${type_declaration}
方法注释(eclipse-Windows-java-CodeStyle-CodeTemplate-Comments-Methods)
/**
 * @author xxx
 * ${tags} ${return_type}
 * @serialData ${date}${time}
 */

3、编写基础核心代码

(1)编写基础实体对象(model层)
        1>实现基础实体前,先要写一个自定义注解,“FieldInfo.java”文件,主要目的是构建前台字段使用(暂时先加着吧)

package com.dykj.smartplatform_v1.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/** 
 * @Title: FieldInfo.java
 * @Package com.dykj.smartplatform_v1.annotation
 * @Description: TODO(用一句话描述该文件做什么)
 * @author wangmingyuan
 * @createDate 2017年3月15日 下午3:46:34
 * @modifyUser 修改人 :
 * @modifyDate 修改时间 :
 * @version V.x
 */
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldInfo {

    /**
     * 
     * @Title: name 
     * @Description: 字段名称 
     * @createDate:2017年3月15日 下午3:47:52
     * @modifyUser 修改人 :
     * @modifyDate 修改时间 :
     * @version V.1
     * @param @return    设定文件 
     * @return String    返回类型 
     * @throws
     */
    public String name() default "";
    /**
     * 
     * @Title: type 
     * @Description: 字段类型
     * @createDate:2017年3月15日 下午3:48:11
     * @modifyUser 修改人 :
     * @modifyDate 修改时间 :
     * @version V.x
     * @param @return    设定文件 
     * @return String    返回类型 
     * @throws
     */
    public String type() default "";

}

        2>基础实体,BaseModel.java,其里面字段为每个实体对象必备的字段

package com.xxx.ssm.model;

import javax.persistence.MappedSuperclass;

import com.xxx.ssm.annotation.FieldInfo;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午9:45:35
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:基础实体类,所有实体对象全部继承于该类<br/>
 *               基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass<br>
 *               注解将实体类的多个属性分别封装到不同的非实体类中。<br>
 *               1.@MappedSuperclasz注解只能标准在类上<br>
 *               2.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,<br>
 *               但是他的属性都将映射到其子类的数据库字段中。<br>
 *               统一定义id 的entity的基类<br>
 *               基类统一定义id的属性名称、数据类型、列名映射及生成策略。<br>
 *               JPA基类的标识符<br>
 */
@MappedSuperclass
public class BaseModel {

    /**
     * 创建人ID
     */
    @FieldInfo(name = "创建人ID")
    private String createUserCode;
    /**
     * 创建人名称
     */
    @FieldInfo(name = "创建人名称")
    private String createUserName;
    /**
     * 创建部门ID
     */
    @FieldInfo(name = "创建部门ID")
    private String createDeptCode;
    /**
     * 创建部门名称
     */
    @FieldInfo(name = "创建部门名称")
    private String createDeptName;
    /**
     * 创建日期
     */
    @FieldInfo(name = "创建日期")
    private String createDate;
    /**
     * 修改人ID
     */
    @FieldInfo(name = "修改人ID")
    private String modifyUserCode;
    /**
     * 修改人名称
     */
    @FieldInfo(name = "修改人名称")
    private String modifyUserName;
    /**
     * 修改部门
     */
    @FieldInfo(name = "修改部门")
    private String modifyDeptCode;
    /**
     * 修改部门名称
     */
    @FieldInfo(name = "修改部门名称")
    private String modifyDeptName;
    /**
     * 修改日期
     */
    @FieldInfo(name = "修改日期")
    private String modifyDate;
    /**
     * 删除标识符,0表示未删除,1表示删除
     */
    @FieldInfo(name = "删除标识符,0表示未删除,1表示删除")
    private String flagDel = "0";
    /**
     * 显示标识符,0表示显示,1表示不显示
     */
    @FieldInfo(name = "显示标识符,0表示显示,1表示不显示")
    private String flagDisplay = "0";
    /**
     * 排序
     */
    @FieldInfo(name = "排序")
    private String sort;
    /**
     * 拼音
     */
    @FieldInfo(name = "拼音")
    private String spell;
    /**
     * 备注
     */
    @FieldInfo(name = "备注")
    private String remark;

    public String getCreateUserCode() {
        return createUserCode;
    }

    public void setCreateUserCode(String createUserCode) {
        this.createUserCode = createUserCode;
    }

    public String getCreateUserName() {
        return createUserName;
    }

    public void setCreateUserName(String createUserName) {
        this.createUserName = createUserName;
    }

    public String getCreateDeptCode() {
        return createDeptCode;
    }

    public void setCreateDeptCode(String createDeptCode) {
        this.createDeptCode = createDeptCode;
    }

    public String getCreateDeptName() {
        return createDeptName;
    }

    public void setCreateDeptName(String createDeptName) {
        this.createDeptName = createDeptName;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String getModifyUserCode() {
        return modifyUserCode;
    }

    public void setModifyUserCode(String modifyUserCode) {
        this.modifyUserCode = modifyUserCode;
    }

    public String getModifyUserName() {
        return modifyUserName;
    }

    public void setModifyUserName(String modifyUserName) {
        this.modifyUserName = modifyUserName;
    }

    public String getModifyDeptCode() {
        return modifyDeptCode;
    }

    public void setModifyDeptCode(String modifyDeptCode) {
        this.modifyDeptCode = modifyDeptCode;
    }

    public String getModifyDeptName() {
        return modifyDeptName;
    }

    public void setModifyDeptName(String modifyDeptName) {
        this.modifyDeptName = modifyDeptName;
    }

    public String getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(String modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getFlagDel() {
        return flagDel;
    }

    public void setFlagDel(String flagDel) {
        this.flagDel = flagDel;
    }

    public String getFlagDisplay() {
        return flagDisplay;
    }

    public void setFlagDisplay(String flagDisplay) {
        this.flagDisplay = flagDisplay;
    }

    public String getSort() {
        return sort;
    }

    public void setSort(String sort) {
        this.sort = sort;
    }

    public String getSpell() {
        return spell;
    }

    public void setSpell(String spell) {
        this.spell = spell;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

}

        3>继承基础实体的拓展实体对象,BaseExtendModel.java 其主要是为了拓展一些需要加的字段例如:预备字段等

package com.xxx.ssm.model;

import java.util.Map;

import javax.persistence.Transient;

import com.xxx.ssm.annotation.FieldInfo;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午9:50:29
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:业务基本实体
 */
public class BaseExtendModel extends BaseModel {

    /**
     * 备用字段1
     */
    @FieldInfo(name = "备用字段1")
    private String alespsystem01;
    /**
     * 备用字段2
     */
    @FieldInfo(name = "备用字段2")
    private String alespsystem02;
    /**
     * 备用字段3
     */
    @FieldInfo(name = "备用字段3")
    private String alespsystem03;
    /**
     * 备用字段4
     */
    @FieldInfo(name = "备用字段4")
    private String alespsystem04;
    /**
     * 备用字段5
     */
    @FieldInfo(name = "备用字段5")
    private String alespsystem05;
    /**
     * 字典值
     */
    @FieldInfo(name = "字典值")
    private Map<?, ?> dicValueMap;

    /**
     * 辖区值
     */
    @FieldInfo(name = "辖区值")
    private Map<?, ?> areaValueMap;

    /**
     * 角色编码
     */
    @Transient
    @FieldInfo(name = "角色编码")
    private String roleEncoding;

    public String getAlespsystem01() {
        return alespsystem01;
    }

    public void setAlespsystem01(String alespsystem01) {
        this.alespsystem01 = alespsystem01;
    }

    public String getAlespsystem02() {
        return alespsystem02;
    }

    public void setAlespsystem02(String alespsystem02) {
        this.alespsystem02 = alespsystem02;
    }

    public String getAlespsystem03() {
        return alespsystem03;
    }

    public void setAlespsystem03(String alespsystem03) {
        this.alespsystem03 = alespsystem03;
    }

    public String getAlespsystem04() {
        return alespsystem04;
    }

    public void setAlespsystem04(String alespsystem04) {
        this.alespsystem04 = alespsystem04;
    }

    public String getAlespsystem05() {
        return alespsystem05;
    }

    public void setAlespsystem05(String alespsystem05) {
        this.alespsystem05 = alespsystem05;
    }

    public Map<?, ?> getDicValueMap() {
        return dicValueMap;
    }

    public void setDicValueMap(Map<?, ?> dicValueMap) {
        this.dicValueMap = dicValueMap;
    }

    public Map<?, ?> getAreaValueMap() {
        return areaValueMap;
    }

    public void setAreaValueMap(Map<?, ?> areaValueMap) {
        this.areaValueMap = areaValueMap;
    }

    public String getRoleEncoding() {
        return roleEncoding;
    }

    public void setRoleEncoding(String roleEncoding) {
        this.roleEncoding = roleEncoding;
    }

}

(2)基础数据访问层接口(dao层)(主要抽象了业务实现的最基本的方法)
        在编写基础数据访问接口时,需要先增加三个类,分别为PageResult.java、Constant.java、PageUtil.java
        1>首先确保导入了对mybatis实现物理分页的工具包pagehelper-4.0.3.jar,然后在dao层下创建名为.pagesupport的包,          最后在该包下创建PageResult.java类,该类主要作用为:处理分页结果集

package com.xxx.ssm.dao.pagesupport;

import java.util.ArrayList;
import java.util.List;

import com.xxx.ssm.constant.Constant;
import com.xxx.ssm.utils.PageUtil;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午9:34:44
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:分页结果集
 */
public class PageResult<T> {

    /**
     * 当前页
     */
    private Integer nowPage;
    /**
     * 每页记录数
     */
    private Integer pageSize;
    /**
     * 开始下标
     */
    private Integer startRow;
    /**
     * 结束下标
     */
    private Integer endRow;
    /**
     * 总记录数
     */
    private long records;
    /**
     * 总页数
     */
    private Integer total;
    /**
     * 排序字段
     */
    private String orderColumn;
    /**
     * 排序方式
     */
    private String orderTurn;
    /**
     * 查询结果集
     */
    private List<T> rows = new ArrayList<T>();

    public PageResult() {
        this.nowPage = Constant.DEFAULT_CURRENT_PAGE;
        this.pageSize = Constant.DEFAULT_PAGE_SIZE;
        this.orderTurn = Constant.DEFAULT_ORDERTURN;
    }

    public PageResult(Integer nowPage, Integer pageSize, String orderColumn) {
        super();
        this.nowPage = nowPage;
        this.pageSize = pageSize;
        this.startRow = nowPage > 0 ? (nowPage - 1) * pageSize : 0;
        this.endRow = nowPage * pageSize;
        this.orderColumn = PageUtil.transformPropertyToColumn(orderColumn);

    }

    public PageResult(Integer nowPage, Integer pageSize, String orderColumn, String orderTurn) {
        super();
        this.nowPage = nowPage;
        this.pageSize = pageSize;
        this.startRow = nowPage > 0 ? (nowPage - 1) * pageSize : 0;
        this.endRow = nowPage * pageSize;
        this.orderColumn = PageUtil.transformPropertyToColumn(orderColumn);
        this.orderTurn = orderTurn;
    }

    public Integer getNowPage() {
        return nowPage;
    }

    public void setNowPage(Integer nowPage) {
        this.nowPage = nowPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public String getOrderColumn() {
        return orderColumn;
    }

    public void setOrderColumn(String orderColumn) {
        this.orderColumn = orderColumn;
    }

    public String getOrderTurn() {
        return orderTurn;
    }

    public void setOrderTurn(String orderTurn) {
        this.orderTurn = orderTurn;
    }

    public long getRecords() {
        return records;
    }

    public void setRecords(long l) {
        this.records = l;
    }

    public Integer getTotal() {
        return total;
    }

    public void setTotal(Integer total) {
        this.total = total;
    }

    public Integer getStartRow() {
        return startRow;
    }

    public void setStartRow(Integer startRow) {
        this.startRow = startRow;
    }

    public Integer getEndRow() {
        return endRow;
    }

    public void setEndRow(Integer endRow) {
        this.endRow = endRow;
    }

    public List<T> getRows() {
        return rows;
    }

    public void setRows(List<T> rows) {
        this.rows = rows;
    }

    @Override
    public String toString() {
        return "Page [nowPage=" + nowPage + ", pageSize=" + pageSize + ", startRow=" + startRow + ", endRow=" + endRow
                + ", records=" + records + ", total=" + total + ", orderColumn=" + orderColumn + ", orderTurn="
                + orderTurn + ", rows=" + rows + "]";
    }

}

        2>在constant存放常亮的包下创建Constant.java文件,该类的主要作用为:系统静态常量

package com.xxx.ssm.constant;
/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午9:31:29
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:系统静态常量
 */
public class Constant {

    /**
     * 分页相关
     */
    public final static int PAGESIZE = 10;// 默认每页显示条数
    public final static int DEFAULT_PAGE_SIZE = 10;// 缺省默认分页容量
    public final static int DEFAULT_CURRENT_PAGE = 1; // 缺省当前为第一页
    public final static String DEFAULT_ORDERTURN = "ASC";

    /**
     * SQL相关
     */
    public static final String SQLNAME_SEPARATOR = ".";
    public final static String SQLID_SAVE = "save"; // 插入一条新记录
    public final static String SQLID_INSERT_BATCH = "insertBatch"; // 批量插入
    public final static String SQLID_UPDATE = "update"; // 更新实体对象
    public final static String SQLID_UPDATE_PARAM = "updateParam"; // 修改符合条件的记录
    public final static String SQLID_UPDATE_BATCH = "updateBatch"; // 批量修改
    public final static String SQLID_DELETE = "delete"; // 删除实体对象
    public final static String SQLID_DELETE_BY_ID = "deleteById"; // 按主键删除记录
    public final static String SQLID_DELETE_PARAM = "deleteParam"; // 删除符合条件的记录
    public final static String SQLID_DELETE_BATCH = "deleteBatch"; // 批量删除
    public final static String SQLID_TRUNCATE = "truncate"; // 清空表,
    public final static String SQLID_FIND_ALL = "findAll"; // 查询所有实体对象集合
    public final static String SQLID_FIND_ALL_PARAM = "findAllParam"; // 查询所有实体对象集合
    public final static String SQLID_LOAD = "load"; // 查询所有实体对象集合 没有返回异常
    public final static String SQLID_FIND_BY_ID = "findById"; // 根据主键查询实体对象
    public final static String SQLID_FIND_BY_PAGE = "findByPage"; // 根据条件查询分页
    public final static String SQLID_QUERY_BY_SQL = "queryBySql"; // 根据SQL查询实体列表
    public final static String SQLID_GET_COUNT = "getCount"; // 查询总记录数据
    public final static String SQLID_QUERY_ALL_COUNT_PARAM = "queryAllCountParam"; // 查询符合条件的记录数

}

        3>在存放工具类包下创建名为PageUtil的分页工具类

package com.xxx.ssm.utils;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.github.pagehelper.Page;
import com.xxx.ssm.dao.pagesupport.PageResult;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午9:31:42
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:分页工具类
 */
public class PageUtil {

    /**
     * 
     * @author wangmingyuan
     * @param datas
     * @return PageResult
     * @serialData 2017年3月22日下午9:33:46
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static PageResult toPagedResult(List datas) {
        PageResult result = new PageResult();
        if (datas instanceof PageResult) {
            Page page = (Page) datas;
            result.setNowPage(page.getPageNum());
            result.setPageSize(page.getPageSize());
            result.setRows(page.getResult());
            result.setRecords(page.getTotal());
            result.setTotal(page.getPages());
        } else {
            Page page = (Page) datas;
            result.setNowPage(page.getPageNum());
            result.setPageSize(page.getPageSize());
            result.setRows(page.getResult());
            result.setRecords(page.getTotal());
            result.setTotal(page.getPages());
        }

        return result;
    }

    /**
     * 将类中的字段转换为数据库中的字段的格式,主要用于分页的时候的order by
     * @author wangmingyuan
     * @param property
     * @return String
     * @serialData 2017年3月22日下午9:34:14
     */
    public static String transformPropertyToColumn(String property) {
        if (property != null && !property.trim().isEmpty()) {
            Pattern p = Pattern.compile("[A-Z]");
            Matcher m = p.matcher(property);
            while (m.find()) {
                String a = m.group();
                property = property.replaceAll(a, "_" + a.toLowerCase());
                m = p.matcher(property);
            }
            return property.toUpperCase();
        } else {
            return null;
        }
    }


}

        4>然后在dao层根目录创建基础数据访问层接口IBaseDaoTempate文件

package com.xxx.ssm.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.xxx.ssm.dao.pagesupport.PageResult;

/**
 * @author 作者 :wangmingyuan
 * @version 创建时间:2017年3月23日 下午9:15:00 
 * 修改人: 
 * 修改日期: 类说明:
 */
public interface IBaseDaoTempate<T, PK extends Serializable> {

    /**
     * 添加实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:19:38
     */
    public int save(T entity);

    /**
     * 更新实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:20:19
     */
    public int update(T entity);

    /**
     * 删除实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:21:05
     */
    public int delete(T entity);

    /**
     * 根据id主键删除实体对象
     * 
     * @author wangmingyuan
     * @param id
     *            传入id
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:24:41
     */
    public int deleteById(PK id);

    /**
     * 根据id查询当前实体
     * 
     * @author wangmingyuan
     * @param id
     *            主键ID
     * @return T 返回查询的实体对象
     * @serialData 2017年3月22日下午9:25:04
     */
    public T findById(PK id);

    /**
     * 根据实体对象查询当前实体
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return T 返回查询的实体对象
     * @serialData 2017年3月22日下午9:25:47
     */
    public T findById(T entity);

    /**
     * 查询所有实体集合
     * 
     * @author wangmingyuan
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:26:05
     */
    public List<T> findAll();

    /**
     * 根据对象条件查询实体对象集合
     * 
     * @author wangmingyuan
     * @param entity
     *            传入的实体对象
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:28:26
     */
    public List<T> findAllParam(T entity);

    /**
     * 根据Map集合对象查询实体对象集合
     * 
     * @author wangmingyuan
     * @param param
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:28:45
     */
    public List<T> findAllParam(Map<?, ?> param);

    /**
     * 根据SQL查询条件查询总记录
     * 
     * @author wangmingyuan
     * @return Integer 返回查询的整数值
     * @serialData 2017年3月22日下午9:29:00
     */
    public Integer getCount();

    /**
     * 带参数的分页查询
     * 
     * @author wangmingyuan
     * @param page
     *            当前页
     * @param size
     *            每页记录数
     * @param sidx
     *            排序字段
     * @param sord
     *            排序方式
     * @param clazz
     *            传入实体对象
     * @return PageResult<T> 返回的list集合
     * @serialData 2017年3月22日下午9:39:22
     */
    public PageResult<T> findByPage(final int page, final int size, final String sidx, final String sord,
            final T clazz);

    /**
     * 根据SQL查询实体列表
     * 
     * @author wangmingyuan
     * @param sql
     *            需要传入的sql语句
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:39:04
     */
    public List<T> queryBySql(String sql);

    /**
     * 批量插入实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            实体集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:38:38
     */
    public int saveBatch(final List<T> list);

    /**
     * 批量更新实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            主键集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:38:10
     */
    public int updateBatch(final List<T> list);

    /**
     * 批量删除实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            主键集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:37:46
     */
    public int deleteBatch(final List<PK> list);

}

(3)基础数据访问层实现类(dao层)
         在实现基础数据访问层实现类之前,需要先创建一个注解类用来对应对应映射**Mapper.xml的namespace
        1>在com.xxx.ssm.annotation包下创建名为MapperUrlAnnotion的自定义注解类

package com.xxx.ssm.annotation;
/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午10:18:49
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:
 */
public @interface MapperUrlAnnotion {

    /**
     * 对应映射**Mapper.xml的namespace
     * @return
     */
    public String mapperUrl() default "";

}

        2>然后在dao根目录创建BaseDaoTemplateImpl实现类,在这里博主删除一些功能,希望大家能自己写出来。所话说:“授之以鱼不如授之以渔”嘛。如果实在写不出来,可以联系我

package com.xxx.ssm.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import com.github.pagehelper.PageHelper;
import com.xxx.ssm.annotation.MapperUrlAnnotion;
import com.xxx.ssm.constant.Constant;
import com.xxx.ssm.dao.pagesupport.PageResult;
import com.xxx.ssm.utils.PageUtil;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午10:16:27
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:
 */
public class BaseDaoTemplateImpl<T , PK extends Serializable> implements IBaseDaoTempate<T, PK> {





    /**
     * 获取默认SqlMapping命名空间。 使用泛型参数中业务实体类型的全限定名作为默认的命名空间。
     * 如果实际应用中需要特殊的命名空间,可由子类重写该方法实现自己的命名空间规则。
     * 
     * @return
     */
    @SuppressWarnings("unchecked")
    protected String getDefaultSqlNameSpace() {
        Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        MapperUrlAnnotion mua = clazz.getAnnotation(MapperUrlAnnotion.class);
        String namespace = mua.mapperUrl();
        return namespace;
    }

    // xxxmapper..xml中的namespace
    private String namespace = getDefaultSqlNameSpace();

    public String getSqlName(String sqlName) {
        System.out.println(
                namespace + Constant.SQLNAME_SEPARATOR + sqlName + "-------------------输出---------------------");
        return namespace + Constant.SQLNAME_SEPARATOR + sqlName;
    }


    /**
     * 添加实体
     * 
     * @author wmy
     * @param entity
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int save(T entity) {
        // 声明一个标记标量,当插入失败时为0,成功则非0
        int rows = sessionTemplate.insert(getSqlName(Constant.SQLID_SAVE), entity);
        return rows;
    }

    /**
     * 更新实体
     * 
     * @author wmy
     * @param entity
     *            传入实体对象
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int update(T entity) {
        // 声明一个标记标量,当插入失败时为0,成功则非0
        int rows = sessionTemplate.update(getSqlName(Constant.SQLID_UPDATE), entity);
        return rows;
    }

    /**
     * 删除一个实体
     * 
     * @author wmy
     * @param entity
     *            传入的实体对象
     * @serialData 2017年3月22日下午10:32:11
     */
    public int delete(T entity) {
        // 声明一个标记标量,当插入失败时为0,成功则非0
        int rows = sessionTemplate.delete(getSqlName(Constant.SQLID_DELETE), entity);
        return rows;
    }

    /**
     * 根据id主键删除实体对象
     * 
     * @param id
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int deleteById(PK id) {
        int rows = sessionTemplate.delete(getSqlName(Constant.SQLID_DELETE_BY_ID), id);
        return rows;
    }

    /**
     * 根据id查询当前实体
     * 
     * @author wmy
     * @param id
     *            主键ID
     * @return 返回查询的实体对象
     * @serialData 2016年7月26日下午10:10:20
     */
    public T findById(PK id) {
        return sessionTemplate.selectOne(getSqlName(Constant.SQLID_FIND_BY_ID), id);

    }

    /**
     * 根据实体对象查询当前实体
     * 
     * @author wmy
     * @param clazz
     *            传入实体对象
     * @return 返回查询的实体对象
     * @serialData 2017年3月22日下午10:32:11
     */
    public T findById(T clazz) {
        return sessionTemplate.selectOne(getSqlName(Constant.SQLID_FIND_BY_ID), clazz);

    }

    /**
     * 查询所有实体集合
     * 
     * @author wmy
     * @return 返回实体对象的List集合
     * @serialData 2017年3月22日下午10:32:11
     */
    public List<T> findAll() {
        // TODO Auto-generated method stub
        return sessionTemplate.selectList(getSqlName(Constant.SQLID_FIND_ALL));
    }

    /**
     * 根据对象条件查询实体对象集合
     * 
     * @param clazz
     *            传入的实体对象
     * @return 返回实体对象的List集合
     * @serialData 2017年3月22日下午10:32:11
     */
    public List<T> findAllParam(T clazz) {
        return sessionTemplate.selectList(getSqlName(Constant.SQLID_FIND_ALL_PARAM), clazz);
    }

    /**
     * 根据Map集合对象查询实体对象集合
     * 
     * @param param
     * @return 返回实体对象的List集合
     * @serialData 2017年3月22日下午10:32:11
     */
    public List<T> findAllParam(Map<?, ?> param) {
        return sessionTemplate.selectList(getSqlName(Constant.SQLID_FIND_ALL_PARAM), param);
    }

    /**
     * 根据SQL查询条件查询总记录
     * 
     * @author wmy
     * @return 返回查询的整数值
     * @serialData 2017年3月22日下午10:32:11
     */
    public Integer getCount() {
        return sessionTemplate.selectOne(getSqlName(Constant.SQLID_GET_COUNT));
    }

    /**
     * 带参数的分页查询
     * 
     * @param page
     *            当前页
     * @param size
     *            每页记录数
     * @param sidx
     *            排序字段
     * @param sord
     *            排序方式
     * @param clazz
     * @return 返回的list集合
     * @serialData 2017年3月22日下午10:32:11
     */

    @SuppressWarnings("unchecked")
    public PageResult<T> findByPage(int page, int size, String sidx, String sord, T clazz) {
        这里需要大家自己去想想

    }

    /**
     * 根据SQL查询实体列表
     * 
     * @author wmy
     * @param sql
     *            需要传入的sql语句
     * @return 返回实体对象的List集合
     * @serialData 2017年3月22日下午10:32:11
     */
    public List<T> queryBySql(String sql) {
        return sessionTemplate.selectList(getSqlName(Constant.SQLID_QUERY_BY_SQL), sql);
    }

    /**
     * 批量插入
     * 
     * @param list
     *            实体集合
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int saveBatch(List<T> list) {
        return sessionTemplate.insert(getSqlName(Constant.SQLID_INSERT_BATCH), list);
    }

    /**
     * 批量修改
     * 
     * @param list
     *            实体集合
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int updateBatch(List<T> list) {
        return sessionTemplate.update(getSqlName(Constant.SQLID_UPDATE_BATCH), list);
    }

    /**
     * 批量删除
     * 
     * @param list
     *            主键集合
     * @return 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午10:32:11
     */
    public int deleteBatch(List<PK> list) {
        return sessionTemplate.delete(getSqlName(Constant.SQLID_DELETE_BATCH), list);
    }

}

(4)基础业务接口(service层)其实和IBaseDaoTemplate相同

package com.xxx.ssm.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.xxx.ssm.dao.pagesupport.PageResult;

/**
 * @author 作者 :xxx
 * @version 创建时间:2017年3月22日 下午10:33:34
 * @modifyUser 修改人:
 * @modifyDate 修改日期:
 * @clazzExplain 类说明:
 */
public interface IBaseServiceTemplate<T, PK extends Serializable> {

    /**
     * 添加实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:19:38
     */
    public int save(T entity);

    /**
     * 更新实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:20:19
     */
    public int update(T entity);

    /**
     * 删除实体对象
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:21:05
     */
    public int delete(T entity);

    /**
     * 根据id主键删除实体对象
     * 
     * @author wangmingyuan
     * @param id
     *            传入id
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:24:41
     */
    public int deleteById(PK id);

    /**
     * 根据id查询当前实体
     * 
     * @author wangmingyuan
     * @param id
     *            主键ID
     * @return T 返回查询的实体对象
     * @serialData 2017年3月22日下午9:25:04
     */
    public T findById(PK id);

    /**
     * 根据实体对象查询当前实体
     * 
     * @author wangmingyuan
     * @param entity
     *            传入实体对象
     * @return T 返回查询的实体对象
     * @serialData 2017年3月22日下午9:25:47
     */
    public T findById(T entity);

    /**
     * 查询所有实体集合
     * 
     * @author wangmingyuan
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:26:05
     */
    public List<T> findAll();

    /**
     * 根据对象条件查询实体对象集合
     * 
     * @author wangmingyuan
     * @param entity
     *            传入的实体对象
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:28:26
     */
    public List<T> findAllParam(T entity);

    /**
     * 根据Map集合对象查询实体对象集合
     * 
     * @author wangmingyuan
     * @param param
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:28:45
     */
    public List<T> findAllParam(Map<?, ?> param);

    /**
     * 根据SQL查询条件查询总记录
     * 
     * @author wangmingyuan
     * @return Integer 返回查询的整数值
     * @serialData 2017年3月22日下午9:29:00
     */
    public Integer getCount();

    /**
     * 带参数的分页查询
     * 
     * @author wangmingyuan
     * @param page
     *            当前页
     * @param size
     *            每页记录数
     * @param sidx
     *            排序字段
     * @param sord
     *            排序方式
     * @param clazz
     *            传入实体对象
     * @return PageResult<T> 返回的list集合
     * @serialData 2017年3月22日下午9:39:22
     */
    public PageResult<T> findByPage(final int page, final int size, final String sidx, final String sord,
            final T clazz);

    /**
     * 根据SQL查询实体列表
     * 
     * @author wangmingyuan
     * @param sql
     *            需要传入的sql语句
     * @return List<T> 返回实体对象的List集合
     * @serialData 2017年3月22日下午9:39:04
     */
    public List<T> queryBySql(String sql);

    /**
     * 批量插入实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            实体集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:38:38
     */
    public int saveBatch(final List<T> list);

    /**
     * 批量更新实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            主键集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:38:10
     */
    public int updateBatch(final List<T> list);

    /**
     * 批量删除实体对象
     * 
     * @author wangmingyuan
     * @param list
     *            主键集合
     * @return int 返回一个整形数值是否执行成功
     * @serialData 2017年3月22日下午9:37:46
     */
    public int deleteBatch(final List<PK> list);

}

好了,到此为止我的关于SSM框架的企业级搭建的第二篇博客,就更新完成了,哎。。。博主是一边写测试系统一边在粘代码,很不容易的,都是博主经过试验测试过的,没问题的。好了。不写了,太晚了,该睡觉喽,如果工期不紧的话博主会在两周之内更新的,尽情期待!!!!
PS:关于ssm系统集成技术交流群已开通,有兴趣的朋友们,可以申请加入,目前人数不多呦!
群号:499500313

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值