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

本文介绍了一个使用Java实现的CSV文件读取及数据持久化的案例。该案例通过工厂模式创建单例,并采用模板方法模式处理CSV文件,实现了人员信息的数据解析与数据库插入功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 工厂:

Java代码    收藏代码
  1. /** 
  2.  * 创建各个 单例csvReader的工厂 
  3.  * @author wj 
  4.  * @date 2017-1-7 
  5.  * 
  6.  */  
  7. public class CsvReaderAndPersistFactory {  
  8.   
  9.      // 定义一个Map用于保存第一次创建对象时的实例  
  10.     private static final Map<String, Object> objectMap = Maps.newHashMap();  
  11.       
  12.     private CsvReaderAndPersistFactory(){}  
  13.    
  14.     @SuppressWarnings("rawtypes")  
  15.     public synchronized static <T extends CsvFileReaderAndPersist> T create(Class<T> c ,String type) throws Exception {  
  16.         CsvFileReaderAndPersist single = null;  
  17.         String className = null;  
  18.         className = c.getName();  
  19.         try {  
  20.             if (!objectMap.containsKey(className)) {  
  21.                 Class class1 = Class.forName(className);  
  22.                 // 获得有参构造  
  23.                 Constructor constructor = class1.getDeclaredConstructor(String.class);  
  24.                 // 设置有参构造是可访问的  
  25.                 constructor.setAccessible(true);  
  26.                 // 产生一个实例对象。  
  27.                 single = (CsvFileReaderAndPersist) constructor.newInstance(type);  
  28.                 objectMap.put(className, single);  
  29.             }  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.            throw e;  
  33.         }  
  34.         return (T) objectMap.get(className);  
  35.     }  
  36.       
  37. }  

 

模板方法下载

Java代码    收藏代码
  1. /** 
  2.  * 读csv  
  3.  * @author wj 
  4.  * @date 2017-1-1 
  5.  * 
  6.  */  
  7. public abstract class CsvFileReaderAndPersist<T> {  
  8.        
  9.     private static Logger logger = LoggerFactory.getLogger(CsvFileReaderAndPersist.class);  
  10.       
  11.       
  12.     protected String type;  
  13.       
  14.       
  15.       
  16.   
  17.     /** 
  18.      * @param fileName 
  19.      */  
  20.     public  void readCsvFileAndPersist(String fileName) {  
  21.         FileReader fileReader = null;  
  22.         CSVParser csvFileParser = null;  
  23.         //创建CSVFormat(header mapping)  
  24. //        CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER);  
  25.         CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(getHeader()).withSkipHeaderRecord(); //withSkipHeaderRecord 跳过第一行标题栏  
  26.         try {  
  27.             //初始化FileReader object  
  28.             fileReader = new FileReader(fileName);  
  29.             //初始化 CSVParser object  
  30.             csvFileParser = new CSVParser(fileReader, csvFileFormat);  
  31.             //CSV文件records  
  32.             List<CSVRecord> csvRecords = csvFileParser.getRecords();   
  33.             // CSV  
  34.               
  35.             dataPersist(csvRecords);  
  36.             logger.info("---------------------成功导入【"+type+"】 "+csvRecords.size()+" 条数据------------");  
  37.         }   
  38.         catch (Exception e) {  
  39.             e.printStackTrace();  
  40.             logger.error("导入出错:"+e.getMessage());  
  41.             return ;  
  42.         } finally {  
  43.             try {  
  44.                 fileReader.close();  
  45.                 csvFileParser.close();  
  46.             } catch (IOException e) {  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.     }  
  51.       
  52.       
  53.       
  54.     protected abstract String [] getHeader() ;  
  55.   
  56. //  protected abstract List<T> dataSetter( List<CSVRecord> records);  
  57.        
  58.     protected abstract void dataPersist(List<CSVRecord> records);  
  59.       
  60.    
  61.       
  62.     public String getVal(Map<String, Object> map, String param) {  
  63.         return map.get(param) == null ? null : map.get(param).toString();  
  64.     }  
  65. }  

 

单例 + 模板方法下载

 

Java代码    收藏代码
  1. /** 
  2.  * 人员 
  3.  * @author wj 
  4.  * 
  5.  */  
  6. public  class UserCsvFileReader extends CsvFileReaderAndPersist<Map<String,Object>> {  
  7.       
  8.     public static final String pwd = "jsxfdj123456";  
  9.       
  10.     private static Logger logger = LoggerFactory.getLogger(UserCsvFileReader.class);  
  11.       
  12.     private List<String> nullOrgids = Lists.newArrayList();  
  13.     private List<String> dupids = Lists.newArrayList();  
  14.       
  15.     //CSV文件头  
  16.     //"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"  
  17.   
  18.     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"  
  19. };  
  20.   
  21.     static JdbcTemplate jdbcTemplate = (JdbcTemplate) ContextUtil  
  22.             .getApplicationContext().getBean("jdbcTemplate");  
  23.       
  24.       
  25.       
  26.     private UserCsvFileReader(String type){  
  27.         super.type = type;  
  28.     }  
  29.       
  30.       
  31.       
  32.     @Override  
  33.     protected String[] getHeader() {  
  34.         return FILE_HEADER;  
  35.     }  
  36.        
  37.       
  38.   
  39.     @Override  
  40.     protected void dataPersist( List<CSVRecord> csvRecords) {  
  41.           
  42.           
  43.         String sql = "select * from JSXF_ORG_JCJ t ";  
  44.         final List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);  
  45.           
  46.         Map<String,String> lookup_nbid_orgid = Maps.newHashMapWithExpectedSize(list.size());  
  47.         Map<String,String> lookup_orgid_orgname = Maps.newHashMapWithExpectedSize(list.size());  
  48.         for (Map<String, Object> m : list) {  
  49.             String JGNBID = getVal(m, "JGNBID");  
  50.             String ORG_ID = getVal(m, "ORG_ID");  
  51.             String ORG_NAME = getVal(m, "ORG_NAME");  
  52.             lookup_nbid_orgid.put(JGNBID, ORG_ID);  
  53.             lookup_orgid_orgname.put(ORG_ID, ORG_NAME);  
  54.         }  
  55.           
  56.           
  57.         String SQL_CREAT_ALARM = Contants.sql_user;  
  58. //      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) "  
  59. //              + " VALUES(?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?  )";  
  60.   
  61.   
  62.         if(!CollectionUtils.isEmpty(csvRecords)){  
  63.             int count = 0;  
  64.             for(CSVRecord record : csvRecords){  
  65.                 /*   T_BASE_USER  所需要的所有字段   */  
  66.                   
  67.                   
  68.                 String  USERID   =record.get("YHZH"); // '用户id';  
  69.   
  70.                 String  USERNAME  =record.get("XM");// '用户名称';  
  71.                 if(StringUtils.isEmpty(USERNAME)){  
  72.                     //可以记录下个数  
  73.                     continue;  
  74.                 }  
  75.   
  76.                 String  SEX =record.get("XB");// '性别';  
  77.   
  78. //              String  PWD =record.get("ID");// '密码';       //没有找到密码字段  
  79.   
  80.                 String  EMAIL =record.get("YXZH");// 'EMAIL';  
  81.   
  82.                 String  PHONE =record.get("SJHM");// '联系电话';  
  83.   
  84.                 String  NATION =record.get("MZ");// '民族';  
  85.   
  86.                 String  POLITICAL=record.get("ZZMM");// '整治面貌';  
  87.   
  88.                 String  PHOTO =record.get("YHZPSMJ");// '照片';  
  89.   
  90.                 String  BIRTHDAY =  record.get("CSRQ");// '生日';  
  91.                 Date BIRTHDAY_date = DateUtils.parseDate(BIRTHDAY);  
  92.   
  93.                 String  JOINTIME=record.get("ADDTIME"); // '加入单位时间';  
  94.                 Date JOINTIME_date = DateUtils.parseDate(JOINTIME);  
  95.   
  96.                 String  COMPANYID =record.get("SSDW");// '所在单位ID';  
  97.   
  98.         下载        String  DEPARTMENT =record.get("BMBM");// '所在部门';  
  99.   
  100. //              String  ADDRESS =record.get("ID");// '家庭住址';   //没有对应字段  
  101.   
  102. //              String  LUTIME=record.get("ID"); // '最后登陆时间';     //没有对应字段  
  103.   
  104.                 String  LOCKED = record.get("SFZT");// '是否锁定';  
  105.   
  106.                 String  USER_TYPE =record.get("YHLB");// '用户类型(社区人员、单位人员、消防分管人员、管理员)';   // 他们:用户类别: ‘0’干部 ‘1’士官 ‘2’战士 ‘3’民警  
  107.   
  108. //              String  ROLE_ID =record.get("ID");// '角色ID';    //没有对应字段  
  109.   
  110.                 String  SORTID=record.get("RYXH"); // '排序';    //数值太大,无法转long  
  111.   
  112.                 String  CARD_ID =StringUtils.trim(record.get("JRSFZH"));// '身份证号';  
  113.   
  114.                 String  CREATETIME =record.get("CJSJ");// '创建时间';  
  115.                 Date CREATETIME_date = DateUtils.parseDate(CREATETIME);  
  116.                       
  117.   
  118.                 String  AREA_SELF=record.get("XZQH"); // '所属区域';  
  119.   
  120. //              String  IMSI =record.get("ID");// '手机端登录参数';   //没有对应字段  
  121.   
  122. //              String  ORG_ID =record.get("ID");// '中队id';      //没有对应字段  
  123.                 String  ORG_ID =getOrgId(lookup_nbid_orgid, record.get("SSJG"));// '中队id';      //可能为null,没有找到对应ORG_ID  
  124.   
  125.                 String  MENNU_ID =record.get("ZWID");// '职务';                
  126.                   
  127.                   
  128.                   
  129.                   
  130.                   
  131.                 String pwd = CryptoUtils.MD5().digestStr(UserCsvFileReader.pwd);  
  132.                 String role_id = getRoleId(lookup_orgid_orgname, ORG_ID);  
  133.                      
  134.                   
  135.                 try{  
  136.                     jdbcTemplate.update(SQL_CREAT_ALARM, USERID, USERNAME,  
  137.                             SEX,EMAIL,PHONE,NATION,POLITICAL,PHOTO,BIRTHDAY_date,JOINTIME_date,COMPANYID,  
  138.                             DEPARTMENT,Integer.valueOf(LOCKED),USER_TYPE,0,CARD_ID,CREATETIME_date,AREA_SELF,ORG_ID,MENNU_ID,pwd,role_id  
  139.                             );  
  140.                       
  141.                     count++;  
  142.                       
  143.                 }catch(org.springframework.dao.DuplicateKeyException e){ //如果冲突 继续插下面的  
  144.                     dupids.add(USERID);  
  145.                     count--;  
  146.                 }  
  147.                   
  148.                   
  149.                 }  
  150.             logger.info("【用户】 成功导入 "+count+" / "+csvRecords.size()+" 条数据,但是其中 SSJG为:["+StringUtils.join(nullOrgids, ",") +"] 在系统中没有对应orgId,同时对应角色也为null。其中重复用户ID: ["+ StringUtils.join(dupids, ",")+" ]");  
  151.               
  152.             }  
  153.               
  154.               
  155.         }  
  156.           
  157.    
  158.     private String getOrgId(Map<String,String> map, String nbid){  
  159.           
  160.         String orgId = map.get(nbid);  
  161.         if( orgId== null){  
  162.             nullOrgids.add(nbid);  
  163.         }  
  164.         return orgId;  
  165.           
  166.     }  
  167.       
  168.     //copy from SynTest.java  line:631  
  169.     private String getRoleId(Map<String,String> map, String orgid){  
  170.           
  171.         if(orgid ==null){  
  172.             return null;  
  173.         }  
  174.           
  175.         String org_name = map.get(orgid);  
  176.         String role_id = "manage";// 默认给支队权限  
  177.         if (org_name.contains("中队")) {  
  178.             role_id = "comm";  
  179.         } else if (org_name.contains("大队")) {  
  180.             role_id = "manageBrigade";  
  181.         } else if (org_name.contains("总队")) {  
  182.             role_id = "manageCorps";  
  183.         }  
  184.         return role_id;  
  185.   
  186.           
  187.     }  
  188.       
  189.       
  190.     /** 
  191.      * @param args 
  192.      * @throws Exception  
  193.      */  
  194.     public static void main(String[] args) throws Exception{  
  195.     //   new OrgCsvFileReader("机构信息").readCsvFileAndPersist(Contants.ORG_DATA_PATH);  
  196. //       new UserCsvFileReader("用户信息").readCsvFileAndPersist(Contants.USER_DATA_PATH);  
  197.           
  198.          CsvFileReaderAndPersist user = CsvReaderAndPersistFactory.create(UserCsvFileReader.class,"用户信息");  
  199.          user.readCsvFileAndPersist(Contants.USER_DATA_PATH);  
  200.     }  
  201.       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值