映射器配置文件

原创 2016年06月01日 23:32:56

映射器配置文件


案例背景

employee员工表、dept部门表

基本配置

deptMapper.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<!-- 使用Mapper接口方式时,注意namespace是和Mapper接口全限定名一致的 -->
<mapper namespace="com.xuyi.usemybatis.dao.DeptMapper">
    <!-- 映射javabean的类型 -->
    <resultMap id="BaseResultMap" type="com.xuyi.usemybatis.pojo.Dept">
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="dept_name" property="deptName" jdbcType="VARCHAR" />
        <result column="dept_info" property="deptInfo" jdbcType="VARCHAR" />
    </resultMap>

    <!-- 简化sql语句 -->
    <sql id="Base_Column_List">
        id, dept_name, dept_info
    </sql>

    <!-- 根据主键查询表记录,查询返回结果类型通常使用resultMap类型 -->
    <select id="selectByPrimaryKey" resultMap="BaseResultMap"
        parameterType="java.lang.Integer">
        select
        <include refid="Base_Column_List" />
        from dept
        where id = #{id,jdbcType=INTEGER}
    </select>
    <!--#{} 是表示占位符类似jdbc中的 ? 占位符-->

    <!-- 根据主键删除表记录 -->
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        delete from dept
        where id = #{id,jdbcType=INTEGER}
    </delete>

    <!-- 插入表记录(非空插入) -->
    <insert id="insertSelective" parameterType="com.xuyi.usemybatis.pojo.Dept">
        insert into dept
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="deptName != null">
                dept_name,
            </if>
            <if test="deptInfo != null">
                dept_info,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id,jdbcType=INTEGER},
            </if>
            <if test="deptName != null">
                #{deptName,jdbcType=VARCHAR},
            </if>
            <if test="deptInfo != null">
                #{deptInfo,jdbcType=VARCHAR},
            </if>
        </trim>
    </insert>

    <!-- 根据主键更新(指定属性更新非空属性更新) -->
    <update id="updateByPrimaryKeySelective" parameterType="com.xuyi.usemybatis.pojo.Dept">
        update dept
        <set>
            <if test="deptName != null">
                dept_name = #{deptName,jdbcType=VARCHAR},
            </if>
            <if test="deptInfo != null">
                dept_info = #{deptInfo,jdbcType=VARCHAR},
            </if>
        </set>
        where id = #{id,jdbcType=INTEGER}
    </update>

    <!-- 根据主键更新(不提推荐这种方式) -->
    <update id="updateByPrimaryKey" parameterType="com.xuyi.usemybatis.pojo.Dept">
        update dept
        set
        dept_name = #{deptName,jdbcType=VARCHAR},
        dept_info =
        #{deptInfo,jdbcType=VARCHAR}
        where id = #{id,jdbcType=INTEGER}
    </update>

</mapper>

动态SQL

if

The most common thing to do in dynamic SQL is conditionally include a part of a where clause. For example:

<select id="findActiveBlogWithTitleLike"
 resultType="Blog">
    SELECT * FROM user
    WHERE 1=1
    <if test="userId != null">
    AND user_id =#{userId}
    </if>
</select>
<!--注意1=1这句是精髓啊,o(^▽^)o -->

choose, when, otherwise

Sometimes we don’t want all of the conditionals to apply, instead we want to choose only one case among many options. Similar to a switch statement in Java, MyBatis offers a choose element.

<select id="findActiveBlogLike"
 resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
      <choose>
            <when test="title != null">
              AND title like #{title}
            </when>
            <when test="author != null and author.name != null">
              AND author_name like #{author.name}
            </when>
            <otherwise>
              AND featured = 1
            </otherwise>
      </choose>
</select>   

trim, where, set

The previous examples have been conveniently dancing around a notorious dynamic SQL challenge. Consider what would happen if we return to our “if” example, but this time we make “ACTIVE = 1” a dynamic condition as well.

<select id="findActiveBlogLike"
 resultType="Blog">
  SELECT * FROM BLOG 
      <where> 
            <if test="state != null">
                 state = #{state}
            </if> 
            <if test="title != null">
                AND title like #{title}
            </if>
            <if test="author != null and author.name != null">
                AND author_name like #{author.name}
            </if>
      </where>
</select>

where 元素知道只有在一个以上的if条件有值的情况下才去插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

如果 where 元素没有按正常套路出牌,我们还是可以通过自定义 trim 元素来定制我们想要的功能。比如,和 where 元素等价的自定义 trim 元素为:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
    ... 
</trim>

类似的用于动态更新语句的解决方案叫做 set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

同理:
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

foreach

Another common necessity for dynamic SQL is the need to iterate over a collection, often to build an IN condition. For example:

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如:

<select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      </foreach>
</select>

The foreach element is very powerful, and allows you to specify a collection, declare item and index variables that can be used inside the body of the element. It also allows you to specify opening and closing strings, and add a separator to place in between iterations. The element is smart in that it won’t accidentally append extra separators.

NOTE You can pass any Iterable object (for example List, Set, etc.), as well as any Map or Array object to foreach as collection parameter. When using an Iterable or Array, index will be the number of current iteration and value item will be the element retrieved in this iteration. When using a Map (or Collection of Map.Entry objects), index will be the key object and item will be the value object.

This wraps up the discussion regarding the XML configuration file and XML mapping files. The next section will discuss the Java API in detail, so that you can get the most out of the mappings that you’ve created.

一对多和多对一

其实在互联网企业中,很少在javabean中体现出关联关系(使用引用),而是保存一个关联的记录的主键属性即可。

一对多举例:

//员工表
public class Employee {
    private int id;
    private String name;
    //站在数据库角度通常是这样设计的
    private int deptId;
}

//部门表
public class Dept {
    private int id;
    private String name;
    //站在oop思想上这样子设计是更合理的.
    //private List<Employee> employees;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[MyBatis日记](3)映射器配置文件与映射器接口

前一篇文章中我们介绍了如何使用MyBatis创建一个简单的项目,我们已经看见了一些映射器配置文件中配置基本的映射语句,以及怎样使用SqlSession对象调用它们的例子。 1. 前景回顾 现...
  • SunnyYoona
  • SunnyYoona
  • 2016年02月13日 22:33
  • 2273

Mybatis之映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法...
  • msj_god_boy
  • msj_god_boy
  • 2016年09月21日 21:08
  • 731

【SSM-SpringMVC框架】非注解的处理器适配器和映射器

1.非注解的处理器映射器:   1.处理器映射器:(HandlerMapping)    处理器映射器负责根据request请求找到对应Handler处理器及Intercepter拦截器,将他们封...
  • f627422467
  • f627422467
  • 2016年04月14日 10:50
  • 495

MyBatis 使用笔记(3) Mapper映射器详解

上一篇文章 给大家讲了MyBatis的详细配置,这篇文章就给大家讲讲MyBatis在使用过程中最重要的东西Mapper映射器在使用上 主要分以下几种: 元素 说明 1.select 查询...
  • brok1n
  • brok1n
  • 2017年03月28日 16:13
  • 934

04.Mybatis初级使用-Mapper映射器(一)

Mapper映射器是Mybatis中的核心工具,也是Mybatis的核心功能。通过映射器,我们可以自定义SQL语句,灵活的操作数据库,这也是Mybatis的特色所在。所以,熟练使用映射器是掌握Myba...
  • luzhen1012
  • luzhen1012
  • 2017年03月20日 18:28
  • 1071

注解的处理器映射器和适配器

原文地址:http://brianway.github.io/2016/03/30/springmvc-learn-3-Annotation/ 默认加载 前端控制器从\org\spri...
  • qq_30747531
  • qq_30747531
  • 2016年08月05日 11:09
  • 1256

注解的映射器和适配器

多个映射器多个适配器可以共存。   在springmvc.mvc中把适配器和映射器的配置删除后发现项目继续执行。因为在DispatcherServlet.properties中,前端控制从它中加载映射...
  • u013310119
  • u013310119
  • 2016年06月17日 13:41
  • 814

mybatis的映射器(mappers)学习理解

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。 Java 在自动查找这方面没有提供一个很好的方法...
  • xiaozaq
  • xiaozaq
  • 2017年01月11日 13:27
  • 1584

MyBatis使用大全(5)------映射器类

MyBatis的SqlSession中包括方法,映射sql等等。 SqlSession中包括了很多方法,简单截了个图如下: 包括了增删改查等方法以及方法的多种重载形式等等。 直接使用Sq...
  • helongzhong
  • helongzhong
  • 2017年01月04日 17:20
  • 644

springmvc学习笔记(3)-注解的处理器映射器和适配器

本文主要介绍注解的处理器映射器和适配器相关配置
  • h3243212
  • h3243212
  • 2016年03月09日 12:09
  • 3969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:映射器配置文件
举报原因:
原因补充:

(最多只允许输入30个字)