国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 如何批量測(cè)試Mybatis項(xiàng)目中的Sql是否正確詳解

如何批量測(cè)試Mybatis項(xiàng)目中的Sql是否正確詳解

2021-06-18 14:13不學(xué)無數(shù)的程序員 Java教程

這篇文章主要給大家介紹了關(guān)于如何批量測(cè)試Mybatis項(xiàng)目中Sql是否正確的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

去oracle行動(dòng)

最近公司要發(fā)展海外項(xiàng)目,所以要將現(xiàn)有的系統(tǒng)全部平移過去,另外數(shù)據(jù)庫也要從原來的oracle變?yōu)閙ysql。公司的數(shù)據(jù)庫交互層面使用的是mybatis,而oracle與mysql也有一些語法上的不同。所以在項(xiàng)目中的sql要改動(dòng),但是多個(gè)項(xiàng)目中涉及到的sql非常多,如果僅憑人工一條一條辨別的話,工作量有點(diǎn)大。所以就萌發(fā)出了直接將數(shù)據(jù)源變?yōu)閙ysql,利用反射批量執(zhí)行mapper中的方法,然后如果有參數(shù)的話,就設(shè)置為默認(rèn)的初始值,然后記錄下來成功的數(shù)據(jù)和失敗的數(shù)據(jù),這樣就可以根據(jù)失敗原因進(jìn)行修改。

能夠節(jié)省很大的時(shí)間。

執(zhí)行效果

如何批量測(cè)試Mybatis項(xiàng)目中的Sql是否正確詳解

代碼介紹

總體思路就三步

  • 通過反射獲得要執(zhí)行的mapper類的所有方法
  • 獲得方法中的參數(shù),并賦值
  • 執(zhí)行
?
1
2
autotestmapper autotestmapper = new autotestmapper("存放mapper全路徑名");
autotestmapper.opensqlsession(sqlsessionfactory);

在構(gòu)造函數(shù)中傳入全路徑名后,進(jìn)行解析,解析出包名和所有的文件名并存儲(chǔ)起來

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public autotestmapper(string path) throws ioexception, classnotfoundexception {
string mappercontent = getfilecontent(path);
string pathpattern = "import [a-z,a-z,/.]+;";
string[] patharr = matchmethod(pathpattern, mappercontent).split(";");
for (int i = 0; i < patharr.length; i++) {
patharr[i] = patharr[i].replaceall("import ", "");
class cls = class.forname(patharr[i]);
if (!cls.isinterface()) {
type_array.add(cls);
}
}
//獲得全路徑名的前綴
string packpattern = "package [a-z,a-z,/.]+;";
string[] packpatharr = matchmethod(packpattern, mappercontent).split(";");
string packpath = packpatharr[0].replaceall("package ", "").replaceall(";", "");
this.pack_path = packpath;
}

然后調(diào)用opensqlsession的方法,傳入sqlsessionfactory參數(shù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
list<map<class, object>> list = new arraylist<>();
list<string> invokesuccess = new arraylist<>();
list<string> invokefail = new arraylist<>();
for (string filename : file_name) {
class cls = class.forname(pack_path + "." + filename);
//添加mapper
if (!sqlsessionfactory.getconfiguration().hasmapper(cls)){
sqlsessionfactory.getconfiguration().addmapper(cls);
}
//獲得mapper
object mapper = sqlsessionfactory.opensession().getmapper(cls);
//反射執(zhí)行mapper的方法
map<string, list<string>> resultmap = autotestinvoke(cls, mapper);
invokesuccess.addall(resultmap.get(success_flg));
invokefail.addall(resultmap.get(fail_flg));
}

然后通過mybatyis提供的方法getmapper()傳入類名獲得所要mapper類。核心方法就是autotestinvoke()方法了

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
   private map<string, list<string>> autotestinvoke(class c, object o)
{
method[] declaredmethods = c.getdeclaredmethods();
string filename = c.getname().substring(c.getname().lastindexof("."));
list<string> invokesuccess = new arraylist<>();
list<string> invokefail = new arraylist<>();
map<string, list<string>> resultmap = new hashmap<>();
//給參數(shù)賦初始值
for (method method : declaredmethods) {
list<object> list = new arraylist<>();
for (class cls : method.getparametertypes()) {
object par = new object();
if (type_array.contains(cls)) {
 if (cls.equals(string.class)) {
 par = "1";
 } else {
 try {
 par = cls.newinstance();
 assignment(cls, par);
 } catch (instantiationexception e) {
 if (cls.isprimitive()) {
 cls = primitiveclazz.get(cls.getname());
 }
 try {
 par = cls.getdeclaredconstructor(string.class).newinstance("1");
 
 }catch (nosuchmethodexception e1){
 system.out.println(cls.getname()+e);
 }
 }
 }
}else if ("java.util.map".equals(cls.getname())){
 par = getmapdata(c.getname()+"."+method.getname());
}
list.add(par);
}
try {
method.invoke(o, list.toarray());
invokesuccess.add("success: " + filename + "." + method.getname());
} catch (exception e) {
invokefail.add("error:" + method.getname() + " error info:" + e);
}
}
resultmap.put(success_flg, invokesuccess);
resultmap.put(fail_flg, invokefail);
return resultmap;
}

這里面完成為參數(shù)賦初始值,和執(zhí)行的邏輯。

使用說明

導(dǎo)入jar包

maven

?
1
2
3
4
5
<dependency>
 <groupid>com.github.modouxiansheng</groupid>
 <artifactid>convenientutil</artifactid>
 <version>1.3-release</version>
</dependency>

gradle

?
1
compile 'com.github.modouxiansheng:convenientutil:1.1-release'

創(chuàng)建mybatis-config.xml文件

在項(xiàng)目的resource文件夾下創(chuàng)建mybatis-config.xml文件,里面內(nèi)容如下,里面value值為想要測(cè)的數(shù)據(jù)庫的連接信息

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!doctype configuration
 public "-//mybatis.org//dtd config 3.0//en"
 "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <environments default="dev">
 <environment id="dev">
 <transactionmanager type="jdbc"></transactionmanager>
 <datasource type="unpooled">
 <property name="driver" value=""/>
 <property name="url" value=""/>
 <property name="username" value=""/>
 <property name="password" value=""/>
 </datasource>
 </environment>
 </environments>
</configuration>

在測(cè)試類中編寫代碼

在測(cè)試類中編寫如下代碼

?
1
2
3
4
5
reader resourceasreader = resources.getresourceasreader("mybatis-config.xml");
sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(resourceasreader);
resourceasreader.close();
autotestmapper autotestmapper = new autotestmapper("想要測(cè)試的mapper文件夾全路徑名");
autotestmapper.opensqlsession(sqlsessionfactory);

查看輸出的信息

然后會(huì)打印出執(zhí)行成功的sql,執(zhí)行失敗的sql。如果失敗的話會(huì)有原因。
success: tsessetmanualmapper.updateflgdelautointimepay
success: tsessetmanualmapper.getautosetmanualordlistcount
success: tsessetmanualmapper.updateautosetmanualord
success: tsessetmanualmapper.queryautosetmanualorddetail
success: tsessetmanualmapper.querysetmanualordlistcount
success: shortmessagemapper.querypayinssminfo
-------------------
|error: |tsessetmanualmapper.queryautosetmanualordlist| every derived table must have its own alias|
|error: |tsessetmanualmapper.querysetmanualordlist| every derived table must have its own alias|

這樣就能夠根據(jù)錯(cuò)誤信息進(jìn)行更改了。

github地址:https://github.com/modouxiansheng/convenientuti

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://juejin.im/post/5c0108fdf265da613e21f997

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 综合二区 | 国产91精品在线 | 国产一区二区日韩 | 欧美成人高清 | 色偷偷888欧美精品久久久 | 亚洲视频一区在线观看 | 亚洲三区在线观看 | 欧美午夜一区二区三区 | 精品久久久久久久久久 | 91精品久久久久久 | 精品久久国产 | 小情侣高清国产在线播放 | 国产美女视频自拍 | 每日更新av | 欧美一级片毛片免费观看视频 | 欧美精品一二三区 | 欧美久久视频 | 亚洲成熟少妇视频在线观看 | 999这里只有是极品 最新中文字幕在线 | 久久久久99精品国产片 | 日本一区免费 | 狠狠操狠狠干 | 日本成人高清视频 | 欧美一级大片免费 | 国产中文字幕网 | 99精品国产高清在线观看 | 欧美精品第一页 | 人人射视频 | 中文字幕av在线播放 | 国产日韩一区 | 精品视频一区二区三区在线观看 | a在线看| 男女爱爱免费视频 | 亚洲精品视频一区二区三区 | 色视频网站在线观看 | 香蕉福利视频 | 久久久久久夜 | 国产精品69久久久久水密桃 | 亚洲精品久久久久999中文字幕 | 美女国产精品 | 亚洲国产精品久久久久婷婷老年 |