Mybatis_mapper.xml中常用的标签详解

一、SQL语句标签:

<!--查询语句-->  
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >  
    select   
  </select>  

<!--插入语句-->  
<insert id="insert" parameterType="pojo.OrderTable" >  
 insert into ordertable (order_id, cid, address,   
      create_date, orderitem_id)  
    values (#{orderId,jdbcType=VARCHAR}, #{cid,jdbcType=VARCHAR}, #{address,jdbcType=VARCHAR},   
      #{createDate,jdbcType=TIMESTAMP}, #{orderitemId,jdbcType=VARCHAR})  
  </insert>  

<!--删除语句-->  
<delete id="deleteByPrimaryKey" parameterType="java.lang.String" >  
delete from ordertable  
    where order_id = #{orderId,jdbcType=VARCHAR}  
</delete>  

<!--修改语句-->  
 <update id="updateByPrimaryKey" parameterType="pojo.OrderTable" >  
  update ordertable  
    set cid = #{cid,jdbcType=VARCHAR},  
      address = #{address,jdbcType=VARCHAR},  
      create_date = #{createDate,jdbcType=TIMESTAMP},  
      orderitem_id = #{orderitemId,jdbcType=VARCHAR}  
    where order_id = #{orderId,jdbcType=VARCHAR}  
  </update>  

需要配置的属性:

  1. id=”xxxx” 表示此段sql执行语句的唯一标识,也是接口的方法名称 (必须一致才能找到).
  2. parameterType=”” 表示该sql语句中需要传入的参数, 类型要与对应的接口方法的类型一致(可选).
  3. resultMap=“ ” 定义出参,调用已定义的映射管理器的id值 (他是集合类型)
  4. resultType=“ ”定义出参,匹配普通Java类型或自定义的pojo(出参类型 若不指定,将为语句类型默认类型,如语句返回值为int).
    (他是类型)

p.s: 至于为何 语句的返回值类型为什么是int,有过JDBC操作经验的朋友可能会有印象,增删改操作实际上返回的是操作的条数。而Mybatis框架本身是基于JDBC的,所以此处也沿袭这种返回值类型。
传参和取值

mapper.xml 的灵活性还体现在SQL执行语句可以传参,参数类型通过parameterType= “” 定义

  1. #{value jdbcType = valuetype}:jdbcType 表示该属性的数据类型在数据库中对应的类型,如#{user jdbcType=varchar} 等价于 String username;
  2. value:使sqlorderby {columnName}’;。

二、sql片段标签
:通过该标签可定义能复用的sql语句片段,在执行sql语句标签中直接引用即可。这样既可以提高编码效率,还能有效简化代码,提高可读性
需要配置的属性:id=”” >>>表示需要改sql语句片段的唯一标识
引用:通过标签引用,refid=”” 中的值指向需要引用的中的id=“”属性**

    <!--定义sql片段-->  
<sql id="orderAndItem">  
    o.order_id,o.cid,o.address,o.create_date,o.orderitem_id,i.orderitem_id,i.product_id,i.count  
  </sql>  

 <select id="findOrderAndItemsByOid" parameterType="java.lang.String" resultMap="BaseResultMap">  
    select  
<!--引用sql片段-->  
    <include refid="orderAndItem" />  
    from ordertable o  
    join orderitem i on o.orderitem_id = i.orderitem_id  
    where o.order_id = #{orderId}  
  </select>  

三、映射管理器resultMap:
映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系

  • 需要配置的属性: id=”
    “>>>表示这个映射管理器的唯一标识,外部通过该值引用; type = ” “>>> 表示需要映射的实体类;
  • 需要配置的参数:
    标签指的是:结果集中结果唯一的列【column】 和
    实体属性【property】的映射关系,注意:标签管理的列未必是主键列,需要根据具体需求指定; 标签指的是:结果集中普通列【column】 和
    实体属性【property】的映射关系;

需要维护的关系
所谓关系维护是值在主表查询时将其关联子表的结果也查询出来
1)一对一关系 property = “ ” 被维护实体在宿主实体中的属性名,javaType = ” ” 被维护实体的类型
Orderitem.java

package pojo;  

public class Orderitem {  

    private String orderitemId;  

    private String productId;  

    private Integer count;  

    private Product product;     

从上方代码段可以看出:Product 对象在 Orderitem 实体中以 product 属性存在

Orderitemmapper.xml

<resultMap id="BaseResultMap" type="pojo.Orderitem" >  
   <id column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />  
   <result column="product_id" property="productId" jdbcType="VARCHAR" />  
   <result column="count" property="count" jdbcType="INTEGER" />  
   <!-- 通过association 维护 一对一关系 -->  
   <association property="product" javaType="pojo.Product">  
    <id column="product_id" property="productId"/>  
    <result column="product_factroy" property="productFactroy"/>  
    <result column="product_store" property="productStore"/>  
    <result column="product_descript" property="productDescript"/>  
   </association>  
 </resultMap>  

通过xml的配置可以看出,在resultMap映射管理器中,通过 进行了维护,也就是在查询Orderitem对象时,可以把关联的Product对象的信息也查询出来

2)一对多关系的维护 property = “ ” 被维护实体在宿主实体中的属性名 ,ofType=“ ”是被维护方在宿主类中集合泛型限定类型

【由于在一对多关系中,多的一放是以List形式存在,因此ofType的值取用Lsit //的泛型对象类型】

OrderTable.java

public class OrderTable {  

    private String orderId;  
    private String cid;  
    private String address;  
    private Date createDate;  
    private String orderitemId;  
    private List<Orderitem> orderitemList ; 
    } 

OrderTableMapper.xml;

<resultMap id="BaseResultMap" type="pojo.OrderTable" >  
   <!--  
     WARNING - @mbggenerated  
     This element is automatically generated by MyBatis Generator, do not modify.  
     This element was generated on Fri May 06 15:49:42 CST 2016.  
   -->  
   <id column="order_id" property="orderId" jdbcType="VARCHAR" />  
   <result column="cid" property="cid" jdbcType="VARCHAR" />  
   <result column="address" property="address" jdbcType="VARCHAR" />  
   <result column="create_date" property="createDate" jdbcType="TIMESTAMP" />  
   <result column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />  
     <!--维护一对多的关系  -->  
    <collection property="orderitemList" ofType="pojo.Orderitem">  
        <id column="orderitem_id" property="orderitemId"/>  
        <result column="product_id" property="productId"/>  
        <result column="count" property="count"/>  
    </collection>   
 </resultMap>  

3)在resultMap 中需要注意两点:
3.1)关联关系的维护可以根据实体类之间的实际情况进行嵌套维护

<resultMap id="BaseResultMap" type="pojo.OrderTable" >  
    <id column="order_id" property="orderId" jdbcType="VARCHAR" />  
    <result column="cid" property="cid" jdbcType="VARCHAR" />  
    <result column="address" property="address" jdbcType="VARCHAR" />  
    <result column="create_date" property="createDate" jdbcType="TIMESTAMP" />  
    <result column="orderitem_id" property="orderitemId" jdbcType="VARCHAR" />  
         <!--维护一对多的关系  -->  
        <collection property="orderitemList" ofType="pojo.Orderitem">  
            <id column="orderitem_id" property="orderitemId"/>  
            <result column="product_id" property="productId"/>  
            <result column="count" property="count"/>  
<span style="white-space:pre">        </span><!--嵌套一对一关系-->  
            <association property="customer" javaType="pojo.Customer">  
                <id column="cid" property="cid"/>  
                <result column="cname" property="cname"/>  
            </association>  
        </collection>   
  </resultMap>  

【读者只用参考上方代码段的写法,实体关系仅为笔者举例没有必然的逻辑联系】
3.2)关于出现重复列名的处理:
在实际操作过程中,查询到的结果可能会出现相同的列名,这样会对映射到实体属性带来影响甚至出现报错,那么对待这个问题可以通过对列取别名的方式处理

四:常用的动态语句标签:通过动态sql标签可以进行条件判断,条件遍历等操作从而满足结果的需要
: 使用其可以代替sql语句中的where关键字,一般防止在条件查询的最外层
:条件判断标签,配置属性test=” 条件字符串 “,判断是否满足条件,满足则执行,不满足则跳过

    <select id="findOrderItemDetail" parameterType="pojo.Orderitem" resultMap="BaseResultMap">  
        select orderitem.orderitem_id,product.*   
        from orderitem,product  
        <where>  
            <if test="orderitemId!=null and orderitemId!=''">  
                and orderitem.orderitem_id = #{orderitemId}  
            </if>  
            <if test="productId!=null and productId!=''">  
                and orderitem.product_id = #{productId}  
            </if>  
            <if test="count!=null">  
                and orderitem.count = #{count}  
            </if>  
        </where>  
  </select>  

:常用于更新语句中,替代 sql中的“set”关键字,特别是在联合进行判断是,可以有效方式当某个参数为空或者不合法是错误的更新到数据库中

<update id="updateByPrimaryKeySelective" parameterType="pojo.Orderitem" >  
   update orderitem  
   <set >  
     <if test="productId != null" >  
       product_id = #{productId,jdbcType=VARCHAR},  
     </if>  
     <if test="count != null" >  
       count = #{count,jdbcType=INTEGER},  
     </if>  
   </set>  
   where orderitem_id = #{orderitemId,jdbcType=VARCHAR}  
 </update>  

标签组:也是一个用于条件判断的标签组,和的不同之处在于条件从进入,去匹配中的添加,一旦匹配马上结束;若到找不到匹配项,将执行中的语句;可以理解为是 && 关系 是 || 关系

<!-- 查询学生list,like姓名、或=性别、或=生日、或=班级,使用choose -->       
<select id="getStudentListChooseEntity" parameterType="StudentEntity" resultMap="studentResultMap">       
    SELECT * from STUDENT_TBL ST        
    <where>       
        <choose>       
            <when test="studentName!=null and studentName!='' ">       
                    ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')        
            </when>       
            <when test="studentSex!= null and studentSex!= '' ">       
                    AND ST.STUDENT_SEX = #{studentSex}        
            </when>       
            <when test="studentBirthday!=null">       
                AND ST.STUDENT_BIRTHDAY = #{studentBirthday}        
            </when>       
            <when test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">       
                AND ST.CLASS_ID = #{classEntity.classID}        
            </when>       
            <otherwise>       

            </otherwise>       
        </choose>       
    </where>       
</select>     

标签:该标签的作用是遍历集合类型的条件
属性:collection=“array” / collection = “list” —–>是数组类型,还是集合类型
item=“ productId ”——> 参数名
open=”(” separator=”,” close=”)” ——>开始符号,分隔符号,结束符号
index=“ ” —->结束下标位置,不配置该参数时,默认为全部遍历

    <delete id="deleteByPriKeys" parameterType="java.lang.String">  
     delete from product where product_Id in  
     <foreach collection="list" item="productId" open="(" separator="," close=")">  
         #{productId,jdbcType = VARCHAR}  
     </foreach>  
 </delete>   
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值