输入输出映射
通过 parameterType 制定输入参数类型 类型可以是简单类型 (int String) 也可以是 POJO 本身 或者包装类
1 输入映射
关于输入简单类型和 pojo 本身的我就不写了,因为比较简单,下面我主要举一个包装类的例子:
使用包装类 POJO 将复杂的查询条件封装到 POJO 中
- 1 //当你继承user属性后,你就可以在user的基础上添加自己的属性了
- 2 public class UserCustomer extends User {
- 3
- 4 //用户的基本信息
- 5 //可以扩展用户的信息
- 6 //其他信息
- 7 }
查询条件封装的类
- 1 public class UserQueryVo {
- 2
- 3 //这里包装需要查询的条件
- 4
- 5 private UserCustomer userCustomer;
- 6
- 7 public UserCustomer getUserCustomer() {
- 8 return userCustomer;
- 9 }
- 10
- 11 public void setUserCustomer(UserCustomer userCustomer) {
- 12 this.userCustomer = userCustomer;
- 13 }
UserMapper.xml
- 1 < !--2# {
- userCustomer.sex
- }取出pojo对象中性别的属性值3 $ {
- userCustomer.username
- }取出pojo中用户的名称4-->5 < select id = "findUserList"parameterType = "com.study.model.UserQueryVo"resultType = "com.study.model.UserCustomer" > 6 select * from user where user.sex = # {
- userCustomer.sex
- }
- and user.username like '%${userCustomer.username}%'7 < /select/
UserMapper.java
- //用户综合信息查询
- public List findUserList(UserQueryVo userQueryVo) throws Exception;
测试代码
- 1 @Test
- 2 public void testFindUserList() throws Exception{
- 3 SqlSession sqlSession =sqlSessionFactory.openSession();
- 4 //创建UserMapper 对象 MyBatis自动生成代理对象
- 5 UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
- 6
- 7 //创建包装对象 设置查询条件
- 8 UserQueryVo userQueryVo =new UserQueryVo();
- 9
- 10 UserCustomer userCustomer =new UserCustomer();
- 11 userCustomer.setSex("1");
- 12 userCustomer.setUsername("小明");
- 13 userQueryVo.setUserCustomer(userCustomer);
- 14
- 15 //完成查询
- 16 List list =userMapper.findUserList(userQueryVo);
- 17 System.out.println(list);
- 18
- }
2. 输出映射
(1)resultType
使用 resultType 进行输出映射的时候 只有查询出来的列名和 pojo 对应的属性名完全一致 才可以映射
如果查询出来的列名和 pojo 中的属性完全不一致 没有创建 pojo 对象
如果查询出来的列名和 pojo 中的属性只有部分一致 ,就会创建 pojo 对象 ,不一致的属性值为 null
举例:查询用户总人数
mapper.xml
- 1 <!-- 7综合查询 -->
- 2 <select id="findUserCount" parameterType="com.guigu.model.UserQueryVo" resultType="int">
- 3 select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
- 4 </select>
mapper.java
public int findUserCount(UserQueryVo userQueryVo);
测试代码
- @Test
- public void testFindUserCount() throws Exception{
- SqlSession sqlSession =sqlSessionFactory.openSession();
- //创建UserMapper 对象 MyBatis自动生成代理对象
- UserMapper userMapper =sqlSession.getMapper(UserMapper.class);
- //创建包装对象 设置查询条件
- UserQueryVo userQueryVo =new UserQueryVo();
- UserCustomer userCustomer =new UserCustomer();
- userCustomer.setSex("1");
- userCustomer.setUsername("小明");
- userQueryVo.setUserCustomer(userCustomer);
- int count =userMapper.findUserCount(userQueryVo);
- System.out.println(count);
- }
在输出参数中,不论你返回的是单个对象还是对象的集合,在 resulttype 中都只需要写该对象的全名称就可以了
(2)resultMap
resultMap 到底做什么用的呢?下面我来举个例子:
比如有下面的 mapper.xml 配置
- <!-- mapper执行语句 -->
- <!--
- #{userCustomer.sex} 取出pojo对象 中性别的属性值
- ${userCustomer.username}取出pojo中 用户的名称
- -->
- <select id="findUserList" parameterType="com.guigu.model.UserQueryVo" resultType="com.guigu.model.UserCustomer">
- select id id_,username username_,birthday birthday_,address from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%'
- </select>
那么运行的输出结果:会发现只有地址能够完成赋值,而其它因为采用别名无法赋值:
得出结论:
如果查询出来的列名和 pojo 中的属性完全不一致 没有创建 pojo 对象
如果查询出来的列名和 pojo 中的属性只有部分一致 ,就会创建 pojo 对象 ,不一致的属性值为 null
上面的问题那如何解决,其实也很简单就是配置 resultMap:
- <!--
- type resultMap最终映射的java对象类型 可以使用别名,因为本来是要写类的全名称,这里输入的就是别名
- id 对resultMap唯一的标识符,这里的id要和下面的resultMap中的内容一致
- -->
- <resultMap type="user" id="userResultMap">
- <!--
- id表示查询结果集中唯一的标识 主键
- column 查询出来的列名
- property type pojo中对应的属性名
- -->
- <id column="id_" property="id"/>
- <!--
- result对普通名的映射
- column 查询出来的列名
- property type pojo中对应的属性名
- -->
- <result column="username_" property="username"/>
- <result column="birthday_" property="birthday"/>
- </resultMap>
- <!-- 配置结果集类型 -->
- <select id="findUserByIdResultMap" parameterType="int" resultMap="userResultMap">
- select id id_,username username_,birthday birthday_,address from user where id=#{value}
- </select>
总结:
使用 resultType 进行输出映射 只有查询出来的列名 和 pojo 中的属性名一致的时候才可以映射成功 。
如果查询出来的列名和 pojo 属性名不一致 可以通过定义一个 resultMap 对列名和 pojo 属性之间做一个映射。
本文就讲到这里,欢迎大家多多指点,哪里需要修正或者补充,欢迎留言,谢谢!
来源: http://www.cnblogs.com/qdhxhz/p/6498642.html