Mybatis-动态SQL

Posted Java有货

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-动态SQL相关的知识,希望对你有一定的参考价值。

点击上方"Java有货"关注我们
 ↑

Hi,大家好!

我是小编杨海吉,大家也可以叫我Dylan。

已经好久没有更新文章了,真的是十分抱歉,让大家久等了!

这么就没有跟新文章了,我都不知道从何说起了,就拿小编现在项目中遇到的实例和大家分享吧!讲一下Mybatis中的动态SQL的使用!

什么是MyBatis

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。

Mybatis与Hibernate区别

这也是常见的面试题!

1.mybatis是一个不完全的orm框架,因为mybatis需要程序员自己写大量的sql,需要程序员对sql的掌握比较高,不过mybatis可以通过xml文件可以灵活的配置要运行的sql语句,将sql与Java对象做了很好的关系映射。



2、Mybatis的学习门槛较低,可严格控制sql的执行性能,灵活度高,适合于对关系数据模型要求不高的软件开发,比如互联网软件、企业运营类软件等。因为这类软件的需求变化快而且多。灵活的前提是无法做到数据库的无关系,如果要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。


3、Hibernate是一套完全的orm框架,数据库无关性好,适用于关系数据模型较高的软件,可以节省很多代码,提高工作效率。而且hibernate的性能调优需要很强的经验和能力。

总之,用户需求在有限的资源环境下只要做出维护性、扩展性好的软件架构都是好架构,框架只有合适的才是最好的。

Mybatis中的动态Sql

言归正传:

MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。 动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。在 MyBatis 之 前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半 的元素就能工作了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

  1.  if 

  2.  choose(when,otherwise) 

  3.  trim(where,set) 

  4.  foreach

动态SQL实际应用

<select id="selectOrderReturnById" parameterType="com.javaYoHo.model.OrderReturn" resultMap="BaseResultMap">
   select
    --动态插入Sql脚本,是代码更加简洁
     <include refid="Base_Column_List"/>
   from
     t_order
   --这里的where也可换乘动态
   where 1=1
     <if test="customerid != null and customerid != ''">
       and customerid = #{customerid,jdbcType=BIGINT}
     </if>
     <if test="orderdate != null and orderdate != ''">
       and orderdate = #{orderdate,jdbcType=VARCHAR}
     </if>
     <if test="paymentdate != null and paymentdate != ''">
       and paymentdate = #{paymentdate,jdbcType=VARCHAR}
     </if>
 </select>

循环插入多条数据:

<insert id="insertOrderReturns" parameterType="java.util.List" >
    insert into t_order_returns
      (
        id,
        fid,
        productid,
        price
      )
      <trim prefixOverrides="UNION ALL"> - - 去掉第一个
        <foreach collection="list" item="order" separator=" " >
         - - 返回List集合
          <trim suffixOverrides="," >
             UNION ALL SELECT
           <if test="order.id != null">
             #{order.id,jdbcType=BIGINT},
           </if>
           <if test="order.fid != null">
             #{order.fid,jdbcType=BIGINT},
           </if>
           <if test="order.productid != null">
             #{order.productid,jdbcType=BIGINT},
           </if>
           <if test="order.price != null">
             #{order.price,jdbcType=DECIMAL},
           </if>
         </trim>
       </foreach>
     </trim>
 </insert>

在循环插入中有很多坑,大家还需要多多学习,小编也遇到了很多坑,在公司大神东哥的帮助下完美解决!大家又不懂的也可以加小编微信:372787553


Java有货

本文纯属原创,如有疑问请后台留言或者联系小编。如有转载请注原作者!版权归本公众号所有!如果您喜欢我们的文章,请关注Java有货公众号!如果本文对您有所帮助,不妨点赞,您的支持,是我们坚持的原创动力!


以上是关于Mybatis-动态SQL的主要内容,如果未能解决你的问题,请参考以下文章

mybatis动态sql片段与分页,排序,传参的使用

Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取

mybatis动态sql之利用sql标签抽取可重用的sql片段

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

[mybatis]动态sql_sql_抽取可重用的sql片段

Mybatis动态sql