mybatis使用foreach遍歷list集合或者array數(shù)組方式
一、準(zhǔn)備工作
1.db.properties文件(記得修改自己的數(shù)據(jù)庫(kù)和用戶名、密碼)
dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8 dataSource.username=blog dataSource.password=blog
2.主配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入外部配置文件--> <properties resource="db.properties"></properties> <!-- 別名設(shè)置,不設(shè)置時(shí)引用要使用全包名,設(shè)置后可以使用自定義別名,更加簡(jiǎn)潔 --> <typeAliases> <!-- 別名設(shè)置有兩種,一種是一個(gè)一個(gè)設(shè)置,另外一種是設(shè)置某個(gè)包,默認(rèn)別名為類名(大小寫都可以,建議小寫) --> <!-- 第一種設(shè)置 <typeAlias type="com.mybatis_demo.domain.User" alias="user"/>--> <!-- 第二種設(shè)置,整個(gè)包下面的類都進(jìn)行別名設(shè)置,推薦第二種 --> <package name="com.mybatis_demo.domain"/> </typeAliases> <!-- 環(huán)境模式:development開發(fā)模式 work工作模式 --> <environments default="development"> <!-- 環(huán)境變量 --> <environment id="development"> <!-- 使用jdbc的事務(wù)管理 --> <transactionManager type="JDBC"/> <!-- 使用連接池 --> <dataSource type="POOLED"> <property name="driver" value="${dataSource.driver}"/> <property name="url" value="${dataSource.url}"/> <property name="username" value="${dataSource.username}"/> <property name="password" value="${dataSource.password}"/> </dataSource> </environment> </environments> <!-- 引入mapper映射文件 --> <mappers> <!-- 1.相對(duì)路徑引入--> <!-- <mapper resource="mapper/UserMapper.xml"/> --> <!-- 2.絕對(duì)路徑引入 --> <!-- <mapper url="file:\\\D:\sts-bundle\workplace\mybatis_demo\src\main\resources\mapper\UserMapper.xml"/> --> <!-- 3.對(duì)應(yīng)mapper接口全包名引入,需要對(duì)應(yīng)的mapper.xml與接口mapper處于同一包下才可以,且xml文件名與接口名要相同,xml文件中的namespace必須是對(duì)應(yīng)接口的全包名 --> <!-- <mapper class="com.mybatis_demo.mapper.UserMapper"/> --> <!-- 4.包引入,要求跟接口引入一樣 --> <!-- <mapper resource="mapper/UserMapper2.xml"/> --> <package name="com.mybatis_demo.mapper"/> </mappers> </configuration>
3.創(chuàng)建User類和包裝類UserVo
User.java
package com.mybatis_demo.domain; public class User { private Integer uid; private String uname; private Integer age; private String address; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [uid=" + uid + ", uname=" + uname + ", age=" + age + ", address=" + address + "]"; } }
UserVo.java
package com.mybatis_demo.domain; import java.util.List; public class UserVo extends User { private Integer[] ids; private List<Integer> idList; public Integer[] getIds() { return ids; } public void setIds(Integer[] ids) { this.ids = ids; } public List<Integer> getIdList() { return idList; } public void setIdList(List<Integer> idList) { this.idList = idList; } }
二、遍歷數(shù)組和集合的映射文件和對(duì)應(yīng)的接口
1.mapper映射文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis_demo.mapper.UserMapper"> <!-- 遍歷list集合,collection="list",如果你傳參的時(shí)候是直接傳遞list集合,那么這里只能填list,不能填參數(shù)名 --> <select id="selectByList" resultType="User"> select * from t_user where uid in <foreach collection="list" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> <!-- 遍歷數(shù)組 ,collection="array",如果你傳參的時(shí)候是直接傳遞數(shù)組,那么這里只能填array,不能填參數(shù)名--> <select id="selectByArray" resultType="User"> select * from t_user where uid in <foreach collection="array" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> <!-- 遍歷包裝類中的數(shù)組,collection="ids",這里不再是array,而是包裝類中對(duì)應(yīng)的變量名,因?yàn)槟銈鬟f的參數(shù)是一個(gè)包裝類,mybatis是通過get方法獲取包裝類中的數(shù)組 --> <select id="selectUserVoByArray" parameterType="UserVo" resultType="User"> select * from t_user where uid in <foreach collection="ids" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> <!-- 遍歷包裝類中的list集合,collection="idList",這里不再是list,而是包裝類中對(duì)應(yīng)的變量名,因?yàn)槟銈鬟f的參數(shù)是一個(gè)包裝類,mybatis是通過get方法獲取包裝類中的list集合 --> <select id="selectUserVoByList" parameterType="UserVo" resultType="User"> select * from t_user where uid in <foreach collection="idList" item="item" open="(" separator="," close=")"> #{item} </foreach> </select> </mapper>
2.mapper接口
UserMapper.interface
package com.mybatis_demo.mapper; import java.util.List; import java.util.Map; import com.mybatis_demo.domain.User; import com.mybatis_demo.domain.UserVo; public interface UserMapper { //mybatis使用mapper動(dòng)態(tài)代理 //4大原則,一個(gè)注意 //1.接口中的方法名需要與對(duì)應(yīng)mapper.xml的id一致 //2.接口中的返回值需要與對(duì)應(yīng)mapper.xml的返回值類型保持一致 //3.接口中的參數(shù)需要與對(duì)應(yīng)mapper.xml的參數(shù)類型、個(gè)數(shù)、參數(shù)名保持一致 //4.對(duì)應(yīng)mapper.xml的名字空間需要修改成對(duì)應(yīng)接口的全包名 //注意:mapper動(dòng)態(tài)代理根據(jù)返回值類型,mybatis會(huì)自動(dòng)選擇調(diào)用selectone還是selectlist.... //用list封裝條件 public List<User> selectByList(List<Integer> testlist); //用數(shù)組封裝條件 public List<User> selectByArray(Integer[] ids); //用包裝類中的數(shù)組封裝條件 public List<User> selectUserVoByArray(UserVo userVo); //用包裝類中的list封裝條件 public List<User> selectUserVoByList(UserVo userVo); }
三、測(cè)試代碼
package com.mybatis_demo.test; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import com.mybatis_demo.domain.User; import com.mybatis_demo.domain.UserVo; import com.mybatis_demo.mapper.UserMapper; public class TestMapper { //用包裝類中的list封裝條件,傳遞參數(shù)是一個(gè)包裝類 @Test public void test_selectUserVoByList() { try { //讀取配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //創(chuàng)建SqlSessionFactoryBuilder對(duì)象,用來獲取SqlSessionFactory對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder對(duì)象build一個(gè)SqlSessionFactory對(duì)象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory獲取session對(duì)象 SqlSession session = build.openSession(); //通過session對(duì)象獲取對(duì)應(yīng)mapper接口 UserMapper mapper = session.getMapper(UserMapper.class); List<Integer> idList = new ArrayList<Integer>(); idList.add(5); idList.add(3); idList.add(123); idList.add(19); UserVo userVo = new UserVo(); userVo.setIdList(idList); List<User> users = mapper.selectUserVoByList(userVo); for (User user : users) { System.out.println(user); } } catch (IOException e) { e.printStackTrace(); } } //用包裝類中的array封裝條件,傳遞參數(shù)是一個(gè)包裝類 @Test public void test_selectUserVoByArray() { try { //讀取配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //創(chuàng)建SqlSessionFactoryBuilder對(duì)象,用來獲取SqlSessionFactory對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder對(duì)象build一個(gè)SqlSessionFactory對(duì)象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory獲取session對(duì)象 SqlSession session = build.openSession(); //通過session對(duì)象獲取對(duì)應(yīng)mapper接口 UserMapper mapper = session.getMapper(UserMapper.class); Integer[] ids = new Integer[]{5,9,30}; UserVo userVo = new UserVo(); userVo.setIds(ids); List<User> users = mapper.selectUserVoByArray(userVo); for (User user : users) { System.out.println(user); } } catch (IOException e) { e.printStackTrace(); } } //用數(shù)組封裝條件,傳遞參數(shù)是一個(gè)數(shù)組 @Test public void test_selectByArray() { try { //讀取配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //創(chuàng)建SqlSessionFactoryBuilder對(duì)象,用來獲取SqlSessionFactory對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder對(duì)象build一個(gè)SqlSessionFactory對(duì)象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory獲取session對(duì)象 SqlSession session = build.openSession(); //通過session對(duì)象獲取對(duì)應(yīng)mapper接口 UserMapper mapper = session.getMapper(UserMapper.class); Integer[] ids = new Integer[]{5,9,30}; List<User> users = mapper.selectByArray(ids); for (User user : users) { System.out.println(user); } } catch (IOException e) { e.printStackTrace(); } } //用list封裝條件,傳遞參數(shù)是一個(gè)list集合 @Test public void test_selectByList() { try { //讀取配置文件 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); //創(chuàng)建SqlSessionFactoryBuilder對(duì)象,用來獲取SqlSessionFactory對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder對(duì)象build一個(gè)SqlSessionFactory對(duì)象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory獲取session對(duì)象 SqlSession session = build.openSession(); //通過session對(duì)象獲取對(duì)應(yīng)mapper接口 UserMapper mapper = session.getMapper(UserMapper.class); List<Integer> list = new ArrayList<Integer>(); list.add(5); list.add(3); list.add(123); list.add(19); List<User> users = mapper.selectByList(list); for (User user : users) { System.out.println(user); } } catch (IOException e) { e.printStackTrace(); } } }
四、總結(jié)
1.如果你傳參的時(shí)候直接傳一個(gè)數(shù)組,那么使用foreach遍歷時(shí)collection=“array”,這里是固定寫法,即這里的array與你的實(shí)參名無關(guān)
2.如果你傳參的時(shí)候直接傳一list集合,那么使用foreach遍歷時(shí)collection=“l(fā)ist”,這里是固定寫法,即這里的list與你的實(shí)參名無關(guān)
3.如果你傳參的時(shí)候直接傳一個(gè)含有數(shù)組成員變量的類,那么使用foreach遍歷時(shí)collection=“你的變量名”,這里不再是固定寫法,即這里的命名取決于成員變量的變量名,例如:成員變量名是test,那么就是collection=“test”
4.如果你傳參的時(shí)候直接傳一個(gè)含有l(wèi)ist集合成員變量的類,跟3的情況一樣
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis的foreach標(biāo)簽語(yǔ)法報(bào)錯(cuò)的解決
這篇文章主要介紹了mybatis的foreach標(biāo)簽語(yǔ)法報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringBoot結(jié)合Redis實(shí)現(xiàn)緩存管理功能
本篇文章主要介紹spring boot緩存管理機(jī)制及相關(guān)概念,以及如何結(jié)合Redis實(shí)現(xiàn)緩存管理,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-01-01Java對(duì)象傳遞與返回的細(xì)節(jié)問題詳析
我們知道這是一個(gè)核心概念,在Java中總是按值傳遞而不是按引用傳遞,下面這篇文章主要給大家介紹了關(guān)于Java對(duì)象傳遞與返回的細(xì)節(jié)問題的相關(guān)資料,需要的朋友可以參考下2022-11-11Feign如何解決服務(wù)之間調(diào)用傳遞token
這篇文章主要介紹了Feign如何解決服務(wù)之間調(diào)用傳遞token,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Spring中使用atomikos+druid實(shí)現(xiàn)經(jīng)典分布式事務(wù)的方法
這篇文章主要介紹了Spring中使用atomikos+druid實(shí)現(xiàn)經(jīng)典分布式事務(wù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06java中的日期時(shí)間類Date和SimpleDateFormat
這篇文章主要介紹了java中的日期時(shí)間類Date和SimpleDateFormat,Date類的對(duì)象在Java中代表的是當(dāng)前所在系統(tǒng)的此刻日期時(shí)間,說白了就是你計(jì)算機(jī)上現(xiàn)實(shí)的時(shí)間,需要的朋友可以參考下2023-09-09新版idea創(chuàng)建spring boot項(xiàng)目的詳細(xì)教程
這篇文章給大家介紹了新版idea創(chuàng)建spring boot項(xiàng)目的詳細(xì)教程,本教程對(duì)新手小白友好,若根據(jù)教程創(chuàng)建出現(xiàn)問題導(dǎo)致失敗可下載我提供的源碼,在文章最后,本教程較新,文中通過圖文給大家介紹的非常詳細(xì),感興趣的朋友可以參考下2024-01-01微信公眾平臺(tái)(測(cè)試接口)準(zhǔn)備工作
想要微信開發(fā),首先要有個(gè)服務(wù)器,但是自己沒有。這時(shí)候可以用花生殼,將內(nèi)網(wǎng)映射到公網(wǎng)上,這樣就可以在公網(wǎng)訪問自己的網(wǎng)站了。2016-05-05