1. 输入映射

​ 通过paramterType指定输入参数的类型,类型可以是简单类型、hashmap、pojo的包装类、

1.1 传递pojo的包装对象

1.需求

​ 完成用户信息的综合查询,需要传入查询条件很复杂(可能包括用户信息、其它信息,比如商品、订单的)

2.定义包装类型pojo

​ 针对上边需求,建议使用自定义的包装类型的pojo,在包装类型的pojo中将复杂的查询条件包装进去。

/**
* Description: 查询时,将多个对象的属性集合在此类
* User: jiatp
* Date:2019/9/3 0003 下午 4:39
*/ public class UserQueryVo {
//用户的查询条件
private UserCustom userCustom;
//传入多个id
private List<Integer> ids;
//可以包装其它信息,商品,订单 等 public List<Integer> getIds() {
return ids;
} public void setIds(List<Integer> ids) {
this.ids = ids;
} public UserCustom getUserCustom() {
return userCustom;
} public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}

3.mapper.xml

在UserMapper.xml中定义用户信息综合查询(查询条件复杂,通过高级查询进行复杂关联查询)。

  <select id="findUserList" parameterType="UserQueryVo" resultType="UserCustom">
select * from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'
</select>

4.mapper.java

// 用户信息的综合查询
public List<UserCustom> findUserList(UserQueryVo userQueryVo);

5.测试代码

public class MybatisThird {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws IOException {
//mybatis配置文件
String resource = "com/mybatis/config/sqlMapConfig.xml";
//得到配置文件流
InputStream resourceAsStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
}
//综合查询,用户的所有信息
@Test
public void findUserList(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
//创建包装对象
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
// userCustom.setSex("2");
userCustom.setUsername("李四");
userQueryVo.setUserCustom(userCustom);
//调用查询
List<UserCustom> userList = mapper.findUserList(userQueryVo);
for(UserCustom us:userList) {
System.out.println(us);
}
}
}

2. 输出映射

2.1 resultType

** 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。**

如果查询出来的列名和pojo中的属性名全部不一致,没有创建pojo对象。只要查询出来的列名和pojo中的属性有一个一致,就会创建pojo对象。

1. 输出简单类型

​ 如:用户信息的综合查询列表总数,通过查询总数和上边用户综合查询列表才可以实现分页。

mapper.xml

 <!--用户信息查询总数
parameterType:指定输入参数与findUserList一样
-->
<select id="findUserCount" parameterType="UserQueryVo" resultType="int">
select count(1) from user where user.sex=#{userCustom.sex} and user.name like '%${userCustom.username}%'
</select>

mapper.java

 //用户信息总数查询
public int findUserCount(UserQueryVo userQueryVo);

测试代码

//查询用户信息的总数
@Test
public void findUserCount(){
SqlSession sqlSession = sqlSessionFactory.openSession();
UserQueryVoMapper mapper = sqlSession.getMapper(UserQueryVoMapper.class);
//创建包装对象
UserQueryVo userQueryVo = new UserQueryVo();
UserCustom userCustom = new UserCustom();
userCustom.setSex("2");
userCustom.setUsername("李四");
userQueryVo.setUserCustom(userCustom);
//调用查询
int count = mapper.findUserCount(userQueryVo);
System.out.println(count);
}

总结:查询出来的结果集只有一行且一列,可以使用简单类型进行输出映射。

2.输出pojo对象和pojo列表**

​ 不管是输出的pojo单个对象还是一个列表(list中包括pojo),在mapper.xml中resultType指定的类型是一样的。在mapper.java指定的方法返回值类型不一样:

​ 1、输出单个pojo对象,方法返回值是单个对象类型

 //根据用户id查询用户信息,使用resultMap输出
public User findUserByIdResultMap(int id);
	2、输出pojo对象list,方法返回值是List<Pojo>
//根据用户名查询用户列表
public List<User> findUserByName(String name) throws Exception;

生成的动态代理对象中是根据mapper方法的返回值类型确定是调用selectOne(返回单个对象调用)还是selectList (返回集合对象调用).

2.2 resultMap

resultMap使用方法

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。

1、定义resultMap

2、使用resultMap作为statement的输出映射类型

将下边的sql使用User完成映射

SELECT id id_,username username_ FROM USER WHERE id=#{value}

User类中属性名和上边查询列名不一致。

mapper.xml

 <!--使用resultMap进行输出映射
1.定义resultMap type:resultMap最终映射的java对象类型,可以使用别名;
id:resultMap的标识
-->
<resultMap id="UserResultMap" type="user">
<!--id表示查询结果集中唯一标识-->
<id column="id_" property="id"/>
<result column="username_" property="username"/>
</resultMap>
<!--resultMap:即是前面定义的resultMap的id-->
<select id="findUserByIdResultMap" parameterType="int" resultMap="UserResultMap">
select id id_,username username_ from user where id=#{id}
</select>

总结:

使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。

如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo****属性名之间作一个映射关系。

04_Mybatis输入\出映射的更多相关文章

  1. Java中的字节输入出流和字符输入输出流

    Java中的字节输入出流和字符输入输出流 以下哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...

  2. 使用div 的 contenteditable属性,实现输入编辑,输入 "#" 出现下拉选择

    文章原文:https://www.cnblogs.com/yalong/p/11883585.html 演示效果如下:   具体代码可以看 https://github.com/YalongYan/e ...

  3. mybatis系列-07-输出映射

    7.1     resultType 使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功. 如果查询出来的列名和pojo中的属性名全部不一致,没有创建 ...

  4. MaBatis(5)输入/输出映射

    本次全部学习内容:MyBatisLearning   输入映射: 通过parameType指定输入参数的类型,类型可以是简单类型,hashmap,pojo等     传递pojo的包装对象 需求: 即 ...

  5. [C]语法, 知识点总结(一. 进制, 格式化输入/出, 指针)

    进制 概念: n进制, 最大的数是n-1, 逢n进1位. 数据类型 概念: 其实就是占的位数不同, 转换到计算机当中都是0和1. 常用: 类型名 占字节数 描述 char 1字节=8个二进制位 字符类 ...

  6. 文件I/O操作为什么叫输入/出流

    参考以下文档: http://blog.csdn.net/hguisu/article/details/7418161 我们关注的焦点是错误的,重点不在文件,我们关注的核心是数据流. 这种流可以是文本 ...

  7. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程

    1. 学习计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Foreach标签 3.关联查询 a) 一对 ...

  8. Mybatis输入映射和输出映射

    本节内容: 输入参数映射 输出映射 resultMap Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 一.环境准备 复制 ...

  9. iBatis.Net(C#)SQL数据映射

    转载请注明 http://www.cnblogs.com/13590/archive/2013/03/01/2938126.html 摘要:本文探讨了iBatis.Net框架的XML数据映射文件各配置 ...

随机推荐

  1. leetcode-159周赛-5232-替换子串得到平衡字符串*

    题目描述: 方法: 另: class Solution: def balancedString(self, s: str) -> int: n, req = len(s), len(s) // ...

  2. Spring使用Redis

    1.引入依赖 <dependency> <groupId>org.springframework.data</groupId> <artifactId> ...

  3. luoguP3799 妖梦拼木棒 [组合数学]

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法? 输入输出格式 输入格式: 第一行一个整数n 第二行n个整数 ...

  4. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

  5. bzoj1070题解

    [解题思路] 考虑拆点,得到一个二分图:左边点<i,j>表示第i个技师按顺序第j辆修的车,右边点k表示第k个车主,连接左右的边表示第k个车主可能成为第i个技师的第j个客户. 因为是二分图, ...

  6. 互联网公司java面试题(一)

    1.JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库.通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 件 ...

  7. Java-Class-C:org.springframework.http.HttpHeaders

    ylbtech-Java-Class-C:org.springframework.http.HttpHeaders 1.返回顶部 1.1. import org.springframework.htt ...

  8. 全面解读PHP面试

    php面试考察点    1.PHP基础知识 引用变量 常量及数据类型 运算符及流程控制 自定义函数及内部函数 正则表达式 文件及目录处理 会话控制 面向对象 网络协议 开发环境相关考点 2.JavaS ...

  9. 基于Netty的RPC架构学习笔记(七):netty学习之心跳

    文章目录 idleStateHandler netty3

  10. 【JUC】JDK1.8源码分析之AbstractQueuedSynchronizer

    一.前言 在锁框架中,AbstractQueuedSynchronizer抽象类可以毫不夸张的说,占据着核心地位,它提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.所以很有必 ...