好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mybatis使用foreach遍历list集合或者array数组方式

一、准备工作

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数组方式的详细内容...

  阅读:15次