一、传入包装类
java是面对对象编程的,有些基本数据类型不能面向对象编程,把我们需要的数据类型封装进一个类里进行使用,形成包装类。(这是我自己的浅薄的理解)
我在网上参考了一些别人的文章。我觉得以下两篇写的很好,把他们的链接贴出来,学习!
https://www.cnblogs.com/javastack/p/9644520.html
https://blog.csdn.net/weixin_40739833/article/details/80093527
在mybatis操作时,有时会遇到查询多表数据,这时候可能需要一个包装类将多个实体类封装起来进行查询。这里封装一个最简单的User类进行示范。
1、编写包装类findByIdByVo
package com.zwj.VO;
import com.zwj.model.User;
import java.util.List;
public class findByIdByVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2、在mapper文件中添加方法,此时参数应为包装类findByIdByVo
public User findUser(findByIdByVo finduserbyvo);
3、在映射文件中,编写映射,
<select id="findUser" parameterType="com.zwj.VO.findByIdByVo" resultType="user">
<!--以下user.id是包装类中的属性user字段的属性-->
select * from user where id=#{user.id}
</select>
4、测试
@Test
public void test1(){
findByIdByVo user=new findByIdByVo();
User user1=new User();
user1.setId(10);
user.setUser(user1);
UserMapper userMapper=session.getMapper(UserMapper.class);
User user2=userMapper.findUser(user);
System.out.println(user2);
}
我发现大家在配置映射文件时返回参数都写我们所需要的实体类(在上面的例子中我也是这样)。我想为什么没人写包装类呢?然后我就试了一下,其实是可以的,但是在映射文件中一定要为包装类的属性配置resultMap,不然的结果就是可以查出来,但是输出打印的时候会报空指针错误。
思考了一下,返回参数设置为包装类会比较麻烦,因为每次都要为里面的属性配置resultMap,如果属性中有多个实体类这就更麻烦了。所以还是返回参数直接设置为我们需要的实体类模型就可以了。
返回包装类和返回实体类代码基本差不多,改一个返回类型,然后在映射文件中添加一个resultMap就可以,我就不贴啦。
二、传入Mapwo
1、在mapper接口中添加方法
public List<User> findUserListByMap(Map<String,Object> map);
2、编写映射文件,注意传入参数是hashMap
<select id="findUserListByMap" parameterType="hashMap" resultType="user">
<!--占位符里面的username,sex要跟测试代码压入map里面的变量名称一样-->
select * from user where username like '%${username}%' and sex=#{sex}
</select>
3、测试
@Test
public void test2(){
UserMapper userMapper=session.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
//把参数put进去
map.put("username","张");
map.put("sex","2");
List<User> list=userMapper.findUserListByMap(map);
System.out.println(list);
//session.commit();
}