在大家的期待中迎来的关于“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 类说明:基础实体类,所有实体对象全部继承于该类
* 基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass
* 注解将实体类的多个属性分别封装到不同的非实体类中。
* 1.@MappedSuperclasz注解只能标准在类上
* 2.标注为@MappedSuperclass的类将不是一个完整的实体类,他将不会映射到数据库表,
* 但是他的属性都将映射到其子类的数据库字段中。
* 统一定义id 的entity的基类
* 基类统一定义id的属性名称、数据类型、列名映射及生成策略。
* JPA基类的标识符
*/
@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 rows = new ArrayList();
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 getRows() {
return rows;
}
public void setRows(List 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 IBaseDaoTempateextends 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 返回实体对象的List集合
* @serialData 2017年3月22日下午9:26:05
*/
public List findAll();
/**
* 根据对象条件查询实体对象集合
*
* @author wangmingyuan
* @param entity
* 传入的实体对象
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:28:26
*/
public List findAllParam(T entity);
/**
* 根据Map集合对象查询实体对象集合
*
* @author wangmingyuan
* @param param
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:28:45
*/
public List 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 返回的list集合
* @serialData 2017年3月22日下午9:39:22
*/
public PageResult findByPage(final int page, final int size, final String sidx, final String sord,
final T clazz);
/**
* 根据SQL查询实体列表
*
* @author wangmingyuan
* @param sql
* 需要传入的sql语句
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:39:04
*/
public List queryBySql(String sql);
/**
* 批量插入实体对象
*
* @author wangmingyuan
* @param list
* 实体集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:38:38
*/
public int saveBatch(final List list);
/**
* 批量更新实体对象
*
* @author wangmingyuan
* @param list
* 主键集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:38:10
*/
public int updateBatch(final List list);
/**
* 批量删除实体对象
*
* @author wangmingyuan
* @param list
* 主键集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:37:46
*/
public int deleteBatch(final List 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 clazz = (Class) ((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 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 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 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 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 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 list) {
return sessionTemplate.insert(getSqlName(Constant.SQLID_INSERT_BATCH), list);
}
/**
* 批量修改
*
* @param list
* 实体集合
* @return 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午10:32:11
*/
public int updateBatch(List list) {
return sessionTemplate.update(getSqlName(Constant.SQLID_UPDATE_BATCH), list);
}
/**
* 批量删除
*
* @param list
* 主键集合
* @return 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午10:32:11
*/
public int deleteBatch(List 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 IBaseServiceTemplateextends 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 返回实体对象的List集合
* @serialData 2017年3月22日下午9:26:05
*/
public List findAll();
/**
* 根据对象条件查询实体对象集合
*
* @author wangmingyuan
* @param entity
* 传入的实体对象
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:28:26
*/
public List findAllParam(T entity);
/**
* 根据Map集合对象查询实体对象集合
*
* @author wangmingyuan
* @param param
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:28:45
*/
public List 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 返回的list集合
* @serialData 2017年3月22日下午9:39:22
*/
public PageResult findByPage(final int page, final int size, final String sidx, final String sord,
final T clazz);
/**
* 根据SQL查询实体列表
*
* @author wangmingyuan
* @param sql
* 需要传入的sql语句
* @return List 返回实体对象的List集合
* @serialData 2017年3月22日下午9:39:04
*/
public List queryBySql(String sql);
/**
* 批量插入实体对象
*
* @author wangmingyuan
* @param list
* 实体集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:38:38
*/
public int saveBatch(final List list);
/**
* 批量更新实体对象
*
* @author wangmingyuan
* @param list
* 主键集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:38:10
*/
public int updateBatch(final List list);
/**
* 批量删除实体对象
*
* @author wangmingyuan
* @param list
* 主键集合
* @return int 返回一个整形数值是否执行成功
* @serialData 2017年3月22日下午9:37:46
*/
public int deleteBatch(final List list);
}
好了,到此为止我的关于SSM框架的企业级搭建的第二篇博客,就更新完成了,哎。。。博主是一边写测试系统一边在粘代码,很不容易的,都是博主经过试验测试过的,没问题的。好了。不写了,太晚了,该睡觉喽,如果工期不紧的话博主会在两周之内更新的,尽情期待!!!!
PS:关于ssm系统集成技术交流群已开通,有兴趣的朋友们,可以申请加入,目前人数不多呦!
群号:499500313