工厂:
/** * 创建各个 单例csvReader的工厂 * @author wj * @date 2017-1-7 * */ public class CsvReaderAndPersistFactory { // 定义一个Map用于保存第一次创建对象时的实例 private static final Map<String, Object> objectMap = Maps.newHashMap(); private CsvReaderAndPersistFactory(){} @SuppressWarnings("rawtypes") public synchronized static <T extends CsvFileReaderAndPersist> T create(Class<T> c ,String type) throws Exception { CsvFileReaderAndPersist single = null; String className = null; className = c.getName(); try { if (!objectMap.containsKey(className)) { Class class1 = Class.forName(className); // 获得有参构造 Constructor constructor = class1.getDeclaredConstructor(String.class); // 设置有参构造是可访问的 constructor.setAccessible(true); // 产生一个实例对象。 single = (CsvFileReaderAndPersist) constructor.newInstance(type); objectMap.put(className, single); } } catch (Exception e) { e.printStackTrace(); throw e; } return (T) objectMap.get(className); } }
模板方法:
/** * 读csv * @author wj * @date 2017-1-1 * */ public abstract class CsvFileReaderAndPersist<T> { private static Logger logger = LoggerFactory.getLogger(CsvFileReaderAndPersist.class); protected String type; /** * @param fileName */ public void readCsvFileAndPersist(String fileName) { FileReader fileReader = null; CSVParser csvFileParser = null; //创建CSVFormat(header mapping) // CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER); CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(getHeader()).withSkipHeaderRecord(); //withSkipHeaderRecord 跳过第一行标题栏 try { //初始化FileReader object fileReader = new FileReader(fileName); //初始化 CSVParser object csvFileParser = new CSVParser(fileReader, csvFileFormat); //CSV文件records List<CSVRecord> csvRecords = csvFileParser.getRecords(); // CSV dataPersist(csvRecords); logger.info("---------------------成功导入【"+type+"】 "+csvRecords.size()+" 条数据------------"); } catch (Exception e) { e.printStackTrace(); logger.error("导入出错:"+e.getMessage()); return ; } finally { try { fileReader.close(); csvFileParser.close(); } catch (IOException e) { e.printStackTrace(); } } } protected abstract String [] getHeader() ; // protected abstract List<T> dataSetter( List<CSVRecord> records); protected abstract void dataPersist(List<CSVRecord> records); public String getVal(Map<String, Object> map, String param) { return map.get(param) == null ? null : map.get(param).toString(); } }
单例 + 模板方法:
/** * 人员 * @author wj * */ public class UserCsvFileReader extends CsvFileReaderAndPersist<Map<String,Object>> { public static final String pwd = "jsxfdj123456"; private static Logger logger = LoggerFactory.getLogger(UserCsvFileReader.class); private List<String> nullOrgids = Lists.newArrayList(); private List<String> dupids = Lists.newArrayList(); //CSV文件头 //"ID","JGMC","JGJC","JGNBID","JGLB","JGDM","XZQHDM","JGDZ","YZBM","LXDH","CZHM","LXR","QTSJBM","SSXFJGDM","JGLX","JGXZDM","JGTREE","QZ","SSYM","GIS_X","GIS_Y","GIS_H","XQGLID","GLID","JGMS","JLZT","SJC","BZ","SJBB","CJSJ","BJSJ","YWXTBSID","YWQH","JGCXZT","JGCXSJ","BYZD1","BYZD2","BYZD3","BYZD4","BYZD5","BYZD6","BYZD7","BYZD8","BYZD9","BYZD10","ZP" protected static final String [] FILE_HEADER = {"ID","YHBH","XM","YHZH","BGXTZH","RYXH","YHLB","YHJBID","ZZMM","MZ","CSRQ","XB","JZID","JXID","ZWID","GWID","SSJG","SSDW","ZGDW","BMBM","YHZT","JZJDJG","JZJDDW","GWQY","SFZT","ZZDH","JTDH","SJHM","YXZH","XNH","YJFJDX","YHQZ","RZFS","JGZSMJ","YHZPSMJ","YHLCZT","SXRQ","SHXSJ","GZFW","JGZQFRQ","JGZID","JRSFZH","BBDJ","XBB","ADDACC","ADDACCNAME","ADDTIME","ADDIP","CHGACC","CHGACCNAME","CHGTIME","CHGIP","DELETED","LSJGID","YJXSBJ","TXLXSBJ","DXFSBJ","FLAG0","FLAG1","SFZW","QJID","QJLX","WJDX","RYZT","SJBB","CJSJ","BJSJ","YWXTBSID","ZHID","SIGNATUREFLAG","XZQH" }; static JdbcTemplate jdbcTemplate = (JdbcTemplate) ContextUtil .getApplicationContext().getBean("jdbcTemplate"); private UserCsvFileReader(String type){ super.type = type; } @Override protected String[] getHeader() { return FILE_HEADER; } @Override protected void dataPersist( List<CSVRecord> csvRecords) { String sql = "select * from JSXF_ORG_JCJ t "; final List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); Map<String,String> lookup_nbid_orgid = Maps.newHashMapWithExpectedSize(list.size()); Map<String,String> lookup_orgid_orgname = Maps.newHashMapWithExpectedSize(list.size()); for (Map<String, Object> m : list) { String JGNBID = getVal(m, "JGNBID"); String ORG_ID = getVal(m, "ORG_ID"); String ORG_NAME = getVal(m, "ORG_NAME"); lookup_nbid_orgid.put(JGNBID, ORG_ID); lookup_orgid_orgname.put(ORG_ID, ORG_NAME); } String SQL_CREAT_ALARM = Contants.sql_user; // String SQL_CREAT_ALARM = " INSERT INTO JSXF_ORG_JCJ2(ORG_ID,JGMC,ORG_NAME,JGNBID,JGDM,JGDZ,YZBM,LXDH,CZHM,LXR,JGXZDM,JGTREE,JGMS,ORG_LONGITUDE,ORG_DIMENSION,GIS_H,GLID,XQGLID,SSYM,ZP,BZ,JGCXZT,YWXTBSID,ORG_CREATE_TIME,SJBB,JGCXSJ) " // + " VALUES(?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?, ?,?,?,? )"; if(!CollectionUtils.isEmpty(csvRecords)){ int count = 0; for(CSVRecord record : csvRecords){ /* T_BASE_USER 所需要的所有字段 */ String USERID =record.get("YHZH"); // '用户id'; String USERNAME =record.get("XM");// '用户名称'; if(StringUtils.isEmpty(USERNAME)){ //可以记录下个数 continue; } String SEX =record.get("XB");// '性别'; // String PWD =record.get("ID");// '密码'; //没有找到密码字段 String EMAIL =record.get("YXZH");// 'EMAIL'; String PHONE =record.get("SJHM");// '联系电话'; String NATION =record.get("MZ");// '民族'; String POLITICAL=record.get("ZZMM");// '整治面貌'; String PHOTO =record.get("YHZPSMJ");// '照片'; String BIRTHDAY = record.get("CSRQ");// '生日'; Date BIRTHDAY_date = DateUtils.parseDate(BIRTHDAY); String JOINTIME=record.get("ADDTIME"); // '加入单位时间'; Date JOINTIME_date = DateUtils.parseDate(JOINTIME); String COMPANYID =record.get("SSDW");// '所在单位ID'; String DEPARTMENT =record.get("BMBM");// '所在部门'; // String ADDRESS =record.get("ID");// '家庭住址'; //没有对应字段 // String LUTIME=record.get("ID"); // '最后登陆时间'; //没有对应字段 String LOCKED = record.get("SFZT");// '是否锁定'; String USER_TYPE =record.get("YHLB");// '用户类型(社区人员、单位人员、消防分管人员、管理员)'; // 他们:用户类别: ‘0’干部 ‘1’士官 ‘2’战士 ‘3’民警 // String ROLE_ID =record.get("ID");// '角色ID'; //没有对应字段 String SORTID=record.get("RYXH"); // '排序'; //数值太大,无法转long String CARD_ID =StringUtils.trim(record.get("JRSFZH"));// '身份证号'; String CREATETIME =record.get("CJSJ");// '创建时间'; Date CREATETIME_date = DateUtils.parseDate(CREATETIME); String AREA_SELF=record.get("XZQH"); // '所属区域'; // String IMSI =record.get("ID");// '手机端登录参数'; //没有对应字段 // String ORG_ID =record.get("ID");// '中队id'; //没有对应字段 String ORG_ID =getOrgId(lookup_nbid_orgid, record.get("SSJG"));// '中队id'; //可能为null,没有找到对应ORG_ID String MENNU_ID =record.get("ZWID");// '职务'; String pwd = CryptoUtils.MD5().digestStr(UserCsvFileReader.pwd); String role_id = getRoleId(lookup_orgid_orgname, ORG_ID); try{ jdbcTemplate.update(SQL_CREAT_ALARM, USERID, USERNAME, SEX,EMAIL,PHONE,NATION,POLITICAL,PHOTO,BIRTHDAY_date,JOINTIME_date,COMPANYID, DEPARTMENT,Integer.valueOf(LOCKED),USER_TYPE,0,CARD_ID,CREATETIME_date,AREA_SELF,ORG_ID,MENNU_ID,pwd,role_id ); count++; }catch(org.springframework.dao.DuplicateKeyException e){ //如果冲突 继续插下面的 dupids.add(USERID); count--; } } logger.info("【用户】 成功导入 "+count+" / "+csvRecords.size()+" 条数据,但是其中 SSJG为:["+StringUtils.join(nullOrgids, ",") +"] 在系统中没有对应orgId,同时对应角色也为null。其中重复用户ID: ["+ StringUtils.join(dupids, ",")+" ]"); } } private String getOrgId(Map<String,String> map, String nbid){ String orgId = map.get(nbid); if( orgId== null){ nullOrgids.add(nbid); } return orgId; } //copy from SynTest.java line:631 private String getRoleId(Map<String,String> map, String orgid){ if(orgid ==null){ return null; } String org_name = map.get(orgid); String role_id = "manage";// 默认给支队权限 if (org_name.contains("中队")) { role_id = "comm"; } else if (org_name.contains("大队")) { role_id = "manageBrigade"; } else if (org_name.contains("总队")) { role_id = "manageCorps"; } return role_id; } /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception{ // new OrgCsvFileReader("机构信息").readCsvFileAndPersist(Contants.ORG_DATA_PATH); // new UserCsvFileReader("用户信息").readCsvFileAndPersist(Contants.USER_DATA_PATH); CsvFileReaderAndPersist user = CsvReaderAndPersistFactory.create(UserCsvFileReader.class,"用户信息"); user.readCsvFileAndPersist(Contants.USER_DATA_PATH); } }
结合起来,功能:不同类型数据的读取CSV、以及持久化
相关推荐
### 设计模式总结:模板设计模式与单例模式 #### 模板设计模式 模板设计模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类为算法的某些步骤提供具体的实现。通过这种方式,算法的基本流程保持不变,...
例如,一个Web应用可能采用MVC模式组织结构,使用单例模式管理数据库连接,同时通过工厂模式创建不同类型的业务对象,而代理模式可以用来添加事务处理等额外功能。通过学习和熟练掌握这些设计模式,开发者能够更好地...
在这个例子中,`getInstance()`方法确保了线程安全的单例创建,第一次检查避免了不必要的同步,第二次检查保证了只有一个实例被创建。 结合J2EE7_DesignPattern这个文件名,我们可以推测这可能是一个关于J2EE 7版本...
总的来说,这个C++线程安全的单例工厂通过结合C++的模板、智能指针`std::auto_ptr`(虽然在C++11之后推荐使用`std::unique_ptr`)以及Windows API的`CRITICAL_SECTION`,实现了在多线程环境下安全地创建和管理单例...
单例模式和工厂模式常常结合使用。例如,在某些系统中,为了全局管理某个服务或者资源,可以使用单例模式创建该服务的实例,而工厂模式则用来根据不同的条件创建不同类型的单例实例。这样既保证了对象的唯一性,又...
在这个压缩包中,模板模式与策略模式结合使用,利用工厂辅助实现,增加了模式的灵活性。 这六个设计模式都是面向对象设计的核心组成部分,它们提供了设计良好、可扩展和可维护的软件的基础。理解并熟练应用这些模式...
例如,他们可能用单例模式管理全局资源,用工厂模式创建不同类型的对象,用策略模式处理不同场景下的算法选择,用模板方法模式定义一个通用的处理流程,并用数据结构(如List和Dictionary)来组织和操作数据。...
在Java编程中,设计模式是一种解决常见问题的模板,它为软件开发提供了可重用的解决方案。本篇文章将深入探讨两种常见的设计模式:单例模式和简单工厂模式。 首先,单例模式是一种限制类实例化的模式,确保在整个...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。本主题将深入探讨三种关键的设计模式:单例模式、工厂模式和策略模式。 **单例模式** 是一种创建型设计模式,保证一个类...
或者使用单例模式来确保一个特定平台的工厂在程序中只存在一个实例。 总之,抽象工厂模式是一种强大的工具,它帮助我们在设计时保持灵活性和可扩展性,特别是在处理跨平台或多组件系统时。通过理解并正确应用这一...
Loki库包含了许多实用的组件,如SmartPtr(智能指针)、Singleton(单例模式)、Factory(工厂模式)等,这些组件都是基于模板元编程实现的。Loki的作者Andrei Alexandrescu通过这个库展示了如何优雅地使用模板元...
1. **懒汉式** (线程不安全): 在第一次被调用时创建单例对象。 2. **饿汉式**: 无论是否需要都会立即加载单例对象。 3. **双重检查锁定**: 结合了懒汉式和饿汉式的优点,线程安全,同时避免了不必要的同步。 ### 四...
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时...在实际项目中,工厂模式经常与其他设计模式结合使用,如策略模式、单例模式等,以解决更复杂的问题。
本话题主要探讨了如何在C#中结合桥接、装饰、工厂和单例这四种设计模式来实现一个绘图软件。这些模式的应用使得软件具有更高的灵活性、可扩展性和可维护性。 1. **桥接模式**(Bridge Pattern): 桥接模式的核心...
Hibernate支持HQL(Hibernate Query Language),提供了一种面向对象的查询方式,而MyBatis则允许开发者编写更灵活的SQL,结合XML或注解定义映射规则。 总的来说,设计模板在Java Web开发中起着举足轻重的作用,...
在实际项目中,工厂模式常常与其他设计模式结合使用,如策略模式(将每种运算类型视为一个策略)、单例模式(确保计算器工厂类只有一个实例)等,以提高代码的可维护性和可扩展性。这个“工厂模式之计算器”项目提供...
总结来说,“水果工厂代码”项目巧妙地结合了工场模式和单例模式,展现了C++在面向对象设计中的灵活性和可扩展性。这不仅是一个学习和实践设计模式的好例子,也是提升软件质量、降低维护成本的有效手段。对于初学者...
在这个主题中,我们将深入探讨如何使用Java来实现抽象工厂模式,并结合单例模式以及IoC(控制反转)或DI(依赖注入)原则。 首先,让我们理解抽象工厂模式的基本概念。抽象工厂模式定义了一个创建一系列相关或相互...
结合描述中提到的“集合了单例模式”,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制资源的共享,如数据库连接或线程池。单例模式通常配合静态内部类或枚举来实现线程安全的单例,以...
Loki库是C++ TMP的一个经典实践,它包含了一系列精心设计的类模板和函数模板,用于解决诸如智能指针、工厂模式、单例模式、类型信息、安全指针、容器和安全运算符等常见问题。 Loki库中的主要组件包括: 1. **...