虛幻4重製《古墓麗影2》Demo1.2版 新增照片模式等
阿新 • • 發佈:2021-02-08
技術標籤:Java基礎javamybatis資料庫xmlspring boot
使用mybatis實現批量插入檔案路徑和時間等
1.基礎資料庫插入語句:
insert into table ([列名],[列名]) values ([列值],[列值]));
或:
insert into table values ([列值],[列值]));
mybatis中mapper.xml的寫法:
<--(id, date, pathname)分別是列名。-->
<insert id="insert">
insert into table(id, date, pathname)
values (#{id,jdbcType=INTEGER}, #{date,jdbcType=DATE}, # {pathname,jdbcType=VARCHAR})
</insert>
但插入多條語句時需要使用 foreach語句,首先來溫習一下foreach標籤的基本語法,和引數。
<foreach collection="**" item="*" index="index" separator=",">
(#{*.name} ,#{*.sex},#{*.address})
</foreach>
foreach元素的屬性主要有 collection,item,separator,index,open,close。
- collection:指定要遍歷的集合。表示傳入過來的引數的資料型別。該屬性是必須指定的,要做 foreach 的物件。在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性。在不同情況
下,該屬性的值是不一樣的,主要有以下3種情況:傳參為List,傳參為Array,傳參為Msp。分別對應:list,arry,map。 - item:表示集合中每一個元素進行迭代時的別名。將當前遍歷出的元素賦值給指定的變數,然後用#{變數名},就能取出變數的值,也就是當前遍歷出的元素。
- separator:表示在每次進行迭代之間以什麼符號作為分隔符
- index:索引。index指定一個名字,用於表示在迭代過程中,每次迭代到的位置。遍歷list的時候index就是索引,遍歷map的時候index表示的就是map的key,item就是map的值。
- open表示該語句以什麼開始。
- close表示以什麼結束。
我使用的是List<物件>型別,物件裡面包含 id,日期,檔案目錄三個欄位。ignore是為了避免重複插入。
mapper中
<insert id="insertPath">
insert ignore into paths(id,date,pathname)
values
<foreach collection="list" item="paths" index="id" separator=",">
(#{paths.Id,jdbcType=INTEGER}, #{paths.Date,jdbcType=DATE}, #{paths.Pathname,jdbcType=VARCHAR})
</foreach>
</insert>
pathmapper中:
public interface PathMapper {
int insertPath(@Param("list")List<Paths> pathlist);
}
注意@Param註解
我提前將自己想要的資料封裝成了Paths型別()這是自己定義的類名。
pathServiceImpl:
@Service
public class pathServiceImpl implements pathService {
@Autowired
private PathMapper pathMapper;
@Transactional
@Override
public int getPathsByConditionLike(List<Paths> pathlist) {
int i = pathMapper.insertPath(pathlist);
return i;
}
}
pathService
public interface pathService {
int getPathsByConditionLike(@Param("list") List<Paths> paths);
}
Controler:
由於我把獲取檔案路徑和將檔案路徑的日期分割都放到了這裡面,然後放入到Paths物件裡面,不知道做的是否規範。
@RestController
public class readpath {
//定義一個全域性變數,來儲存遞迴函式內的檔案路徑
static int len = 50000;
static int num = 0;
static String[] paths = new String[len];
static Date[] datel = new Date[len];
static List<Paths> pathlists = new ArrayList<>();
private static Paths pathsl = null;
@Autowired
private pathService pathService;
@RequestMapping("/pathsql")
//將資料進行封裝成list
public void format() {
File file = new File("E:/TiffData/市資料");
paths = fileList(file, 0, paths);
//設定日期的格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
int ind = 0;
for (int i = 0; i < file.length(); i++) {
if (paths[i] != null) {
if (paths[i].length() - paths[i].lastIndexOf("/") > 8 && paths[i].lastIndexOf("_") + 1 > 0) {
String q = paths[i].substring(paths[i].lastIndexOf("\\") + 1, paths[i].lastIndexOf("_"));
String dates = q.substring(q.indexOf("_") + 1, q.lastIndexOf("_"));
String fmt = "(\\d{4})(\\d{2})(\\d{2})";
dates = dates.replaceAll(fmt, "$1-$2-$3");
Date date = null;
try {
date = formatter.parse(dates);
datel[i] = date;
} catch (ParseException e) {
e.printStackTrace();
}
//System.out.println(formatter.format(date));
} else {
datel[i] = null;
}
pathsl = new Paths(ind+1, datel[i], paths[i]);
pathlists.add(pathsl);
ind++;
//System.out.println(datel[i]);
//System.out.println(paths[i]);
}
}
pathlists.forEach(pl -> {
System.out.println(pl.getId() + "," + pl.getDate() + "," + pl.getPathname());
});
int insertnum = pathService.getPathsByConditionLike(pathlists);
System.out.println(insertnum);
}
//獲取檔案路徑
public static String[] fileList(File file, int node, String paths[]) {
node++;
File[] files = file.listFiles();
if (files != null) {
for (int n = 0; n < files.length; n++) {
for (int i = 0; i < node; i++) {
//判斷出為子目錄
if (i == node - 2) {
paths[num] = files[n].getAbsolutePath();
num++;
}
}
//+file1.getName()僅獲取檔名
//System.out.println( files[n].getAbsolutePath());
fileList(files[n], node, paths);
}
}
return paths;
}
}
程式碼至此就告一段路。
值得注意的是:1.mapper中插入語句的寫法;2.foreach的引數,以及傳入型別;3.資料封裝時新增值;4.建立資料庫的主鍵設定;5.java型別的值和資料庫中的值型別的值是否相符合。-------------java.util.Date和java.sql.Date在mybatis的插入時會自動轉換。
插入後資料庫中所示: