1.MyBatis Sql节点和ResultMap

1.Mapper映射文件和接口的关系

2.typeAliases

1.MyBatis Sql节点和ResultMap
1.1sql节点

通常用来定义局部的sql片段,达到重用的效果,通过在其它的sql中包含,例如:

<sql id="columns">
    leixing_id,ming, yanyuan, daoyan, piaojia, tupianlujing
</sql>
<insert id="insertDianYing" parameterType="DianYingXinXi">
    insert into dian_ying(<include refid="columns"></include>)
    values(#{leixingId},#{ming},#{yanYuan},#{daoYan},#{piaoJia},#{tuPianLuJing})
</insert>
<insert id="insertDianYing" parameterType="DianYingXinXi" useGeneratedKeys="true"
keyProperty="id">
    使用useGeneratedKeys,对于自增长的id值,插入成功后,数据库自增id值会返回到实体类的keyProperty所设置的属性中    
//观察执行结果
DianYingXinXi dy = new DianYingXinXi();
dy.setDaoYan("张艺谋xx");
dy.setLeixingId(2);
dy.setMing("红高粱呵呵xx");
dy.setPiaoJia(110f);
dy.setYanYuan("巩俐章子怡xxx");
System.out.println("插入数据库之前访问实体类id: "+dy.getId());
dao.insertDianYing(dy);
System.out.println("插入数据库之后访问实体类id:"+dy.getId());
.......

sequence …了解

1.2ResultMap

如果sql语句的列名和实体类属性名不同名,那么可以用resultMap代替resultType.resultMap更加灵活

<resultMap type="DianYingXinXi" id="result">
      <id property="id" column="id"/>
      <result property="leiXingId" column="leixing_id"/>
      <result property="ming" column="ming"/>
      <result property="yanYuan" column="yanYuan"/>
      <result property="daoYan" column="daoYan"/>
      <result property="piaoJia" column="piaoJia"/>   
  </resultMap>
  <select id="chaDianYing"  resultMap="result">
      select id, leixing_id, ming, yanyuan, daoyan, piaojia from dian_ying 
  </select> 

映射说明:

<resultMap  id="result 结果映射id"  type="结果映射的实体类(或别名)">
		<id property="id" column="id"/>
		<result property="leiXingId 属性名" column=" leixing_id 列名"/>
		<result property="ming" column="ming"/>
        <result property="yanYuan" column="yanYuan"/>
        <result property="daoYan" column="daoYan"/>
        <result property="piaoJia" column="piaoJia"/>   
</resultMap>
<!--select节点映射查询-->
<select id="chaDianYing 查询语句的id" resultMap="result 返回的结果集使用的结果映射id">
  		 select id, leixing_id, ming, yanyuan, daoyan, piaojia from dian_ying 
</select>

提示:默认情况下MyBatis的自动映射是开启的(和列名同名的属性自动映射),所以,resultMap节点的映射,对于列名和实体类属性名同名的那些result可以省略,resultMap中列名找不到相应的result节点或者id节点,会自动根据列名找实体类中的同名属性(不区分大小写)

2.动态Sql
2.1if

if :test 中表达式是true 就会拼接上 之间的sql片段, 这个表达式操作数来自于实体类属性值

<select id="selectByEntity" parameterType="DianYingXinXi" resultMap="result">
		select * from dian_ying  where 1=1
		<if test="属性名的关系 逻辑 运算 "> and id=#{id}</if>
		<if test="leixingId != null"> and leixingId=#{leixingId}</if>
		......
</select>
2.2 choose

节点的test表达式 从上往下依次判断 出现一个表达式为ture 的 就将之间的sql片段拼接 ,下面的when不再执行.

select * from dian_ying where 1=1  
<choose>  	
     <when test="属性名的关系 逻辑 运算">and sql 片段</when>
	 <when test="属性名的关系 逻辑 运算">and sql 片段</when>
     <when test="属性名的关系 逻辑 运算">and sql 片段</when>
     <otherwise>sql 片段</otherwise>
</choose>
2.3 where

自动生成where子句 其中根据if test 为true的 拼接,不需要自己编写where子句,sql中不带where关键字,if中的条件都带and,动态处理时会自动去掉第一个and.

<select id="selectByEntity" parameterType="DianYingXinXi" resultMap="result">
		select * from dian_ying 
        <where>
		<if test="属性名的关系 逻辑 运算 "> and id=#{id}</if>
		<if test="leixingId != null"> and leixingId=#{leixingId}</if>
		......
        </where>
</select>
2.4 set

自动生成set子句 根据If test 为true的拼接上,set节点会自动去掉set子句中最后一个表达式后面的逗号,使得set子句合法

<update id="updateDianYingDynamic" parameterType="DianYingXinXi" >
    update  dian_ying
    <set>
       <if test="daoyan != null">
           DAOYAN=#{daoyan},
       </if>
        <if test="leiXingId != null">
            leixing_id=#{leiXingId},
        </if>
        <if test="ming != null">
            ming=#{ming},
        </if>
        <if test="yanyuan != null">
            yanyuan=#{yanyuan},
        </if>
        <if test="piaojia != null">
            piaojia=#{piaojia},
        </if>
    </set>
        where id=#{id}
</update>
2.5 foreach 了解

另外一个动态 SQL 通用的必要操作是迭代一个集合, 通常是构建在 IN 条件中的。 比如:

<select id="dynamicForeach" parameterType="TiaoJian" resultMap="result">
    select * from dian_ying
    where leixing_id in 
    <foreach collection="leiXingIds" item="lx" open="(" close=")" separator=",">
        #{lx}
    </foreach> 
</select> 

foreach元素的属性主要有item,index,collection,open,separator,close。
item:集合中元素迭代时的别名,该参数为必选。
index:在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选
open:foreach代码的开始符号,一般是(和close=")“合用。常用在in(),values()时。该参数可选
separator:元素之间的分隔符,例如在in()的时候,separator=”,“会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
close: foreach代码的关闭符号,一般是)和open=”("合用。常用在in(),values()时。该参数可选。
collection: 要做foreach的对象,作为入参时,List对象默认用"list"代替作为键,数组对象有"array"代替作为键。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。如上例.
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .

2.6 trim

可以为包含的sql拼接前缀 和后缀
一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。
以下是trim标签中涉及到的属性:
属性 描述
prefix 给sql语句(trim包起来的sql片段)拼接的前缀
suffix 给sql语句(trim包起来的sql片段)拼接的后缀
prefixOverrides 去除sql语句(trim包起来的sql片段)前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND"
suffixOverrides 去除sql语句(trim包起来的sql片段)后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定

<insert id="insertDianYing" parameterType="DianYingXinXi">
    insert into dian_ying
    <trim prefix="(" suffix=")" suffixOverrides=",">
        <if test="leiXingId!=null">
            leixing_id,
        </if>
        <if test="ming!=null">
            ming,
        </if>
        <if test="yanyuan!=null">
            yanyuan,
        </if>
        <if test="daoyan!=null">
            daoyan,
        </if>
        <if test="piaojia!=null">
            piaojia,
        </if>
    </trim>
    <trim prefix="values(" suffix=")" suffixOverrides=",">
        <if test="leiXingId!=null">
            #{leiXingId},
        </if>
        <if test="ming!=null">
            #{ming},
        </if>
        <if test="yanyuan!=null">
            #{yanyuan},
        </if>
        <if test="daoyan!=null">
            #{daoyan},
        </if>
        <if test="piaojia!=null">
            #{piaojia},
        </if>
    </trim>
</insert>
2.7 bind 了解

bind绑定可以将ognl表达式的值绑定到一个变量中,后面可以引用这个变量的值,尤其sql语句拼接字符串时常用

例如:

 <select id="chaDianYingLike" parameterType="DianYingXinXi">
       <bind name="mingHaHa" value="'%'+ming+'%'"/>
       select * from dian_ying where ming like #{mingHaha}
 </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值