一、准备工作
1.db.properties文件(记得修改自己的数据库和用户名、密码)
|
1 2 3 4 |
dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode= true &characterEncoding=utf8 dataSource.username=blog dataSource. password =blog |
2.主配置文件
|
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 |
<? 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 > <!-- 别名设置,不设置时引用要使用全包名,设置后可以使用自定义别名,更加简洁 --> < typeAliases > <!-- 别名设置有两种,一种是一个一个设置,另外一种是设置某个包,默认别名为类名(大小写都可以,建议小写) --> <!-- 第一种设置 <typeAlias type="com.mybatis_demo.domain.User" alias="user"/>--> <!-- 第二种设置,整个包下面的类都进行别名设置,推荐第二种 --> < package name = "com.mybatis_demo.domain" /> </ typeAliases > <!-- 环境模式:development开发模式 work工作模式 --> < environments default = "development" > <!-- 环境变量 --> < environment id = "development" > <!-- 使用jdbc的事务管理 --> < 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.相对路径引入--> <!-- <mapper resource="mapper/UserMapper.xml"/> --> <!-- 2.绝对路径引入 --> <!-- <mapper url="file:\\\D:\sts-bundle\workplace\mybatis_demo\src\main\resources\mapper\UserMapper.xml"/> --> <!-- 3.对应mapper接口全包名引入,需要对应的mapper.xml与接口mapper处于同一包下才可以,且xml文件名与接口名要相同,xml文件中的namespace必须是对应接口的全包名 --> <!-- <mapper class="com.mybatis_demo.mapper.UserMapper"/> --> <!-- 4.包引入,要求跟接口引入一样 --> <!-- <mapper resource="mapper/UserMapper2.xml"/> --> < package name = "com.mybatis_demo.mapper" /> </ mappers > </ configuration > |
3.创建User类和包装类UserVo
User.java
|
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 |
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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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; }
} |
二、遍历数组和集合的映射文件和对应的接口
1.mapper映射文件
|
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 |
<? 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",如果你传参的时候是直接传递list集合,那么这里只能填list,不能填参数名 --> < select id = "selectByList" resultType = "User" > select * from t_user where uid in < foreach collection = "list" item = "item" open = "(" separator = "," close = ")" > #{item} </ foreach > </ select > <!-- 遍历数组 ,collection="array",如果你传参的时候是直接传递数组,那么这里只能填array,不能填参数名--> < select id = "selectByArray" resultType = "User" > select * from t_user where uid in < foreach collection = "array" item = "item" open = "(" separator = "," close = ")" > #{item} </ foreach > </ select > <!-- 遍历包装类中的数组,collection="ids",这里不再是array,而是包装类中对应的变量名,因为你传递的参数是一个包装类,mybatis是通过get方法获取包装类中的数组 --> < 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,而是包装类中对应的变量名,因为你传递的参数是一个包装类,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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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动态代理
//4大原则,一个注意 //1.接口中的方法名需要与对应mapper.xml的id一致 //2.接口中的返回值需要与对应mapper.xml的返回值类型保持一致 //3.接口中的参数需要与对应mapper.xml的参数类型、个数、参数名保持一致 //4.对应mapper.xml的名字空间需要修改成对应接口的全包名 //注意:mapper动态代理根据返回值类型,mybatis会自动选择调用selectone还是selectlist.... //用list封装条件 public List<User> selectByList(List<Integer> testlist); //用数组封装条件 public List<User> selectByArray(Integer[] ids); //用包装类中的数组封装条件 public List<User> selectUserVoByArray(UserVo userVo); //用包装类中的list封装条件 public List<User> selectUserVoByList(UserVo userVo); } |
三、测试代码
|
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
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封装条件,传递参数是一个包装类 @Test public void test_selectUserVoByList() { try { //读取配置文件 InputStream in = Resources.getResourceAsStream( "sqlMapConfig.xml" ); //创建SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder对象build一个SqlSessionFactory对象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory获取session对象 SqlSession session = build.openSession(); //通过session对象获取对应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封装条件,传递参数是一个包装类 @Test public void test_selectUserVoByArray() { try { //读取配置文件 InputStream in = Resources.getResourceAsStream( "sqlMapConfig.xml" ); //创建SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder对象build一个SqlSessionFactory对象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory获取session对象 SqlSession session = build.openSession(); //通过session对象获取对应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(); } }
//用数组封装条件,传递参数是一个数组 @Test public void test_selectByArray() { try { //读取配置文件 InputStream in = Resources.getResourceAsStream( "sqlMapConfig.xml" ); //创建SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder对象build一个SqlSessionFactory对象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory获取session对象 SqlSession session = build.openSession(); //通过session对象获取对应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封装条件,传递参数是一个list集合 @Test public void test_selectByList() { try { //读取配置文件 InputStream in = Resources.getResourceAsStream( "sqlMapConfig.xml" ); //创建SqlSessionFactoryBuilder对象,用来获取SqlSessionFactory对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //利用SqlSessionFactoryBuilder对象build一个SqlSessionFactory对象 SqlSessionFactory build = builder.build(in); //利用sqlSessionFactory获取session对象 SqlSession session = build.openSession(); //通过session对象获取对应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(); } } } |
四、总结
1.如果你传参的时候直接传一个数组,那么使用foreach遍历时collection=[array],这里是固定写法,即这里的array与你的实参名无关
2.如果你传参的时候直接传一list集合,那么使用foreach遍历时collection=[list],这里是固定写法,即这里的list与你的实参名无关
3.如果你传参的时候直接传一个含有数组成员变量的类,那么使用foreach遍历时collection=[你的变量名],这里不再是固定写法,即这里的命名取决于成员变量的变量名,例如:成员变量名是test,那么就是collection=[test]
4.如果你传参的时候直接传一个含有list集合成员变量的类,跟3的情况一样
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
原文链接:https://blog.csdn.net/ChOLg/article/details/100162800
查看更多关于mybatis使用foreach遍历list集合或者array数组方式的详细内容...