天天看點

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

本節書摘來異步社群《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>

程式運作後出現如下異常資訊。

&lt;?xml version="1.0" encoding="utf-8" ?&gt;

values(#{id,jdbctype=integer},#{username,jdbctype=varchar},#{password,

jdbctype=varchar},#{age,jdbctype=integer},#{insertdate,jdbctype=timestamp})

這裡在#{}格式中加入了資料類型的聲明,這樣可以明确地告訴mybatis架構如果遇到null值該如何處理。再次運作程式,成功插入資料表,運作結果如圖2-5所示。

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

通過在#{}格式中加入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所示。

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

&lt; choose&gt;标簽的作用是在衆多的條件中選擇出一個條件,它有些類似于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 &lt; 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 &lt; 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 &lt; listmap3.size(); i++) {

map eachmap = listmap3.get(i);

system.out.println("listmap3中的内容: " + eachmap.get("id") + " "

資料表userinfo中的内容如圖2-7所示。

程式運作後,在控制台輸出如圖2-8所示的資訊。

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

&lt; set&gt;标簽可以用在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所示。

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

&lt; foreach&gt;标簽有循環的功能,可以用來生成有規律的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所示的結果。

《Java EE核心架構實戰》—— 2.6 動态SQL的使用

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。