6.输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型,hashmap,pojo的包装类型
1.传递pojo的包装对象。
1.需求
完成用户信息综合查询,需要传入查询条件很复杂(可能包括用户信息,其他信息,比如商品,订单)
2.定义包装类型pojo
针对上述需求,建议使用自定义pojo类型
在包装类型的pojo中将复杂的查询条件包装进去
eg
1.新建UserQueryVo
public class UserQueryVo {
//传入多个id
private List<Integer> ids;
//包装查询条件
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
public List<Integer> getIds() {
return ids;
}
public void setIds(List<Integer> ids) {
this.ids = ids;
}
}
2.在映射文件中添加
<!-- 根据性别用户名 综合查询
#{userCustom.sex}取出pojo对象的性别
'%${userCustom.username}%' 取出pojo包装对象的行名-->
<select id="findUserList" parameterType="cn.mybatis.po.UserQueryVo" resultType="cn.mybatis.po.UserCustom">
select * from user where user.sex = #{userCustom.sex} and user.username like '%${userCustom.username}%'
</select>
3.接口定义
public List<UserCustom> findUserList(UserQueryVo userQuerVo) throws Exception;
4.测试类
@Test
public void testFindUserList() throws Exception{
//获取Session
SqlSession session = sqlSessionFactory.openSession();
//获取Mapper代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryVo queryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("1");
userCustom.setUsername("zhang");
queryVo.setUserCustom(userCustom);
List<UserCustom> list = userMapper.findUserList(queryVo);
System.out.println(list);
session.close();
}
7.输出映射 resultType
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功
如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象
1.输出简单类型
1.需求
用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页
eg
1.映射文件
<!-- 查询用户总数 -->
<select id="findUserCount" parameterType="cn.mybatis.po.UserQueryVo" resultType="int">
select count(*) from user where user.sex = #{userCustom.sex} and user.username like '%${userCustom.username}%'
</select>
2.接口定义
public int findUserCount(UserQueryVo userQuerVo) throws Exception;
3.测试类
@Test
public void testFindUserCount() throws Exception{
//获取Session
SqlSession session = sqlSessionFactory.openSession();
//获取Mapper代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryVo queryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
//sql动态测试
userCustom.setSex("1");
userCustom.setUsername("明");
queryVo.setUserCustom(userCustom);
List<Integer> ids = new ArrayList<Integer>();
ids.add(10);
ids.add(22);
queryVo.setIds(ids);
int count = userMapper.findUserCount(queryVo);
System.out.println(count);
session.close();
}
2.输出pojo对象和pojo列表
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType 指定的类型是一样的,在mapper.java指定的方法返回值类型不一样
1.输出单个pojo对象,方法返回值是单个对象
public User findUserById(int id) throws Exception;
2.输出pojo对象list,方法返回值是List<pojo>
public List<User> findUserByName(String username) throws Exception;
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne还是返回selectList
7.resultMap
mybatis中使用resultMap完成高级输出结果映射
1.resultMap使用方法
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultType对列名和pojo属性名之间做一个映射关系
1.定义resultMap
2.使用resultMap作为statement的输出映射类型
2.将下边的sql使用User完成映射
Select id id_,username username_ from user where id=#{value}
User类中属性名和上边查询列名不一致
eg
1.在映射文件定义resultMap
<!-- 定义resultMap
type java对象的类型 可支持别名
id resultmap的唯一标识 -->
<resultMap type="user" id="userResultMap">
<!-- id表示结果集中唯一的标识
column: 查询出来的列名
property type指定的pojo类型的属性名-->
<id column="id_" property="id"/>
<!-- 定义普通字段
column: 查询出来的列名
property type指定的pojo类型的属性名-->
<result column="username_" property="username"/>
</resultMap>
<!-- 使用resultmap输出映射 -->
<select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
select id id_, username username_ from user where id = #{value}
</select>
2.接口定义
public User findUserByIdResultMap(int id) throws Exception;
3.测试类
@Test
public void testFindUserByIdResultMap() throws Exception{
//获取Session
SqlSession session = sqlSessionFactory.openSession();
//获取Mapper代理对象
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.findUserByIdResultMap(1);
System.out.println(user);
session.close();
}
小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。
如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间做一个映射关系。