一、输入映射和输出映射

1. parameterType(输入类型)

1.1 传递简单类型

 <select id="getUserById" parameterType="int" resultType="com.cenobitor.pojo.User">
  SELECT `id`,`username`,`birthday`,`sex`,`address` FROM `user` WHERE id = #{id}
</select>

1.2 传递pojo对象

 <insert id="insertUser" parameterType="com.cenobitor.pojo.User">
INSERT INTO USER (`username`,`birthday`,`sex`,`address`)
VALUES (#{username},#{birthday},#{sex},#{address})
</insert>

Mybatis使用ognl表达式解析对象字段的值,#{}或者${}括号中的值为pojo属性名称。

1.3 传递pojo包装对象

 <!-- 1、resultType:如果要返回数据集合,只需设定为每一个元素的数据类型
 2、 包装的pojo取值通过 "."来获取,如取包装的pojo中user属性对象里的username属性的表达式为:user.username
-->
<select id="getUserByQueryVo" parameterType="queryvo" resultType="com.cenobitor.mybatis.pojo.User">
  SELECT * FROM USER WHERE username LIKE '%${user.username}%'
</select>

2. resultType(输出类型)

2.1 输出简单类型

 <!-- 查询用户总记录数,演示返回简单类型 -->
<select id="getUserCount" resultType="int">
  SELECT COUNT(1) FROM USER
</select>

2.2 输出pojo对象:

 <select id="getUserById" parameterType="int" resultType="com.cenobitor.pojo.User">
  SELECT `id`,`username`,`birthday`,`sex`,`address` FROM `user` WHERE id = #{id}
</select>

2.3输出pojo列表

 <select id="getUserById" parameterType="int" resultType="com.cenobitor.pojo.User">
  SELECT `id`,`username`,`birthday`,`sex`,`address` FROM `user` WHERE sex = #{sex}
</select>

2.4 输出resultMap

表字段与pojo属性不一致时引出的resultMap

 <!-- resultMap入门
  type:映射成的pojo类型
  id:resultMap唯一标识
-->
<resultMap type="order" id="orderMap">   <!-- id标签用于绑定主键 -->
  <id property="id" column="id"/>   <!-- 使用result绑定普通字段 -->
  <result property="number" column="number"/>
  <result property="createtime" column="createtime"/>
  <result property="note" column="note"/>
</resultMap> <!-- 使用resultMap -->
<select id="getOrderListResultMap" resultMap="orderMap">
  SELECT * FROM `order`
</select>
二、动态sql

2.1  If

由多查询条件拼装引出if标签。

 <!-- 演示动态sql-if标签的使用情景 -->
<select id="getUserByWhere" parameterType="user" resultType="com.cenobitor.mybatis.pojo.User">
  SELECT * FROM USER where 1 = 1
  <!-- if标签的使用 -->
  <if test="id != null">
    and id = #{id}
  </if>
  <if test="username != null and username != ''">
    and username LIKE '%${username}%'
  </if>
</select>

2.2 Where

 <!-- 演示动态sql-where标签的使用情景 -->
<select id="getUserByWhere2" parameterType="user" resultType="com.cenobitor.mybatis.pojo.User">
  <!-- include:引入sql片段,refid引入片段id -->
  SELECT * FROM USER
  <!-- where会自动加上where同处理多余的and -->
  <where>
    <!-- if标签的使用 -->
    <if test="id != null">
      and id = #{id}
    </if>
    <if test="username != null and username != ''">
      and username LIKE '%${username}%'
    </if>
  </where>
</select>

2.3 Foreach

 <!-- 演示动态sql-foreach标签的使用情景 -->
<select id="getUserByIds" parameterType="queryvo" resultType="com.cenobitor.mybatis.pojo.User">
  SELECT * FROM USER
  <!-- where会自动加上where同处理多余的and -->
  <where>
    <!-- id IN(1,10,25,30,34) -->
    <!-- foreach循环标签
       collection:要遍历的集合,来源入参
       open:循环开始前的sql
       separator:分隔符
       close:循环结束拼接的sql
    -->
    <foreach item="uid" collection="ids" open="id IN(" separator="," close=")">
      #{uid}
    </foreach>
  </where>
</select>

2.4 Sql片段

演示通过select * 不好引出查询字段名,抽取共用sql片段。

① 定义

 <!-- sql片段 定义,id:片段唯一标识 -->
<sql id="user_column">
  `id`, `username`, `birthday`, `sex`, `address`, `uuid2`
</sql>

② 使用

 SELECT
<!-- sql片段的使用:include:引入sql片段,refid引入片段id -->
<include refid="user_column" />
FROM USER
三、关联查询

3.1 一对一关联

① 方法一,使用resultType

 <!-- 一对一关联查询,使用resultType -->
<select id="getOrderUser" resultType="orderuser">
  SELECT
    o.`id`, o.`user_id` userId, o.`number`, o.`createtime`, o.`note`, u.`username`, u.`address`
  FROM `order` o
  LEFT JOIN `user` u
  ON u.id = o.`user_id`
</select>

②方法二,使用resultMap

 <!-- 一对一关联查询-resultMap -->
<resultMap type="order" id="order_user_map">
  <!-- id标签用于绑定主键 -->
  <id property="id" column="id"/>
  <!-- 使用result绑定普通字段 -->
  <result property="userId" column="user_id"/>
  <result property="number" column="number"/>
  <result property="createtime" column="createtime"/>
  <result property="note" column="note"/>
  <!-- association:配置一对一关联
    property:绑定的用户属性
    javaType:属性数据类型,支持别名
   -->
  <association property="user" javaType="com.cenobitor.mybatis.pojo.User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="address" column="address"/>
    <result property="sex" column="sex"/>
  </association>
</resultMap> <!-- 一对一关联查询-使用resultMap -->
<select id="getOrderUser2" resultMap="order_user_map">
  SELECT
  o.`id`,o.`user_id`, o.`number`, o.`createtime`, o.`note`, u.`username`, u.`address`, u.`sex`
  FROM `order` o
  LEFT JOIN `user` u
  ON u.id = o.`user_id`
</select>

3.2一对多关联

 <!-- 一对多关联查询 -->
<resultMap type="user" id="user_order_map">
  <id property="id" column="id" />
  <result property="username" column="username" />
  <result property="birthday" column="birthday" />
  <result property="address" column="address" />
  <result property="sex" column="sex" />
  <result property="uuid2" column="uuid2" />
  <!-- collection:配置一对多关系
    property:用户下的order属性
    ofType:property的数据类型,支持别名
  -->
  <collection property="orders" ofType="order">
    <!-- id标签用于绑定主键 -->
    <id property="id" column="oid"/>
    <!-- 使用result绑定普通字段 -->
    <result property="userId" column="id"/>
    <result property="number" column="number"/>
    <result property="createtime" column="createtime"/>
  </collection>
</resultMap>
<!-- 一对多关联查询 -->
<select id="getUserOrder" resultMap="user_order_map">
  SELECT
  u.`id`, u.`username`,u.`birthday`,u.`sex`,u.`address`,u.`uuid2`,o.`id` oid,o.`number`,o.`createtime`
  FROM `user` u
  LEFT JOIN `order` o
  ON o.`user_id` = u.`id`
</select>

MyBatis入门(二)—— 输入映射和输出映射、动态sql、关联查询的更多相关文章

  1. MyBatis 实践 -动态SQL/关联查询

    MyBatis 实践 标签: Java与存储 动态SQL 动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装. if 对查询条件进行判断,如果输入参数不为空才进行查询条 ...

  2. 【mybatis深度历险系列】mybatis中的输入映射和输出映射

    在前面的博文中,小编介绍了mybatis的框架原理以及入门程序,还有mybatis中开发到的两种方法,原始开发dao的方法和mapper代理方法,今天博文,我们来继续学习mybatis中的相关知识,随 ...

  3. Mybatis学习总结(四)——输入映射和输出映射

    在前面几篇文章的例子中也可以看到mybatis中输入映射和输出映射的身影,但是没有系统的总结一下,这篇博客主要对这两个东东做一个总结.我们知道mybatis中输入映射和输出映射可以是基本数据类型.ha ...

  4. 【MyBatis学习06】输入映射和输出映射

    在前面几篇博文的例子中也可以看到mybatis中输入映射和输出映射的身影,但是没有系统的总结一下,这篇博客主要对这两个东东做一个总结.我们知道mybatis中输入映射和输出映射可以是基本数据类型.ha ...

  5. (七)mybatis 的输入映射与输出映射

    目录 前言 输入映射 - - 传递 pojo 包装类型 (复杂查询 ) 输出映射 - - resultType 输出映射 - - resultMap 前言 通过 paramterType 指定输入参数 ...

  6. 8.mybatis动态SQL模糊查询 (多参数查询,使用parameterType)

    多参数查询,使用parameterType.实例: 用户User[id, name, age] 1.mysql建表并插入数据 2.Java实体类 public class User { public ...

  7. mybatis入门基础(四)----输入映射和输出映射

    一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 1.1.1.需求描述 完成用户信息的综合查询, ...

  8. mybatis基础系列(二)——基础语法、别名、输入映射、输出映射

    增删改查 mapper根节点及其子节点 mybatis框架需要读取映射文件创建会话工厂,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.d ...

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

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

随机推荐

  1. 2018年Android面试题含答案--适合中高级(下)

    这里是我整理出来的面试题,答案我花了很久的时间.加上我自己的理解整理出来的,作者不易,请谅解.有答案的的:https://xiaozhuanlan.com/topic/6132940875   1.A ...

  2. JAVA抽象类和抽象方法(abstract)

    一.抽象(abstract)的使用 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和 ...

  3. Concurrent包工具类使用

    一.读写锁 传统的同步锁就是独占式锁,当线程使用资源时候保持独占,无论读写.当人们发现请求队列(假设)中相邻请求为读-读的时候,阻塞是一种浪费资源的操作.比如公告板,所有路过的人(请求)都是读操作,并 ...

  4. servlet中request和response

    一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...

  5. Linux 删除文件夹和文件的命令(转载)

    Linux 删除文件夹和文件的命令 听语音 | 浏览:93339 | 更新:2013-05-02 18:40 | 标签:linux 文件夹 linux删除目录很简单,很多人还是习惯用rmdir,不过一 ...

  6. EF 通过DataAnnotations配置属性和类型

    一.通过Attribute配置约束 1.主键约束 通过KeyAttribute来配置主键约束,代码如下: [Key] public int PrimaryKey{ get; set; } 2.外键约束 ...

  7. MongoDB运行状态、性能监控,分析

    转载自这位仁兄:地址 mongostat详解 mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者 ...

  8. SPSS学习系列之SPSS Modeler Server是什么?

    不多说,直接上干货! SPSS Modeler 使用客户端/服务器体系结构将资源集约型操作的请求分发给功能强大的服务器软件,因而使大数据集的传输速度大大加快.除了此处所列的产品和更新,也可能还有其他可 ...

  9. 解决linux安装软件依赖的曲线救国方案

    相信大家在一台无法连接外网的linux上安装软件时,对于软件依赖的安装,都会特别头疼,因为软件依赖的安装,不论是其数量,还是安装的复杂度都比软件本身要高出一个维度! 今天就和大家分享一个,解决linu ...

  10. n-grama

    一.N-Gram的原理(这个词出现在句子中出现的概率) N-Gram是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关.(这也是隐马尔可夫当中的假设.)整个句子出现的概率就等于各个词 ...