本節書摘來異步社群《java ee核心架構實戰》一書中的第2章,第2.6節,作者: 高洪岩,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
mybatis架構還支援動态sql标簽的使用,而且某些标簽的使用率還非常高。
建立名為dynsqltest的web項目,建立名為test1的servlet對象,核心代碼如下。
select idauto.nextval from dual
insert into userinfo(id,username,password,age,insertdate)
values(#{id},#{username},#{password},#{age},#{insertdate})
<code>`</code>
程式運作後出現如下異常資訊。
<?xml version="1.0" encoding="utf-8" ?>
values(#{id,jdbctype=integer},#{username,jdbctype=varchar},#{password,
jdbctype=varchar},#{age,jdbctype=integer},#{insertdate,jdbctype=timestamp})
這裡在#{}格式中加入了資料類型的聲明,這樣可以明确地告訴mybatis架構如果遇到null值該如何處理。再次運作程式,成功插入資料表,運作結果如圖2-5所示。

通過在#{}格式中加入jdbctype即可避免插入null值時的異常,其實使用動态sql标簽也可以達到同樣的效果。
在映射檔案userinfomapping.xml添加如下代碼。
public class test2 extends httpservlet {
public void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {
userinfo userinfo1 = new userinfo();
userinfo1.setusername("英國");
userinfo1.setpassword(null);
userinfo1.setage();
userinfo1.setinsertdate(new date());
userinfo userinfo2 = new userinfo();
userinfo2.setusername("法國");
userinfo2.setpassword("法國人");
userinfo2.setage();
userinfo2.setinsertdate(new date());
sqlsession sqlsessionref = getsqlsession.getsqlsession();
sqlsessionref.insert("insertuserinfo2", userinfo1);
sqlsessionref.insert("insertuserinfo2", userinfo2);
sqlsessionref.commit();
sqlsessionref.close();
}
}<code>`</code>
程式運作後,成功向資料表中插入兩條記錄,如圖2-6所示。
< choose>标簽的作用是在衆多的條件中選擇出一個條件,它有些類似于java語言中switch語句的作用。
在映射檔案userinfomapping.xml中添加如下配置代碼。
public class test3 extends httpservlet {
userinfo1.setusername("英");
userinfo2.setpassword("法");
userinfo userinfo3 = new userinfo();
list listmap1 = sqlsessionref.selectlist("selectuserinfo1",
for (int i = 0; i < listmap1.size(); i++) {
map eachmap = listmap1.get(i);
system.out.println("listmap1中的内容: " + eachmap.get("id") + " "
list listmap2 = sqlsessionref.selectlist("selectuserinfo1",
for (int i = 0; i < listmap2.size(); i++) {
map eachmap = listmap2.get(i);
system.out.println("listmap2中的内容: " + eachmap.get("id") + " "
list listmap3 = sqlsessionref.selectlist("selectuserinfo1",
for (int i = 0; i < listmap3.size(); i++) {
map eachmap = listmap3.get(i);
system.out.println("listmap3中的内容: " + eachmap.get("id") + " "
資料表userinfo中的内容如圖2-7所示。
程式運作後,在控制台輸出如圖2-8所示的資訊。
< set>标簽可以用在update語句中,作用是動态指定要更新的列。
在映射檔案userinfomapping.xml中添加如下映射代碼。
public class test4 extends httpservlet {
userinfo userinfo = new userinfo();
userinfo.setid();
userinfo.setusername(null);
userinfo.setpassword("新密碼");
userinfo.setage();
userinfo.setinsertdate(new date());
sqlsessionref.update("updateuserinfo", userinfo);
程式運作結果如圖2-9所示。
< foreach>标簽有循環的功能,可以用來生成有規律的sql語句。
item表示集合中每一個元素進行疊代時的别名,index指定一個名字,用于表示在疊代過程中,每次疊代到的位置,open表示該語句以什麼開始,separator表示在每次疊代之間以什麼符号作為分隔符,close表示該語句以什麼結束。
public class test5 extends httpservlet {
// id的值來自于list
list list = new arraylist();
list.add(1);
list.add(3);
list.add(5);
list listmap1 = sqlsessionref.selectlist("selectuserinfo2", list);
system.out.println("list1中的内容: " + eachmap.get("id") + " "
// id的值來自于queryuserinfo實體中的list
queryuserinfo queryuserinfo = new queryuserinfo();
queryuserinfo.setusername("法");
queryuserinfo.getidlist().add(198);
queryuserinfo.getidlist().add(199);
listmap1 = sqlsessionref.selectlist("selectuserinfo3", queryuserinfo);
system.out.println("list2中的内容: " + eachmap.get("id") + " "
// id的值來自于map中的list
map parammap = new hashmap();
parammap.put("username", "5");
parammap.put("idlist", list);
listmap1 = sqlsessionref.selectlist("selectuserinfo4", parammap);
system.out.println("list3中的内容: " + eachmap.get("id") + " "
運作程式後,控制台輸出如圖2-10所示的結果。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。