上一篇: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 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我的失误。。。)
结果如下:
说道这里,你会发现其实这一部分主要就是一个思想性的东西而已。
该方式和上一个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讲解