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. leetcood学习笔记-104-二叉树的最大深度

    题目描述: 第一次提交: class Solution(object): def maxDepth(self, root): """ :type root: TreeNo ...

  2. PHP ftp_rawlist() 函数

    定义和用法 ftp_rawlist() 函数返回 FTP 服务器上指定目录中文件的详细列表. 语法 ftp_rawlist(ftp_connection,dir,recursive) 参数 描述 ft ...

  3. tesserocr与pytesseract模块的使用

    1.tesserocr的使用 #从文件识别图像字符 In [7]: tesserocr.file_to_text('image.png') Out[7]: 'Python3WebSpider\n\n' ...

  4. BZOJ 3626: [LNOI2014]LCA(树剖+差分+线段树)

    传送门 解题思路 比较有意思的一道题.首先要把求\(\sum\limits_{i=l}^r dep[lca(i,z)]\)这个公式变一下.就是考虑每一个点的贡献,做出贡献的点一定在\(z\)到根节点的 ...

  5. NX二次开发-更改图纸尺寸内容(编辑文本)uc5566

    #include <uf.h> #include <uf_drf.h> #include <uf_obj.h> #include <uf_part.h> ...

  6. sql中desc的妙用

    很多情况下对表内部结构不熟悉,想看下我创建的表里面又多少表明,又想他按照首字母的规律排列, 这时候就要用desc +表名了. desc t_bike_info; hive> desc t_bik ...

  7. 阿里云ecs(phpstudy一件包)

            选择语言       保存并连接    Linux硬盘挂载是比较常见的管理操作之一.默认情况下数据盘没有挂载,需要手动挂载到系统中.     具体操作是分三步:     硬盘挂载1)需 ...

  8. [转]C++的Json解析库:jsoncpp和boost

    JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...

  9. CodeForces 1152F1 Neko Rules the Catniverse (Small Version)

    题目链接:http://codeforces.com/problemset/problem/1152/F1 题目大意 有 n 个星球,给定限制 m,从 x 星球走到 y 星球的条件是,$1 \leq ...

  10. 2D转换中的translate里调用matrix()的用法

    一开始,经常看到大佬们用matrix的方法,当时完全不会,不知道如何写.到后面,发现都是这样用,导致只能去认真看一下这个东西怎么用,要不然完全跟不上的节奏啊.因此建议大家去看下这篇文章,写的挺不错的, ...