檔案採集到mysql_上傳檔案實現資料採集以及批量匯入資料庫例項
技術標籤:檔案採集到mysql
因為專案要求,需要讀取本地檔案,實現資料採集,然後批量匯入資料庫。
友情提示:下面程式碼中關於資料庫的操作的程式碼有的是封裝好的,比如save()方法,findBatchNum()方法並沒有在本篇部落格中貼出來,但是方法的作用會以註釋形式宣告。
資料採集(bean)
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class User {
private String name;
private String address;
private String phone;
private String company;
private Integer idCard;
private Integer blood;
private Long id;
public static User parse(String str){
User u = new User();
String[] s = str.split("\\|");
u.setName(s[0].equals("未採集")?"":s[0]);
u.setAddress(s[1].equals("未採集")?"":s[1]);
u.setPhone(s[2].equals("未採集")?"":s[2]);
u.setCompany(s[3].equals("未採集")?"":s[3]);
u.setIdCard(s[4].equals("未採集")?0:Integer.parseInt(s[4]));
u.setBlood(s[5].equals("未採集")?0:Integer.parseInt(s[5]));
return u ;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public Integer getIdCard() {
return idCard;
}
public void setIdCard(Integer idCard) {
this.idCard = idCard;
}
public Integer getBlood() {
return blood;
}
public void setBlood(Integer blood) {
this.blood = blood;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "name"+name+"address"+address+"phone"+phone+"company"+company+"idCard"+idCard+"blood"+blood;
}
//測試
public static void main(String[] args) throws IOException {
File file = new File("C:/test/23333.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(isr);
String b=null;
while((b=br.readLine())!=null){
System.out.println(User.parse(b).toString());
}
br.close();
}
}
記錄資料匯入相關資訊(bean)
import java.util.Date;
public class ImportRecord {
/**
* 批次號(無後綴檔名稱)
*/
private String batchNum;
/**
* 每次匯入的總記錄數
*/
private int totalRecord;
/**
* 匯入失敗為0 ,匯入成功為1
*/
private int status;
/**
* 匯入時間
*/
private Date createTime;
/**
* 匯入完成時間
*/
private Date finishTime;
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getBatchNum() {
return batchNum;
}
public void setBatchNum(String batchNum) {
this.batchNum = batchNum;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getFinishTime() {
return finishTime;
}
public void setFinishTime(Date finishTime) {
this.finishTime = finishTime;
}
}
檔案上傳以及資料的匯入(UserService.java)
public void batchSave(MultipartFile dataFile,HttpServletRequest request){
BufferedReader br=null;
InputStreamReader isr=null;
FileInputStream fis=null;
try {
CommonsMultipartFile cf = (CommonsMultipartFile) dataFile;
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest) request;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File file = fi.getStoreLocation();
fis = new FileInputStream(file);
isr = new InputStreamReader(fis, "UTF-8");
br = new BufferedReader(isr);
String b= null;
List u=new ArrayList();//把每一天記錄儲存到集合中,以便批量儲存到資料庫中
while ((b= br.readLine()) != null) {
User user = User.parse(b);
u.add(user);
}
//logger.info("讀取條數:"+u.size());
Iterator iter = multiRequest.getFileNames();
MultipartFile f = multiRequest.getFile(iter.next());
String fileName = f.getOriginalFilename();
String userName= fileName.substring(0,fileName.lastIndexOf(".")); //獲取無後綴檔名稱
//以檔名作為條件從資料庫查詢
ImportRecord importRecord = importRecordService.findBatchNum(userName);
if (importRecord != null) {//如果結果不為空,則不能匯入,防止重複匯入
throw new RuntimeException();
}else{
ImportRecord record=new ImportRecord();
record.setBatchNum(batchNum);
record.setTotalRecord(customers.size());
record.setStatus(0);//沒匯入之前的狀態為0
record.setCreateTime(new Date()); //匯入開始時間
//批量匯入
dao.batchSaveCustomer(customers);
record.setFinishTime(new Date()); //匯入結束時間
record.setStatue(1);//匯入成功的狀態為1
importRecordService.save(record);//儲存到資料庫中
}
} catch (IOException e) {
e.printStackTrace();
} finally{
try{
if(br!=null)br.close();
if(isr!=null)isr.close();
if(fis!=null)fis.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
把資料批量匯入到資料庫中(UserDao.java)
public void batchSaveUser(List list) {
Session session = getSession().getSessionFactory().openSession();
session.beginTransaction().begin();
for (int i = 0; i < list.size(); i++) {
getSession().save(list.get(i));
// 批插入的物件立即寫入資料庫並釋放記憶體
if (i % 50 == 0 || i == list.size()-1) {
session.flush();
session.clear();
}
}
session.getTransaction().commit(); // 提交事物
session.close();
}
controller層
@RequestMapping
public String add(@RequestParam("dataFile")MultipartFile dataFile,HttpServletRequest request,Model model){
try{
customerService.batchSave(dataFile,request);
}catch(RuntimeException e){
model.addAttribute("remind", "批次已存在");
e.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
return "user/user-list";
}
頁面(jsp)
function handler1(tp){
if(tp=='ok'){
$("#form1").submit();
}
}
- 測試管理
- >
- 匯入
檔案: | ${remind} |