MyBatis知识点复习-06parameter传入包装类查询条件与map的讲解

MyBatis知识点复习-06parameter传入包装类查询条件与map的讲解

上一篇:MyBatis知识点复习-05加载映射文件的几种方式

下一篇:MyBatis知识点复习-07resultType与resultMap讲解
本节主要讲解在查询数据中参数类型传递的一些知识。

一.包装类传递

在开始讲解前我需要大家先看看这篇文章 POJO和JavaBean的区别这个问题也是面试时回问到的基础问题,标题已经说了我们要传递的是包装类,那么这里你可以理解为POJO包装对象(简单Java对象),还记得前面的这样的内容吗:

<insert id="saveUser" parameterType="domain.User">
   insert into user (username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})
</insert>

看到上面的**parameterType=“domain.User”**这里就是传递的POJO对象,那么现在我们有个疑问了,什么是POJO包装类对象呢?
比如我要查询一个用户的信息,还记得以前讲过的查询获取一个User对象怎么做到的吗?这是我在第一篇入门案例用到的配置文件的信息

<select id="findUserById" parameterType="int" resultType="domain.User">
        select  * from user where id = #{id}
    </select>

这里的findUserById不是真实存在的,一切交给了mybatis,并且在测试文件中我们用到selectOne函数去实现的,当然如果返回值不止一个User可以用List<User>

 User findUserById = (User)sqlSession.selectOne("findUserById", 10);

这里是让大家大概回顾一下我们以前的查询条件,一般都是条件都是局限在User对象的属性范围类的,为更好理解,下面是user表的字段,
在这里插入图片描述
我们之前都是通过id,username,birthday,sex,address,或者如果要前面这几种多个条件满足我们创建User对象把属性值传到该对象在把对象作为参数传递个函数。
下面我们再来看一张与user表有关的表orders表
在这里插入图片描述
现在我要求查询sex为1(我没写错就是1,表中数据是这样的,如果你不清楚说明你没看前面的文章,相关的资料我都在第一篇文章分享过了)且他在orders表中的number值为1000010,那你还可以像前面那样来传递参数吗?显然不可以,于是我们可以考虑创建一个POJO类叫做UserQueryVO,他拥有User与Orders成员对象。


现在我们终于进入正题了
我们先创建下面这个POJO包装类对象:

package vo;
import domain.Orders;
import domain.User;

public class UserQueryVO {
    private User user;
    public Orders getOrders() {
        return orders;
    }
    public void setOrders(Orders orders) {
        this.orders = orders;
    }

    private Orders orders;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

接下来在UserMapper接口里面加上下面函数

    public List<User> findUsers(UserQueryVO userQueryVO);

然后再SqlMapConfig里面的typeAliases标签修改为下面

    <typeAliases>  
        <typeAlias type="vo.UserQueryVO" alias="vo"></typeAlias>
        <package name="domain"/>
    </typeAliases>

这里提醒一下typeAlias必须在package前面否则报错
mapper/UserMapper.xml文件里加上下面这段

  <select id="findUsers" parameterType="vo" resultType="user">
      SELECT u.* FROM USER u,orders o WHERE u.id = o.user_id AND sex = #{user.sex} AND number = #{orders.number} 
  </select>

将TestUser.java的Test文件内容改为如下:

   UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        UserQueryVO userQueryVO  = new UserQueryVO();
        User user = new User();
        user.setSex("1");
        userQueryVO.setUser(user);
        Orders orders = new Orders();
        orders.setNumber("1000010");
        userQueryVO.setOrders(orders);
        List<User> users = mapper.findUsers(userQueryVO);
       // mapper.saveUser(user);
        System.out.println(users);
        sqlSession.commit();//提交事务,否则会事务回滚

为方便演示将orders表数据做如下修改(那个x是3我的失误。。。)
在这里插入图片描述
在这里插入图片描述
结果如下:在这里插入图片描述
说道这里,你会发现其实这一部分主要就是一个思想性的东西而已。

二.Map对象的传递

该方式和上一个POJO包装类传递大同小异。
现在UserMapper接口里面加上下面这个方法:

public List<User> findUserByMap(Map<String,String> map);

接下来在mapper/UserMapper.xml文件里加上下面这段

    <select id="findUserByMap" resultType="User" parameterType="java.util.Map">
        select * from user where sex = #{sex} and username = #{username}
    </select>

关于这里的#{sex}与#{username}为什么这样写,是因为在传递map集合时传入的key的名字叫做这两个(你看我下面的TestUser.java里面的Tset的方法就明白了),最后有个小点,就是这里的java.util.Map可以直接写为hashmap(当然传参数要是这个才行),map,Map,mAp反正是这样的字母就OK,大小写无所谓,为什么可以这样呢?这就是涉及到mybatis的底层实现的原理,关于Mybatis框架的源码解析我后面会出专栏教程来讲解,读完你会豁然开朗(最近学习忙碌没有时间)
Tset方法的代码:

 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        HashMap<String, String> map = new HashMap<>();
        map.put("sex","1");
        map.put("username","张小明");
        List<User> userByMap = mapper.findUserByMap(map);
        System.out.println(userByMap);
        sqlSession.commit();//提交事务,否则会事务回滚

结果如下:
在这里插入图片描述
上一篇:MyBatis知识点复习-05加载映射文件的几种方式
下一篇:MyBatis知识点复习-07resultType与resultMap讲解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值