MyBatis之foreach
- 2019 年 10 月 6 日
- 筆記
foreach
foreach 元素是非常強大的,它允許你指定一個集合,聲明集合項和索引變數,它們可以用在元素體內。它也允許你指定開放和關閉的字元串,在迭代之間放置分隔符。這個元素是很智慧的,它不會偶然地附加多餘的分隔符。
注意 你可以傳遞一個 List 實例或者數組作為參數對象傳給 MyBatis。當你這麼做的時候,MyBatis 會自動將它包裝在一個 Map 中,用名稱在作為鍵。List 實例將會以「list」 作為鍵,而數組實例將會以「array」作為鍵。
屬性 |
描述 |
---|---|
item |
循環體中的具體對象。支援屬性的點路徑訪問,如item.age,item.info.details。 具體說明:在list和數組中是其中的對象,在map中是value。 該參數為必選。 |
collection |
要做foreach的對象,作為入參時,List<?>對象默認用list代替作為鍵,數組對象有array代替作為鍵,Map對象用map代替作為鍵。 當然在作為入參時可以使用@Param("keyName")來設置鍵,設置keyName後,list,array,map將會失效。 除了入參這種情況外,還有一種作為參數對象的某個欄位的時候。舉個例子: 如果User有屬性List ids。入參是User對象,那麼這個collection = "ids" 如果User有屬性Ids ids;其中Ids是個對象,Ids有個屬性List id;入參是User對象,那麼collection = "ids.id" 上面只是舉例,具體collection等於什麼,就看你想對那個元素做循環。 該參數為必選。 |
separator |
元素之間的分隔符,例如在in()的時候,separator=","會自動在元素中間用「,「隔開,避免手動輸入逗號導致sql錯誤,如in(1,2,)這樣。該參數可選。 |
open |
foreach程式碼的開始符號,一般是(和close=")"合用。常用在in(),values()時。該參數可選。 |
close |
foreach程式碼的關閉符號,一般是)和open="("合用。常用在in(),values()時。該參數可選。 |
index |
在list和數組中,index是元素的序號,在map中,index是元素的key,該參數可選。 |
多數時候用foreach僅作為sql的inst<User> selIn(@Param("alsit") List<Integer> list);
<select id="selIn" resultType="User"> select * from user <where> id in <foreach collection="alsit" open="(" separator="," close=")" item="item"> #{item} </foreach> </where> </select> @Test public void selectIn() throws IOException { SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); UserMapper mapper = session.getMapper(UserMapper.class); List<Integer> integerList = new ArrayList<>(); integerList.add(1); integerList.add(2); integerList.add(3); integerList.add(4); integerList.add(5); List<User> userList = mapper.selIn(integerList); for (User user : userList) { System.out.println(user); } }
foreach之map的使用
當foreach的collection為map的時候,它的index就位map的key,value為值
int insUser(@Param("map") Map<Integer,User> map); <insert id="insUser"> insert into user values <foreach collection="map" item="item" index="key" separator=","> (default,#{item.userCode},#{item.userPassword}) </foreach> </insert> @Test public void insertUser() throws IOException { SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User u1 = new User(0,"a","a"); User u2= new User(0,"a1","a"); User u3 = new User(0,"a2","a"); User u4 = new User(0,"a3","a"); Map<Integer, User> map = new HashMap<>(); map.put(1,u1); map.put(2,u2); map.put(3,u3); map.put(4,u4); int result = mapper.insUser(map); if (result > 0) { System.out.println("success"); session.commit(); } else { System.out.println("failed"); session.rollback(); } }
使用foreach遍歷list對象,對象裡面又包含listd的嵌套查詢
List<User> selIn(@Param("list") List<Entry> list); <select id="selIn" resultType="User"> select * from user <where> userCode in <foreach collection="list" item="item"> <foreach collection="item.list" open="(" separator="," close=")" item="son"> #{son.userCode} </foreach> </foreach> </where> </select> 實體 package cn.arebirth.pojo; import java.util.List; public class Entry { int id; List<User> list; public int getId() { return id; } public void setId(int id) { this.id = id; } public List<User> getList() { return list; } public void setList(List<User> list) { this.list = list; } } @Test public void selectIn() throws IOException { SqlSession session = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml")).openSession(); UserMapper mapper = session.getMapper(UserMapper.class); User u1 = new User(0, "a", "a"); User u2 = new User(0, "a1", "a"); User u3 = new User(0, "a2", "a"); User u4 = new User(0, "a3", "a"); List<User> addUser = new ArrayList<>(); addUser.add(u1); addUser.add(u2); addUser.add(u3); addUser.add(u4); Entry entry = new Entry(); entry.setId(1); entry.setList(addUser); List<Entry> entryList = new ArrayList<>(); entryList.add(entry); List<User> userList = mapper.selIn(entryList); for (User user : userList) { System.out.println(user); } }
—恢復內容結束—