Mybatis深入了解(四)----输入输出映射
2016-07-16 22:51
351 查看
输入映射
通过parameterType指定输入参数的类型,类型可以是简单类型、hashmap、POJO的包装类型。举个栗子:完成用户信息的综合查询,需要传入条件很复杂(可能包括用户信息、其他信息,比如商品、订单)。传递POJO的包装类对象,看下面的实例:
定义包装类型POJO
针对上面的需求,建议将条件包装进自定义的POJO类中。package cn.itcast.mybatis.po; import java.util.List; /** * 包装类型 * @author Administrator * */ public class UserQueryVo { 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; } //可以包装其他的查询条件,订单、商品 //....
Mapper.xml
在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。<!-- 用户信息综合查询 #{userCustom.sex}:取出pojo包装对象中性别值 ${userCustom.username}:取出pojo包装对象中用户名称 --> <select id="findUserList" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="cn.itcast.mybatis.po.UserCustom"> SELECT * FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.username}%' </select>
Mapper.java
在UserMapper的接口类中定义接口://用户信息综合查询 public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
测试代码
@Test public void testFindUserList() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //创建包装对象,设置查询条件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setSex("1"); userCustom.setUsername("张三丰"); userQueryVo.setUserCustom(userCustom); //调用userMapper的方法 List<UserCustom> list = userMapper.findUserList(userQueryVo); System.out.println(list); }
输出映射
resultType
使用resultType进行输出映射,只有查询出来的列名和POJO中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。
只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。
输出简单类型-需求
用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。Mapper.xml
<!-- 用户信息综合查询总数 parameterType:指定输入类型和findUserList一样 resultType:输出结果类型 --> <select id="findUserCount" parameterType="cn.itcast.mybatis.po.UserQueryVo" resultType="int"> SELECT count(*) FROM USER WHERE user.sex=#{userCustom.sex} AND user.username LIKE '%${userCustom.user}%' </select>
Mapper.java
//用户信息综合查询总数 public int findUserCount(UserQueryVo userQueryVo) throws Exception;
测试代码
@Test public void testFindUserCount() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //创建包装对象,设置查询条件 UserQueryVo userQueryVo = new UserQueryVo(); UserCustom userCustom = new UserCustom(); userCustom.setSex("1"); userCustom.setUsername("张三丰"); userQueryVo.setUserCustom(userCustom); //调用userMapper的方法 int count = userMapper.findUserCount(userQueryVo); System.out.println(count); }
小结
查询出来的结果集只有一行且一列,可以使用 简单类型进行输出映射。输出POJO对象和POJO列表
不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。在mapper.Java指定的方法返回值类型不一样:
1. 输出单个POJO对象,方法返回值是单个对象类型
//根据id查询用户信息 public User findUserById(int id) throws Exception;
2. 输出POJO对象list,方法返回值是List<POJO>
//根据用户名列查询用户列表 public List<User> findUserByName(String name) throws Exception;
生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用 )。
resultMap
mybatis中使用resultMap完成高级输出结果映射。使用方法
如果查询出来的列名和POJO的属性名不一致,通过定义一个resultMap对列名和POJO属性名之间作一个映射关系。>1. 定义resultMap 2. 使用resultMap作为statement的输出类型
将下边的sql使用User完成映射
SELECT id id_,username username_ FROM USER WHERE id=#{value}
User类中属性名和上边查询列名不一致。
定义resultMap
<!-- 定义resultMap 将SELECT id id_,username username_ FROM USER 和User类中的属性作一个映射关系 type:resultMap最终映射的java对象类型,可以使用别名 id:对resultMap的唯一标识 --> <resultMap type="user" id="userResultMap"> <!-- id表示查询结果集中唯一标识 column:查询出来的列名 property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) --> <id column="id_" property="id"/> <!-- result:对普通名映射定义 column:查询出来的列名 property:type指定的pojo类型中的属性名 最终resultMap对column和property作一个映射关系 (对应关系) --> <result column="username_" property="username"/> </resultMap>
使用resultMap作为statement的输出映射类型
<!-- 使用resultMap进行输出映射 resultMap:指定定义的resultMap的id,如果这个resultMap在其它的mapper文件,前边需要加namespace --> <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap"> SELECT id id_,username username_ FROM USER WHERE id=#{value} </select>
Mapper.java
//根据id查询用户信息,使用resultMap输出 public User findUserByIdResultMap(int id) throws Exception;
测试代码
@Test public void testFindUserByIdResultMap() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //创建UserMapper对象,mybatis自动生成mapper代理对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //调用userMapper的方法 User user = userMapper.findUserByIdResultMap(1); System.out.println(user); }
小结
使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。
相关文章推荐
- 视频文件头解析--mpeg-个人对mpg文件结构的理解
- CSS 样式的重置 --设计一款属于自己的重置样式
- 入驻博客
- 读书笔记-现代操作系统-7多媒体操作系统-7.5多媒体进程调度
- Codeforces Round #359 (Div. 2) D. Kay and Snowflake
- POJ 2752 Seek the Name, Seek the Fame
- AngularJs的UI组件ui-Bootstrap分享(八)——Tooltip和Popover
- Android Wi-Fi — IP forward — ndc — netd
- 数据结构(java)----MyArrayList
- HighAvailability
- Android 学习杂记
- 算法_散列表
- http://fxz.51kdn.cn/post-139.html
- Android View的scrollTo(),scrollBy(),getScrollX(),getScrollY()
- 89. Gray Code
- 51 Nod 1134 最长递增子序列 LIS NlogN 写法
- 深拷贝与浅拷贝区别
- DICOM:fo-dicom、dcm4che14、dcm4chee等开源库持续自我维护
- JZOJ4632. 【SCOI2016】幸运数字
- php设计模式-单例模式