1. 程式人生 > 遊戲 >虛幻4重製《古墓麗影2》Demo1.2版 新增照片模式等

虛幻4重製《古墓麗影2》Demo1.2版 新增照片模式等

技術標籤: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。

  1. collection:指定要遍歷的集合。表示傳入過來的引數的資料型別。該屬性是必須指定的,要做 foreach 的物件。在使用foreach的時候最關鍵的也是最容易出錯的就是collection屬性。在不同情況
    下,該屬性的值是不一樣的,主要有以下3種情況:傳參為List,傳參為Array,傳參為Msp。分別對應:list,arry,map。
  2. item:表示集合中每一個元素進行迭代時的別名。將當前遍歷出的元素賦值給指定的變數,然後用#{變數名},就能取出變數的值,也就是當前遍歷出的元素。
  3. separator:表示在每次進行迭代之間以什麼符號作為分隔符
  4. index:索引。index指定一個名字,用於表示在迭代過程中,每次迭代到的位置。遍歷list的時候index就是索引,遍歷map的時候index表示的就是map的key,item就是map的值。
  5. open表示該語句以什麼開始。
  6. 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的插入時會自動轉換。
插入後資料庫中所示:
在這裡插入圖片描述