`

工厂、单例、模板 一次结合使用

    博客分类:
  • java
 
阅读更多

 工厂:

/**
 * 创建各个 单例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、以及持久化

 

0
0
分享到:
评论

相关推荐

    设计模式总结-模板设计模式,单例模式(singleTon)

    ### 设计模式总结:模板设计模式与单例模式 #### 模板设计模式 模板设计模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类为算法的某些步骤提供具体的实现。通过这种方式,算法的基本流程保持不变,...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    例如,一个Web应用可能采用MVC模式组织结构,使用单例模式管理数据库连接,同时通过工厂模式创建不同类型的业务对象,而代理模式可以用来添加事务处理等额外功能。通过学习和熟练掌握这些设计模式,开发者能够更好地...

    简单工厂,单例源码

    在这个例子中,`getInstance()`方法确保了线程安全的单例创建,第一次检查避免了不必要的同步,第二次检查保证了只有一个实例被创建。 结合J2EE7_DesignPattern这个文件名,我们可以推测这可能是一个关于J2EE 7版本...

    C++实现一个线程安全的单例工厂实现代码

    总的来说,这个C++线程安全的单例工厂通过结合C++的模板、智能指针`std::auto_ptr`(虽然在C++11之后推荐使用`std::unique_ptr`)以及Windows API的`CRITICAL_SECTION`,实现了在多线程环境下安全地创建和管理单例...

    开发模式:单例和工厂开发模式视频与代码

    本文将详细探讨两种重要的设计模式:单例模式和工厂模式,并结合视频教程与代码示例,帮助读者深入理解这两种模式的实现原理和应用场景。 首先,我们来探讨单例模式。单例模式是一种确保一个类只有一个实例并提供...

    设计模式实战代码-单例、简单工厂、策略、观察者、责任链、模板模式

    在这个压缩包中,模板模式与策略模式结合使用,利用工厂辅助实现,增加了模式的灵活性。 这六个设计模式都是面向对象设计的核心组成部分,它们提供了设计良好、可扩展和可维护的软件的基础。理解并熟练应用这些模式...

    多种设计模式(单例,享元,工厂,策略,模板)和多种数据结构(array,List,dictionary,queue)混合使用的数据结构期末项目.

    例如,他们可能用单例模式管理全局资源,用工厂模式创建不同类型的对象,用策略模式处理不同场景下的算法选择,用模板方法模式定义一个通用的处理流程,并用数据结构(如List和Dictionary)来组织和操作数据。...

    浅析Java设计模式编程中的单例模式和简单工厂模式

    在Java编程中,设计模式是一种解决常见问题的模板,它为软件开发提供了可重用的解决方案。本篇文章将深入探讨两种常见的设计模式:单例模式和简单工厂模式。 首先,单例模式是一种限制类实例化的模式,确保在整个...

    Java设计模式(单例+工厂+策略模式)

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的模板或最佳实践。本主题将深入探讨三种关键的设计模式:单例模式、工厂模式和策略模式。 **单例模式** 是一种创建型设计模式,保证一个类...

    设计模式中抽象工厂模式的一个例子

    或者使用单例模式来确保一个特定平台的工厂在程序中只存在一个实例。 总之,抽象工厂模式是一种强大的工具,它帮助我们在设计时保持灵活性和可扩展性,特别是在处理跨平台或多组件系统时。通过理解并正确应用这一...

    c++模板元编程

    Loki库包含了许多实用的组件,如SmartPtr(智能指针)、Singleton(单例模式)、Factory(工厂模式)等,这些组件都是基于模板元编程实现的。Loki的作者Andrei Alexandrescu通过这个库展示了如何优雅地使用模板元...

    java设计模式之禅

    1. **懒汉式** (线程不安全): 在第一次被调用时创建单例对象。 2. **饿汉式**: 无论是否需要都会立即加载单例对象。 3. **双重检查锁定**: 结合了懒汉式和饿汉式的优点,线程安全,同时避免了不必要的同步。 ### 四...

    Head First 设计模式 (四) 工厂模式(factory pattern) C++实现

    工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时...在实际项目中,工厂模式经常与其他设计模式结合使用,如策略模式、单例模式等,以解决更复杂的问题。

    C#采用桥接装饰模式工厂模式单实例模式实现绘图

    本话题主要探讨了如何在C#中结合桥接、装饰、工厂和单例这四种设计模式来实现一个绘图软件。这些模式的应用使得软件具有更高的灵活性、可扩展性和可维护性。 1. **桥接模式**(Bridge Pattern): 桥接模式的核心...

    java web开发所需的各种设计模板

    Hibernate支持HQL(Hibernate Query Language),提供了一种面向对象的查询方式,而MyBatis则允许开发者编写更灵活的SQL,结合XML或注解定义映射规则。 总的来说,设计模板在Java Web开发中起着举足轻重的作用,...

    工厂模式之计算机程序

    在实际项目中,工厂模式常常与其他设计模式结合使用,如策略模式(将每种运算类型视为一个策略)、单例模式(确保计算器工厂类只有一个实例)等,以提高代码的可维护性和可扩展性。这个“工厂模式之计算器”项目提供...

    水果工厂代码

    总结来说,“水果工厂代码”项目巧妙地结合了工场模式和单例模式,展现了C++在面向对象设计中的灵活性和可扩展性。这不仅是一个学习和实践设计模式的好例子,也是提升软件质量、降低维护成本的有效手段。对于初学者...

    抽线工厂的Java实现

    在这个主题中,我们将深入探讨如何使用Java来实现抽象工厂模式,并结合单例模式以及IoC(控制反转)或DI(依赖注入)原则。 首先,让我们理解抽象工厂模式的基本概念。抽象工厂模式定义了一个创建一系列相关或相互...

    工厂模式、接口、抽象类的例子

    结合描述中提到的“集合了单例模式”,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于控制资源的共享,如数据库连接或线程池。单例模式通常配合静态内部类或枚举来实现线程安全的单例,以...

    loki库模板元编程的经典库

    Loki库是C++ TMP的一个经典实践,它包含了一系列精心设计的类模板和函数模板,用于解决诸如智能指针、工厂模式、单例模式、类型信息、安全指针、容器和安全运算符等常见问题。 Loki库中的主要组件包括: 1. **...

Global site tag (gtag.js) - Google Analytics