App版本升级案例
一.准备材料:
日期,用户名,app名,下载渠道,所在城市,app版本
2017-08-15,刘帅老师,陌陌,app store,上海,v2.9
2017-08-15,刘帅老师,脉脉,app store,上海,v2.3
2017-08-15,刘帅老师,陌陌,app store,上海,v2.6
2017-08-15,刘帅老师,陌陌,app store,上海,v2.7
2017-08-15,刘帅老师,脉脉,app store,北京,v2.3
2017-08-16,刘帅老师,陌陌,app store,东京,v2.8
2017-08-14,涛哥,共享女友,360应用,北京,v2.0
2017-08-15,辉哥,共享女友,安智市场,北京,v1.2
2017-08-15,辉哥,共享女友,安智市场,北京,v1.5
2017-08-15,涛哥,共享女友,360应用,北京,v1.0
2017-08-15,涛哥,共享女友,360应用,北京,v2.1
2017-08-14,涛哥,共享女友,360应用,北京,v1.0
2017-08-14,辉哥,共享女友,安智市场,北京,v1.2
2017-08-14,涛哥,共享女友,360应用,天津,v1.2
2017-08-14,涛哥,共享女友,小米应用,天津,v2.0
2016-08-14,刘帅老师,美拍,app store,上海,v1.8
2016-08-14,刘帅老师,美拍,app store,上海,v1.2
2016-08-14,刘帅老师,美拍,安智市场,上海,v1.2
二.代码实现:
package app_demo;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class ReadApp {
public static void main(String[] args) throws Exception {
sendDataToMysql();
System.out.println("数据上传到Mysql成功 ...");
}
/** 使用Peoperties类来加载路径,增强代码的复用性 */
static String srcPath;
static {
try {
Properties p = new Properties();
p.load(ReadApp.class.getClassLoader().getResourceAsStream("db.properties"));
srcPath = p.getProperty("srcPath");
} catch (Exception e) {
e.printStackTrace();
}
}
/** 上传数据到Mysql */
public static void sendDataToMysql() throws SQLException {
List<AppBean> list = getAppBeanList();
// 将数据上传到数据库
ComboPooledDataSource dataSource = new ComboPooledDataSource();
QueryRunner runner = new QueryRunner(dataSource);
// 用二维数组缓存要发送的数据
String sql = "insert into app values(?,?,?,?,?,?)";
Object[][] params = new Object[list.size()][];
for (int i = 0; i < list.size(); i++) {
AppBean bean = list.get(i);
params[i] = new Object[] { bean.getDate(), bean.getUserName(), bean.getAppName(), bean.getSource(),
bean.getMinVersion(), bean.getMaxVersion() };
}
// 批量上传到Mysql
runner.batch(sql, params);
}
/** 获取排好序的List<AppBean> */
public static List<AppBean> getAppBeanList() {
Map<String, Set<String>> map = getAppVersion(srcPath);
List<AppBean> resLsit = new ArrayList<>();
/** 排序 */
Set<Entry<String, Set<String>>> entrySet = map.entrySet();
for (Entry<String, Set<String>> entry : entrySet) {
String key = entry.getKey();
Set<String> value = entry.getValue();
if (value.size() > 1) {//版本数量有两个及以上才排序
List<String> list = new ArrayList<>(value);
//降序排列
Collections.sort(list, (o1, o2) -> o2.compareTo(o1));
// 封装数据
String[] split = key.split(",");
String date = split[0];
String userName = split[1];
String appName = split[2];
String source = split[3];
String maxVersion = list.get(0);
String minVersion = list.get(list.size() - 1);
AppBean bean = new AppBean(date, userName, appName, source, minVersion, maxVersion);
resLsit.add(bean);
}
}
return resLsit;
}
/** 获取appVresion,Set可以自动去重 */
public static Map<String, Set<String>> getAppVersion(String srcPath) {
Map<String, Set<String>> map = new HashMap<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(srcPath), "UTF-8"));) {
br.readLine();// 过滤第一条数据
String line;
while ((line = br.readLine()) != null) {
// 获取字段,拼接字符串,并将其视为 key
String[] fields = line.split(",");
String date = fields[0];
String userName = fields[1];
String appName = fields[2];
String source = fields[3];
String appVersion = fields[5];
String key = date + "," + userName + "," + appName + "," + source;
Set<String> set = map.getOrDefault(key, new HashSet<>());
set.add(appVersion);
map.put(key, set);
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}