Spring4.0.9+SpringMVC4.0.9+SpringSecurity3.2.5+MyBatis3.2.5+Activiti5.21即:SSM框架的企业级搭建之番外篇— 根据POI技术实现

因为用到了反射技术,在大数量的情况下,可能效率会慢一下,使用的同学们,如果有更好的优化方式请留言评论回复,我会加以修改。


一、优点及技术点:

1、下载式导出;
2、方法接口化易拓展
3、java反射技术
4、...

 

二、导出功能所设计类介绍:

1、TempExportColumn              说明:系统通用导出模板统实体类;
2、ExportTemplateAction          说明:系统通用导出模板统一接入action;
3、ExportUtil                    说明:系统通用导出模板工具类;
4、ExportTemplateService<T>      说明:系统通用导出服务层接口;
5、ExportTemplateServiceImpl<T>  说明:系统通用导出服务层接口实现类;
6、SqlMapper                     说明:系统通用导出MyBatis执行sql工具


三、导出功能:

1、当前页

2、选中的数据

3.、自定义范围

4、全部数据

如图例:

 

四、Action层,功能传入参数:

String fileTitle,    文件标题
String fileName,      文件名称
String fileCheckType,    文件选择导出类型  
String exportType,       导出文件类型
String exportColumns,    Excel导出字段
String clazzName         需要导出的类名称
String nowPage           当前页数
String cods              选中数据主键集合
String startPage         起始页
String endPage           尾页


 

五、前端传参形式例如以Extjs为例:

 

exportObj:[{
		title:"导出设置",// 标题
		exportType:"excel" // 导出类型 excel word
            },{
		exportArray:[{fieldLabel:"登录人名称",fieldName:"loginLogUsername",columnCellHeight:"300",columnCellWight:"3000"},
		    	         {fieldLabel:"登录人编码",fieldName:"loginLogUserEncoding",columnCellHeight:"300",columnCellWight:"3000"},
					     {fieldLabel:"登录人部门名称",fieldName:"loginLogDeptName",columnCellHeight:"300",columnCellWight:"5000"},
					     {fieldLabel:"登录人部门编码",fieldName:"loginLogDeptEncoding",columnCellHeight:"300",columnCellWight:"5000"},
					     {fieldLabel:"登录人所属角色名称",fieldName:"loginLogRoleName",columnCellHeight:"300",columnCellWight:"5000"},
					     {fieldLabel:"登录人所属角色编码",fieldName:"loginLogRoleEncoding",columnCellHeight:"300",columnCellWight:"5000"},
					     {fieldLabel:"登录人IP",fieldName:"loginLogIp",columnCellHeight:"300",columnCellWight:"3800"},
					     {fieldLabel:"登录时间",fieldName:"createDate",columnCellHeight:"300",columnCellWight:"4600"}
		    ]
		 }],//导出窗口参数配置

 

Action层代码:

package xxx.xxx. xxxxxxxxxx.action.apptemplate;
 
import java.io.OutputStream;
 
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
 
import org.apache.log4j.Logger;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
importorg.springframework.web.bind.annotation.RestController;
 
import xxx.xxx. xxxxxxxxxx action.BaseAction;
import xxx.xxx.xxxxxxxxxx.utils.ExportUtil;
 
/**
 *@Title: ExportTemplateAction.java
 *@Package xxx.xxxxxxxxxxxxx.action
 *@Description: 系统通用导出模板action
 *@author my
 *@createDate
 *@modifyUser 修改人 :
 *@modifyDate 修改时间 :
 *@version V.x
 */
@RestController
@RequestMapping(value ="/exporttemplateaction")
public class ExportTemplateAction extendsBaseAction{
 
       privatestatic Logger logger = Logger.getLogger(ExportTemplateAction.class);
       @Autowired
       privateExportUtil exportUtil;
      
       @RequestMapping(value= "/doExport", method = RequestMethod.GET)
       publicvoid doExport(HttpServletRequest request, HttpServletResponse response, StringfileTitle, String fileName,String fileCheckType, String exportType, StringexportColumns, String clazzName,String nowPage,String codes,StringstartPage,String endPage) {
              try{
                     if(exportType.equals("excel")){//这里是导出Excel通用入口
                            HSSFWorkbookworkbook = exportUtil.exportExcel(fileTitle, fileName, fileCheckType,exportType, exportColumns, clazzName,nowPage,codes,startPage,endPage);
                            //通过Response把数据以Excel格式保存
                            response.reset();
                            response.setContentType("application/msexcel;charset=UTF-8");
                            response.setHeader("Content-Disposition","attachment;filename=\""+ new String((fileName).getBytes("UTF-8"), "UTF-8") +"\"");
                            OutputStreamoutputStream = response.getOutputStream();
                            workbook.write(outputStream);// 输出文件到客户端
                            outputStream.flush();
                            outputStream.close();
                     }else{//这里是导出Word通用入口
                           
                     }
              }catch (Exception e) {
                     logger.error("导出方法出错,错误信息" + e.getMessage());
              }
       }
 
}



Util工具类:

package xxx.xxxx.xxxxxxxxxxxxxxxxxx.utils;


import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.util.List;


import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


import xx.xxxx.xxxxxxxxxxxxxxxxxx.model.TempExportColumn;
import xx.xxxx.xxxxxxxxxxxxxxxxxx.service.apptemplate.serviceinterface.ExportTemplateService;
import xx.xxxx.xxxxxxxxxxxxxxxxxx.utils.StringUtil;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;


/** 
 * @Title: ExportUtil.java
 * @Package xx.xxxx.xxxxxxxxxxxxxxxxxx.utils
 * @Description: 系统通用导出模板工具类
 * @author my
 * @createDate 
 * @modifyUser 修改人 :
 * @modifyDate 修改时间 :
 * @version V.1
 */
@Service
@Transactional
public class ExportUtil {
	
	private static Logger logger = Logger.getLogger(ExportUtil.class);
	
	@SuppressWarnings("rawtypes")
	@Autowired
	private ExportTemplateService exportTemplateService;


	@SuppressWarnings("static-access")
	public HSSFWorkbook exportExcel(String fileTitle, String fileName,String fileCheckType, String exportType, String exportColumns, String clazzName,String nowPage,String codes,String startPage,String endPage){
		HSSFWorkbook workbook = new HSSFWorkbook();
		try {
			ObjectMapper mapper = new ObjectMapper();
			@SuppressWarnings("deprecation")
			JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, TempExportColumn.class);
			List<TempExportColumn> list = mapper.readValue(exportColumns, javaType);
			String sql = null;
			if(fileCheckType.equals("currentPageData")){ //导出当前页
				sql = this.createCurrentSql(list, clazzName,nowPage);
			}else if(fileCheckType.equals("selectedData")){//导出选中数据
				sql = this.createSelectedSql(list, clazzName,codes);
			}else if(fileCheckType.equals("userDefinedRangeData")){//导出自定义页数范围
				sql = this.createUserDefinedRangeSql(list, clazzName,startPage,endPage);
			}else{ //导出全部数据
				sql = this.createAllSql(list, clazzName);
			}
			HSSFSheet sheet = workbook.createSheet();
			HSSFCellStyle borderStyle = workbook.createCellStyle();
			crateTitle(list, fileTitle, sheet, borderStyle);
			createTag(list, sheet, borderStyle);// 写表格的列名
			exportAllBySql(sql, list, clazzName, sheet, borderStyle);
			return workbook;
		} catch (Exception e) {
			logger.error("导出方法出错,错误信息" + e.getMessage());
			return workbook;
		}
	}
	
	@SuppressWarnings({ "deprecation" })
	private static void crateTitle(List<TempExportColumn> list, String fileTitle, HSSFSheet sheet,
			HSSFCellStyle borderStyle) {
		try {
			CellRangeAddress region1 = new CellRangeAddress(0, 0, (short) 0, (short) list.size()-1);
			sheet.addMergedRegion(region1);
			HSSFRow rowT = sheet.createRow(0);
			rowT.setHeight((short) 350);
			HSSFCell cellT = rowT.createCell((short) 0);
			cellT.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
			cellT.setCellValue(new String((fileTitle).getBytes("iso-8859-1"), "UTF-8"));
			borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
			borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
			borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
			borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
			borderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
			cellT.setCellStyle(borderStyle);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


	}


	/**
	 * 
	 * @Title: createTag 
	 * @Description: 创建表格表头 
	 * @createDate:
	 * @modifyUser 修改人 : 
	 * @modifyDate 修改时间 : 
	 * @version V.x 
	 * @param @param
	 * tags @param @param sheet 设定文件 
	 * @return void 返回类型 
	 * @throws
	 */
	@SuppressWarnings({ "deprecation" })
	private static void createTag(List<TempExportColumn> list, HSSFSheet sheet, HSSFCellStyle borderStyle) {
		HSSFRow row = sheet.createRow(1);


		HSSFCell cell = null;
		// 定义单元格为字符串类型
		for (int i = 0; i < list.size(); i++) {
			try {
				sheet.setColumnWidth(i, Integer.parseInt(list.get(i).getColumnCellWight()));
				row.setHeight((short) Integer.parseInt(list.get(i).getColumnCellHeight()));
				cell = row.createCell(i);
				cell.setCellValue(new String((list.get(i).getFieldLabel()).getBytes("iso-8859-1"), "UTF-8"));


				cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文处理
				borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
				borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
				borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
				borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
				borderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
				cell.setCellStyle(borderStyle);
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}


		}
	}


	
	/**
	 * 
	 * @Title: createCurrentSql 
	 * @Description: 拼接当前页面sql语句前端配置导出列组,和sheet表创建导出数据excel
	 * @createDate:
	 * @modifyUser 修改人 :
	 * @modifyDate 修改时间 :
	 * @version V.x
	 * @param @param list
	 * @param @param clazzName
	 * @param @return    设定文件 
	 * @return String    返回类型 
	 * @throws
	 */
	@SuppressWarnings({ "rawtypes" })
	private static String createCurrentSql(List<TempExportColumn> list, String clazzName,String nowPage) {


		String sql = "";
		StringBuilder sqlStart = new StringBuilder();
		StringBuilder sqlEnd = new StringBuilder();


		try {
			Class clazz = Class.forName(clazzName);
			String clazzNameTable = clazz.getSimpleName();
			String tableName = clazzNameTable.substring(0, 1).toLowerCase() + clazzNameTable.substring(1);
			tableName = StringUtil.transformPropertyToColumn(tableName);
			sqlStart.append("SELECT TOP 25 * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY "+tableName+".CREATE_DATE DESC) PAGE_ROW_NUMBER, " + tableName + ".CODE AS CODE,");
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){ //--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlStart.append("SYS_DICT_VALUE_"+columnName+".VALUE_NAME AS " + column.getFieldName().toUpperCase() + ",");
				}else{
				    sqlStart.append(tableName + "." + columnName + " AS " + column.getFieldName().toUpperCase() + ",");
				}
			}
			sqlEnd.append(" FROM ");
			sqlEnd.append(tableName);
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlEnd.append(" LEFT JOIN SYS_DICT_VALUE AS SYS_DICT_VALUE_"+columnName+" ON SYS_DICT_VALUE_"+columnName+".VALUE = "+tableName+"."+columnName);
				}
			}
			sqlEnd.append(" WHERE ");
			sqlEnd.append(tableName + ".");
			sqlEnd.append("FLAG_DEL != 1) AS PAGE_TABLE_ALIAS WHERE PAGE_ROW_NUMBER > "+(Integer.parseInt(nowPage)-1)*25+" ORDER BY PAGE_ROW_NUMBER");
			sql = sqlStart.toString().substring(0, sqlStart.length() - 1) + sqlEnd.toString();
			return sql.toString();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}


	}
	
	/**
	 * 
	 * @Title: createSelectedSql 
	 * @Description: 拼接选中数据sql语句前端配置导出列组,和sheet表创建导出数据excel
	 * @createDate:2017年10月23日 下午2:59:01
	 * @modifyUser 修改人 :
	 * @modifyDate 修改时间 :
	 * @version V.x
	 * @param @param list
	 * @param @param clazzName
	 * @param @return    设定文件 
	 * @return String    返回类型 
	 * @throws
	 */
	@SuppressWarnings({ "rawtypes" })
	private static String createSelectedSql(List<TempExportColumn> list, String clazzName,String codes) {


		String sql = "";
		StringBuilder sqlStart = new StringBuilder();
		StringBuilder sqlEnd = new StringBuilder();
		String checkdCodes = null;
        if(StringUtil.isNotEmpty(codes)){
        	String[] ids = codes.split(",");
        	for(String id:ids){
        		checkdCodes += "'"+id+"',";
        	}
        }
        checkdCodes = checkdCodes.substring(4, checkdCodes.length()-1);
		try {
			Class clazz = Class.forName(clazzName);
			String clazzNameTable = clazz.getSimpleName();
			String tableName = clazzNameTable.substring(0, 1).toLowerCase() + clazzNameTable.substring(1);
			tableName = StringUtil.transformPropertyToColumn(tableName);
			sqlStart.append("SELECT " + tableName + ".CODE AS CODE,");
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlStart.append("SYS_DICT_VALUE_"+columnName+".VALUE_NAME AS " + column.getFieldName().toUpperCase() + ",");
				}else{
				    sqlStart.append(tableName + "." + columnName + " AS " + column.getFieldName().toUpperCase() + ",");
				}
			}
			sqlEnd.append(" FROM ");
			sqlEnd.append(tableName);
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){
					sqlEnd.append(" LEFT JOIN SYS_DICT_VALUE AS SYS_DICT_VALUE_"+columnName+" ON SYS_DICT_VALUE_"+columnName+".VALUE = "+tableName+"."+columnName);
				}
			}
			sqlEnd.append(" WHERE ");
			sqlEnd.append(tableName + ".");
			sqlEnd.append("FLAG_DEL != 1 AND "+tableName+".CODE IN("+checkdCodes+") ORDER BY " + tableName + ".CREATE_DATE DESC");
			sql = sqlStart.toString().substring(0, sqlStart.length() - 1) + sqlEnd.toString();
			return sql.toString();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}


	}
	
	/**
	 * 
	 * @Title: createUserDefinedRangeSql 
	 * @Description: 拼接自定义页数范围sql语句前端配置导出列组,和sheet表创建导出数据excel
	 * @createDate:2017年10月23日 下午2:58:05
	 * @modifyUser 修改人 :
	 * @modifyDate 修改时间 :
	 * @version V.x
	 * @param @param list
	 * @param @param clazzName
	 * @param @return    设定文件 
	 * @return String    返回类型 
	 * @throws
	 */
	@SuppressWarnings({ "rawtypes" })
	private static String createUserDefinedRangeSql(List<TempExportColumn> list, String clazzName,String startPage,String endPage) {


		String sql = "";
		StringBuilder sqlStart = new StringBuilder();
		StringBuilder sqlEnd = new StringBuilder();


		try {
			Class clazz = Class.forName(clazzName);
			String clazzNameTable = clazz.getSimpleName();
			String tableName = clazzNameTable.substring(0, 1).toLowerCase() + clazzNameTable.substring(1);
			tableName = StringUtil.transformPropertyToColumn(tableName);
			sqlStart.append("SELECT TOP "+(Integer.parseInt(endPage)-Integer.parseInt(startPage)+1)*25+" * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY "+tableName+".CREATE_DATE DESC) PAGE_ROW_NUMBER, " + tableName + ".CODE AS CODE,");
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlStart.append("SYS_DICT_VALUE_"+columnName+".VALUE_NAME AS " + column.getFieldName().toUpperCase() + ",");
				}else{
				    sqlStart.append(tableName + "." + columnName + " AS " + column.getFieldName().toUpperCase() + ",");
				}
			}
			sqlEnd.append(" FROM ");
			sqlEnd.append(tableName);
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                               //--数据库存值为:male/female 程序处理对应为 男/女
					sqlEnd.append(" LEFT JOIN SYS_DICT_VALUE AS SYS_DICT_VALUE_"+columnName+" ON SYS_DICT_VALUE_"+columnName+".VALUE = "+tableName+"."+columnName);
				}
			}
			sqlEnd.append(" WHERE ");
			sqlEnd.append(tableName + ".");
			sqlEnd.append("FLAG_DEL != 1) AS PAGE_TABLE_ALIAS WHERE PAGE_ROW_NUMBER > "+(Integer.parseInt(startPage)-1)*25+" ORDER BY PAGE_ROW_NUMBER");
			sql = sqlStart.toString().substring(0, sqlStart.length() - 1) + sqlEnd.toString();
			return sql.toString();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}


	}


	/**
	 * 
	 * @Title: exportAllBySql 
	 * @Description: 拼接sql语句前端配置导出列组,和sheet表创建导出数据excel
	 * @createDate:2017年10月23日 下午3:01:54
	 * @modifyUser 修改人 :
	 * @modifyDate 修改时间 :
	 * @version V.x
	 * @param @param sql
	 * @param @param list
	 * @param @param clazzName
	 * @param @param sheet
	 * @param @param borderStyle    设定文件 
	 * @return void    返回类型 
	 * @throws
	 */
	@SuppressWarnings({ "deprecation", "rawtypes", "unchecked" })
	private void exportAllBySql(String sql, List<TempExportColumn> list, String clazzName, HSSFSheet sheet,HSSFCellStyle borderStyle) {
		try {
			Class clazz = Class.forName(clazzName);
			List users = exportTemplateService.exportAllBySql(sql, clazz);
			if (users.size() != 0) {
				int flag = 2;
				HSSFRow row = null;
				HSSFCell cell = null;
				for (Object endUser : users) {
					row = sheet.createRow(flag);
					for (int i = 0; i < list.size(); i++) {
						row.setHeight((short) Integer.parseInt(list.get(i).getColumnCellHeight()));
						cell = row.createCell(i);
						
						if(invokeGet(endUser, list.get(i).getFieldName())!=null){
							cell.setCellValue(invokeGet(endUser, list.get(i).getFieldName()) + "");
						}else{
							cell.setCellValue("");
						}
						
						borderStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
						borderStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
						borderStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
						borderStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
						borderStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
						cell.setCellStyle(borderStyle);


					}
					flag++;
				}
			} else {
				logger.info("系统没有为您查询到相关数据");
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 
	 * @Title: createSql 
	 * @Description: 导出数据sql 
	 * @createDate: 
	 * @modifyUser 修改人 : 
	 * @modifyDate 修改时间 : 
	 * @version V.x 
	 * @param @param list 
	 * @param @return 设定文件 
	 * @return String 返回类型 
	 * @throws
	 */
	@SuppressWarnings("rawtypes")
	private static String createAllSql(List<TempExportColumn> list, String clazzName) {


		String sql = "";
		StringBuilder sqlStart = new StringBuilder();
		StringBuilder sqlEnd = new StringBuilder();


		try {
			Class clazz = Class.forName(clazzName);
			String clazzNameTable = clazz.getSimpleName();
			String tableName = clazzNameTable.substring(0, 1).toLowerCase() + clazzNameTable.substring(1);
			tableName = StringUtil.transformPropertyToColumn(tableName);
			sqlStart.append("SELECT " + tableName + ".CODE AS CODE,");
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlStart.append("SYS_DICT_VALUE_"+columnName+".VALUE_NAME AS " + column.getFieldName().toUpperCase() + ",");
				}else{
				    sqlStart.append(tableName + "." + columnName + " AS " + column.getFieldName().toUpperCase() + ",");
				}
			}
			sqlEnd.append(" FROM ");
			sqlEnd.append(tableName);
			for (TempExportColumn column : list) {
				String columnName = StringUtil.transformPropertyToColumn(column.getFieldName());
				if(columnName.contains("DICT")){//--注意:此处为平台专属字典管理,没有的或者不同的请注意修改,遍历出导出对应字典编码对应的数据;例如:男女,                                                                                                //--数据库存值为:male/female 程序处理对应为 男/女
					sqlEnd.append(" LEFT JOIN SYS_DICT_VALUE AS SYS_DICT_VALUE_"+columnName+" ON SYS_DICT_VALUE_"+columnName+".VALUE = "+tableName+"."+columnName);
				}
			}
			sqlEnd.append(" WHERE ");
			sqlEnd.append(tableName + ".");
			sqlEnd.append("FLAG_DEL != 1 ORDER BY " + tableName + ".CREATE_DATE DESC");
			sql = sqlStart.toString().substring(0, sqlStart.length() - 1) + sqlEnd.toString();
			return sql.toString();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}


	}


	/**
	 * 
	 * @Title: getGetMethod 
         * @Description:
	 * 根据实体和列名创建该实体对象的get方法获取值 @createDate:2017年10月17日 下午2:15:33 @modifyUser 修改人
	 * : @modifyDate 修改时间 : @version V.x @param @param objectClass @param @param
	 * fieldName @param @return 设定文件 @return Method 返回类型 @throws
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static Method getGetMethod(Class objectClass, String fieldName) {


		StringBuffer sb = new StringBuffer();


		sb.append("get");


		sb.append(fieldName.substring(0, 1).toUpperCase());


		sb.append(fieldName.substring(1));


		try {


			return objectClass.getMethod(sb.toString());


		} catch (Exception e) {


		}


		return null;


	}


	/**
	 * 
	 * @Title: invokeGet @Description: 根据反射原理执行创建的get方法 @createDate:2017年10月17日
	 * 下午2:16:38 @modifyUser 修改人 : @modifyDate 修改时间 : @version V.x @param @param
	 * o @param @param fieldName @param @return 设定文件 @return Object 返回类型 @throws
	 */
	public static Object invokeGet(Object o, String fieldName) {


		Method method = getGetMethod(o.getClass(), fieldName);


		try {


			return method.invoke(o, new Object[0]);


		} catch (Exception e) {


			e.printStackTrace();


		}


		return null;


	}




}

service接口层:

package xxx.xxxx.xxxxxxxxxxxxxxxxxx.service.apptemplate.serviceinterface;

import java.util.List;

/** 
 * @Title: ExportTemplateService.java
 * @Package xxx.xxxx.xxxxxxxxxxxxxxxxxx.service.apptemplate.serviceinterface
 * @Description: 仅供导出使用
 * @author my
 * @createDate 2017年10月17日 上午10:04:37
 * @modifyUser 修改人 :
 * @modifyDate 修改时间 :
 * @version V.x
 */
public interface ExportTemplateService<T>  {
	
	/**
	 * 
	 * @Title: exportAllBySql 
	 * @Description: 根据生成的SQL语句导出所有该表的数据
	 * @createDate:2017年10月17日 上午10:08:35
	 * @modifyUser 修改人 :
	 * @modifyDate 修改时间 :
	 * @version V.x
	 * @param @param sql
	 * @param @return    设定文件 
	 * @return List<T>    返回类型 
	 * @throws
	 */
	public List<T> exportAllBySql(String sql, Class<T> resultType);

}


service实现类:

package xxx.xxxx.xxxxxxxxxxxxxxxxxx.apptemplate.serviceimpl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import xxx.xxxx.xxxxxxxxxxxxxxxxxx.dao.SqlMapper;
import xxx.xxxx.xxxxxxxxxxxxxxxxxx.apptemplate.serviceinterface.ExportTemplateService;

/** 
 * @Title: ExportTemplateServiceImpl.java
 * @Package xxx.xxxx.xxxxxxxxxxxxxxxxxx.apptemplate.serviceimpl
 * @Description: TODO(用一句话描述该文件做什么)
 * @author my
 * @createDate 2017年10月17日 上午10:10:10
 * @modifyUser 修改人 :
 * @modifyDate 修改时间 :
 * @version V.1
 */
@Service
@Transactional
public class ExportTemplateServiceImpl<T> implements ExportTemplateService<T>{
	
	@Autowired
	private SqlMapper sqlMapper;

	@Override
	public List<T> exportAllBySql(String sql, Class<T> resultType) {
		return sqlMapper.selectList(sql, resultType);
	}

}

SqlMapper工具:

package xxx.xxxx.xxxxxxxxxxxxxxxxxx.dao;

import org.apache.ibatis.builder.StaticSqlSource;
import org.apache.ibatis.exceptions.TooManyResultsException;
import org.apache.ibatis.mapping.*;
import org.apache.ibatis.scripting.LanguageDriver;
import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.SqlSessionTemplate;

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

/** 
 * @Title: SqlMapper.java
 * @Package xxx.xxxx.xxxxxxxxxxxxxxxxxx.dao
 * @Description: MyBatis执行sql工具,在写SQL的时候建议使用参数形式的可以是${}或#{}
 *               不建议将参数直接拼到字符串中,当大量这么使用的时候由于缓存MappedStatement而占用更多的内存
 * @author my
 * @createDate 2017年10月18日 下午1:32:48
 * @modifyUser 修改人 :
 * @modifyDate 修改时间 :
 * @version V.1
 */
public class SqlMapper {// 该工具类网上有源码,自己下载源码,我这里改动了许多
    private final MSUtils msUtils;
    //private final SqlSession sqlSession;
    private final SqlSessionTemplate sessionTemplate;

    /**
     * 构造方法,默认缓存MappedStatement
     *
     * @param sqlSession
     */
    public SqlMapper(SqlSessionTemplate sessionTemplate) {
        this.sessionTemplate = sessionTemplate;
        this.msUtils = new MSUtils(sessionTemplate.getConfiguration());
    }

    /**
     * 查询返回指定的结果类型
     *
     * @param sql        执行的sql
     * @param resultType 返回的结果类型
     * @param <T>        泛型类型
     * @return
     */
    public <T> List<T> selectList(String sql, Class<T> resultType) {
        String msId;
        if (resultType == null) {
            msId = msUtils.select(sql);
        } else {
            msId = msUtils.select(sql, resultType);
        }
        return sessionTemplate.selectList(msId);
    }
    
    private class MSUtils {
        private Configuration configuration;
        private LanguageDriver languageDriver;

        private MSUtils(Configuration configuration) {
            this.configuration = configuration;
            languageDriver = configuration.getDefaultScriptingLanuageInstance();
        }

        /**
         * 创建MSID
         *
         * @param sql 执行的sql
         * @param sql 执行的sqlCommandType
         * @return
         */
        private String newMsId(String sql, SqlCommandType sqlCommandType) {
            StringBuilder msIdBuilder = new StringBuilder(sqlCommandType.toString());
            msIdBuilder.append(".").append(sql.hashCode());
            return msIdBuilder.toString();
        }

        /**
         * 是否已经存在该ID
         *
         * @param msId
         * @return
         */
        private boolean hasMappedStatement(String msId) {
            return configuration.hasStatement(msId, false);
        }

        /**
         * 创建一个查询的MS
         *
         * @param msId
         * @param sqlSource  执行的sqlSource
         * @param resultType 返回的结果类型
         */
        @SuppressWarnings("serial")
		private void newSelectMappedStatement(String msId, SqlSource sqlSource, final Class<?> resultType) {
            MappedStatement ms = new MappedStatement.Builder(configuration, msId, sqlSource, SqlCommandType.SELECT)
                    .resultMaps(new ArrayList<ResultMap>() {
                        {
                            add(new ResultMap.Builder(configuration, "defaultResultMap", resultType, new ArrayList<ResultMapping>(0)).build());
                        }
                    })
                    .build();
            //缓存
            configuration.addMappedStatement(ms);
        }

        /**
         * 创建一个简单的MS
         *
         * @param msId
         * @param sqlSource      执行的sqlSource
         * @param sqlCommandType 执行的sqlCommandType
         */
        @SuppressWarnings("serial")
		private void newUpdateMappedStatement(String msId, SqlSource sqlSource, SqlCommandType sqlCommandType) {
            MappedStatement ms = new MappedStatement.Builder(configuration, msId, sqlSource, sqlCommandType)
                    .resultMaps(new ArrayList<ResultMap>() {
                        {
                            add(new ResultMap.Builder(configuration, "defaultResultMap", int.class, new ArrayList<ResultMapping>(0)).build());
                        }
                    })
                    .build();
            //缓存
            configuration.addMappedStatement(ms);
        }

        private String select(String sql) {
            String msId = newMsId(sql, SqlCommandType.SELECT);
            if (hasMappedStatement(msId)) {
                return msId;
            }
            StaticSqlSource sqlSource = new StaticSqlSource(configuration, sql);
            newSelectMappedStatement(msId, sqlSource, Map.class);
            return msId;
        }

        private String selectDynamic(String sql, Class<?> parameterType) {
            String msId = newMsId(sql + parameterType, SqlCommandType.SELECT);
            if (hasMappedStatement(msId)) {
                return msId;
            }
            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, parameterType);
            newSelectMappedStatement(msId, sqlSource, Map.class);
            return msId;
        }

        private String select(String sql, Class<?> resultType) {
            String msId = newMsId(resultType + sql, SqlCommandType.SELECT);
            if (hasMappedStatement(msId)) {
                return msId;
            }
            StaticSqlSource sqlSource = new StaticSqlSource(configuration, sql);
            newSelectMappedStatement(msId, sqlSource, resultType);
            return msId;
        }

        private String selectDynamic(String sql, Class<?> parameterType, Class<?> resultType) {
            String msId = newMsId(resultType + sql + parameterType, SqlCommandType.SELECT);
            if (hasMappedStatement(msId)) {
                return msId;
            }
            SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, parameterType);
            newSelectMappedStatement(msId, sqlSource, resultType);
            return msId;
        }
    }
}


注意:SqlMapper.java文件需要在数据源配置文件中进行配置,配置文件如下代码:

<!-- 执行sql插件 -->
  <bean id="sqlMapper" class="xxx.xxxx.xxxxxxxxxxxxxxxxxx.dao.SqlMapper" scope="prototype">
     <constructor-arg ref="sessionTemplate"/>
  </bean>



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值