[置顶] Spring4.0.9+SpringMVC4.0.9+SpringSecurity3.2.5+MyBatis3.2.5+Activiti5.21即:SSM框架的企业级搭建——二
2017-03-22 22:40
441 查看
在大家的期待中迎来的关于“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、制定一些基本的命名规则
在开发的时候,我们需要对项目组的编码进行强制性的一致编码规则,也只有这样编写出来的代码才能被整个项目组的人读懂,使人开着舒心也能达到赏心悦目的感觉,并且从长远角度来讲这样还便于以后维护人员对项目的维护与修改。至于益处有好多,在这里就不一一列举了,相信大家都应该明白这里面的利弊。
3、编写基础核心代码
(1)编写基础实体对象(model层)
1>实现基础实体前,先要写一个自定义注解,“FieldInfo.java”文件,主要目的是构建前台字段使用(暂时先加着吧)
2>基础实体,BaseModel.java,其里面字段为每个实体对象必备的字段
3>继承基础实体的拓展实体对象,BaseExtendModel.java 其主要是为了拓展一些需要加的字段例如:预备字段等
(2)基础数据访问层接口(dao层)(主要抽象了业务实现的最基本的方法)
在编写基础数据访问接口时,需要先增加三个类,分别为PageResult.java、Constant.java、PageUtil.java
1>首先确保导入了对mybatis实现物理分页的工具包pagehelper-4.0.3.jar,然后在dao层下创建名为.pagesupport的包, 最后在该包下创建PageResult.java类,该类主要作用为:处理分页结果集
2>在constant存放常亮的包下创建Constant.java文件,该类的主要作用为:系统静态常量
3>在存放工具类包下创建名为PageUtil的分页工具类
4>然后在dao层根目录创建基础数据访问层接口IBaseDaoTempate文件
(3)基础数据访问层实现类(dao层)
在实现基础数据访问层实现类之前,需要先创建一个注解类用来对应对应映射**Mapper.xml的namespace
1>在com.xxx.ssm.annotation包下创建名为MapperUrlAnnotion的自定义注解类
2>然后在dao根目录创建BaseDaoTemplateImpl实现类,在这里博主删除一些功能,希望大家能自己写出来。所话说:“授之以鱼不如授之以渔”嘛。如果实在写不出来,可以联系我
(4)基础业务接口(service层)其实和IBaseDaoTemplate相同
好了,到此为止我的关于SSM框架的企业级搭建的第二篇博客,就更新完成了,哎。。。博主是一边写测试系统一边在粘代码,很不容易的,都是博主经过试验测试过的,没问题的。好了。不写了,太晚了,该睡觉喽,如果工期不紧的话博主会在两周之内更新的,尽情期待!!!!
PS:关于ssm系统集成技术交流群已开通,有兴趣的朋友们,可以申请加入,目前人数不多呦!
群号:499500313
同时博主打算为大家建一个关于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
相关文章推荐
- [置顶] 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框架的企业级搭建之番外篇— 根据POI技术实现
- SSM框架搭建详细过程,springmvc、spring、mybatis整合
- 那么承接着新建了模块,我就来说一下SSM(Spring、SpringMVC、Mybatis)框架如何搭建
- IntelliJ IDEA 搭建基于Maven 的SSM(一)(spring,springMvc,Mybatis)框架整合
- myeclipse下使用maven搭建SSM(spring、springmvc、mybatis)框架
- Spring,SpringMVC,Mybatis (SSM)框架的搭建
- 完整使用SSM框架(Spring SpringMVC Mybatis)搭建web服务器实现登录功能
- SSM基于注解配置Spring4.1.6、springMVC4.1.6、mybatis3.2.8的maven框架搭建
- 使用Spring、SpringMvc、MyBatis搭建SSM框架
- Spring学习之SpringMVC框架快速搭建实现用户登录功能
- SpringMVC笔记——SSM框架搭建简单实例
- SSM框架整合( Spring 、 SpringMVC 和 Mybatis )
- Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
- SSM框架——Spring+SpringMVC+Mybatis的搭建教程
- SSM框架(Spring+SpringMVC+MyBatis)详细搭建过程
- 2018用IDEA搭建SSM框架(Spring+SpringMVC+Mybatis)
- Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境
- SpringMVC笔记——SSM框架搭建简单实例