A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大山哥哥 于 2018-6-11 09:34 编辑

我们队MyBatis使用中传参类型(简单类型、pojo、封装POJO、数组、List、Map)进行总结和统一讲解,需求如下
1.根据用户id查询用户信息
2.根据用户姓名、密码查询用户信息
3.使用封装POJO方式根据用户id查询用户信息
4.根据数组中的id查询用户信息
5.根据List集合中的id查询用户信息
6.根据Map中的用户id查询用户信息

配置文件在文中暂不贴出,请参见附件,文中只贴出部分核心代码
【1】创建实体类User
[Java] 纯文本查看 复制代码
public class User {
    private Integer id;

    private String password;

    private String username;

    private Date birthday;
    
    //省略getter setter方法
}

同时创建一个"复杂的"实体类CompPojo 来封装User
[Java] 纯文本查看 复制代码
public class CompPojo {
        private User user;
        public User getUser() {
                return user;
        }
        public void setUser(User user) {
                this.user = user;
        }
}

【2】创建service接口以及实现类,提供6个方法
[Java] 纯文本查看 复制代码
public interface UserService {
        User getUserById();
        List<User> getUserByUsernamePassword(User user);
        User getUserByPojoProp(CompPojo comp);
        List<User> selectUserByArray(Integer[] userIds);
        List<User> selectUserByList(List<Integer> userIds);
        List<User> selectUserByMap(Map<String,List<Integer>> userIds);
}

为接口中方法写实现:
[Java] 纯文本查看 复制代码
@Service
@Transactional
public class UserServiceImpl implements UserService {
        
        @Autowired
        private UserMapper userDAO;
        
        @Override
        public User getUserById(Integer id) {
                return userDAO.getUserById(id);
        }
        @Override
        public List<User> getUserByUsernamePassword(User user) {
                return userDAO.getUserByUsernamePassword(user);
        }
        @Override
        public User getUserByPojoProp(CompPojo comp) {
                return userDAO.getUserByPojoProp(comp);
        }
        @Override
        public List<User> selectUserByArray(Integer[] userIds) {
                return userDAO.selectUserByArray(userIds);
        }
        @Override
        public List<User> selectUserByList(List<Integer> userIds) {
                return userDAO.selectUserByList(userIds);
        }
        @Override
        public List<User> selectUserByMap(Map<String, List<Integer>> userIds) {
                return userDAO.selectUserByMap(userIds);
        }
}


【3】在mybatis接口中提供这6个方法
[AppleScript] 纯文本查看 复制代码
public interface UserMapper {
        
        User getUserById(Integer id);
        List<User> getUserByUsernamePassword(User user);
        User getUserByPojoProp(CompPojo comp);
        List<User> selectUserByArray(Integer[] userIds);
        List<User> selectUserByList(List<Integer> userIds);
        List<User> selectUserByMap(Map<String,List<Integer>> userIds);
        
}


【4】依次实现这6个方法对应的数据处理,并显示测试结果
1.        User getUserById(Integer id)对应的xml内容如下:
[XML] 纯文本查看 复制代码
 <!--根据用户ID查询用户信息 
  #{id}表示占位符,会将传递过来的参数填充到查询条件中,其中#{id}写法中的id可以是任意的字符串
          提示,parameterType可以省略
   -->
  <select id="getUserById" resultType="com.itheima.info.domain.User">
          select * from user where id = #{id}
  </select>

测试代码如下(省略读取配置文件的注解):
[Java] 纯文本查看 复制代码
@Autowired
        private UserService userService;
        
        @Test
        public void testId() {
                User user = userService.getUserById(1);
                System.out.println(user);
        }

测试结果如下:
[Java] 纯文本查看 复制代码
User [id=1, password=null, username=用户1, birthday=Wed Oct 10 00:00:00 CST 2018]


2.    List<User> getUserByUsernamePassword(User user)对应的xml文件内容如下:
[XML] 纯文本查看 复制代码
<!--根据用户名 密码 查询用户信息
  其中#{username}中的username是入参的对象user的属性名,#{password}中的password是入参的对象user的属性名
   -->
  <select id="getUserByUsernamePassword" resultType="com.itheima.info.domain.User">
          select * from user where username = #{username} and password = #{password}
  </select>

测试代码如下:
[Java] 纯文本查看 复制代码
@Test
        public void testUsernamePassword() {
                //封装一个User类 查询入参
                User user = new User();
                user.setUsername("用户1");
                user.setPassword("1");
                List<User> results = userService.getUserByUsernamePassword(user);
                for (User resUser : results) {
                        System.out.println(resUser);
                }
        }

可以查到数据库中符合条件的“用户1”

3.    User getUserByPojoProp(CompPojo comp)对应的xml文件内容如下:
[XML] 纯文本查看 复制代码
<!--根据封装的POJO中的User用户ID 查询用户信息
  其中#{user.id}user为入参POJO的属性,id为user的属性
   -->
  <select id="getUserByPojoProp" resultType="com.itheima.info.domain.User">
          select * from user where id = #{user.id}
  </select>

测试代码如下:
[Java] 纯文本查看 复制代码
@Test
        public void testCompPojo() {
                //封装一个User类 
                User user = new User();
                user.setId(1);
                //将user封装到CompPojo
                CompPojo comp = new CompPojo();
                comp.setUser(user);
                User result = userService.getUserByPojoProp(comp);
                System.out.println(result);
        }

可以查到数据库中符合条件的“用户1”

4.     List<User> selectUserByArray(Integer[] userIds)对应的xml如下:
[XML] 纯文本查看 复制代码
<!-- mybatis对数组的处理  根据用户id 1 2 3查询用户列表
  入参如果是数组类型,则可以直接使用array来接收数据。在<foreach>中的collection属性值array即获取入参数据
  -->
  <select id="selectUserByArray" resultType="com.itheima.info.domain.User" >
    select *
    from user
    <where>
            <foreach collection="array" open="and id in(" close=")"  item="userId" separator=",">#{userId}</foreach>
    </where>
  </select>

测试代码如下:
[Java] 纯文本查看 复制代码
@Test
        public void testArray() {
                //将1,2,3封装到数组 入参
                Integer[] ids = {1,2,3};
                List<User> users = userService.selectUserByArray(ids);
                for (User user : users) {
                        System.out.println(user);
                }
        }
测试结果如下:
[Java] 纯文本查看 复制代码
User [id=1, password=1, username=用户1, birthday=Wed Oct 10 00:00:00 CST 2018]
User [id=2, password=2, username=用户2, birthday=Wed Oct 10 00:00:00 CST 2018]
User [id=3, password=3, username=用户3, birthday=Wed Oct 10 00:00:00 CST 2018]


5.    List<User> selectUserByList(List<Integer> userIds)对应的xml文件如下:
[XML] 纯文本查看 复制代码
<!-- mybatis对集合的处理 根据用户id 1 2 3查询用户列表
  入参类型是List,可以直接使用"list"来获取入参数据,参见<foreach>中collection="list"可以直接遍历入参的集合数据
  -->
  <select id="selectUserByList" resultType="com.itheima.info.domain.User" >
    select *
    from user
    <where>
            <foreach collection="list" item="userId"  open="and id in(" close=")"  separator=",">#{userId}</foreach>
    </where>
  </select>

测试代码如下:
[Java] 纯文本查看 复制代码
@Test
        public void testList() {
                //准备List集合 入参
                List<Integer> ids = new ArrayList<Integer>();
                ids.add(1);
                ids.add(2);
                ids.add(3);
                List<User> users = userService.selectUserByList(ids);
                for (User user : users) {
                        System.out.println(user);
                }
        }

打印结果如下:
[Java] 纯文本查看 复制代码
User [id=1, password=1, username=用户1, birthday=Wed Oct 10 00:00:00 CST 2018]
User [id=2, password=2, username=用户2, birthday=Wed Oct 10 00:00:00 CST 2018]
User [id=3, password=3, username=用户3, birthday=Wed Oct 10 00:00:00 CST 2018]


6.    List<User> selectUserByMap(Map<String,List<Integer>> userIds)对应的xml文件如下:
[XML] 纯文本查看 复制代码
<!-- mybatis对map的处理 
  入参类型为map集合,则可以根据key的名称来取值,比如入参的map中,存在key为userList,可以直接在<foreach>的collection="userList"使用key获取数据
  -->
  <select id="selectUserByMap" resultType="com.itheima.info.domain.User" >
    select *
    from user
    <where>
            <foreach collection="userList" item="userId" open="and id in(" close=")"  separator=",">
                          #{userId}
                  </foreach>
    </where>
  </select>

测试代码如下:
[Java] 纯文本查看 复制代码
@Test
        public void testMap() {
                //向map集合中存放key为userList,value为List集合的数据
                Map<String, List<Integer>> idMap = new HashMap<String, List<Integer>>();
                List<Integer> ids = new ArrayList<Integer>();
                ids.add(1);
                ids.add(2);
                idMap.put("userList", ids);
                List<User> users = userService.selectUserByMap(idMap);
                for (User user : users) {
                        System.out.println(user);
                }
        }

测试结果如下:
[Java] 纯文本查看 复制代码
User [id=1, password=1, username=用户1, birthday=Wed Oct 10 00:00:00 CST 2018]
User [id=2, password=2, username=用户2, birthday=Wed Oct 10 00:00:00 CST 2018]


在mybatis的入参数据获取中,数组和集合的数据类型比较特殊,需要特别注意。

userInfo.zip

1.33 MB, 下载次数: 45

1 个回复

倒序浏览
骚气的很吆~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马