Mybatis-动态SQL
Posted Java有货
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-动态SQL相关的知识,希望对你有一定的参考价值。
Hi,大家好!
我是小编杨海吉,大家也可以叫我Dylan。
已经好久没有更新文章了,真的是十分抱歉,让大家久等了!
这么就没有跟新文章了,我都不知道从何说起了,就拿小编现在项目中遇到的实例和大家分享吧!讲一下Mybatis中的动态SQL的使用!
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
这也是常见的面试题!
1.mybatis是一个不完全的orm框架,因为mybatis需要程序员自己写大量的sql,需要程序员对sql的掌握比较高,不过mybatis可以通过xml文件可以灵活的配置要运行的sql语句,将sql与Java对象做了很好的关系映射。
2、Mybatis的学习门槛较低,可严格控制sql的执行性能,灵活度高,适合于对关系数据模型要求不高的软件开发,比如互联网软件、企业运营类软件等。因为这类软件的需求变化快而且多。灵活的前提是无法做到数据库的无关系,如果要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3、Hibernate是一套完全的orm框架,数据库无关性好,适用于关系数据模型较高的软件,可以节省很多代码,提高工作效率。而且hibernate的性能调优需要很强的经验和能力。
总之,用户需求在有限的资源环境下只要做出维护性、扩展性好的软件架构都是好架构,框架只有合适的才是最好的。
言归正传:
MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号。动态 SQL 可以彻底处理这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语 言来改进这种情形,这种语言可以被用在任意映射的 SQL 语句中。 动态 SQL 元素和使用 JSTL 或其他相似的基于 XML 的文本处理器相似。在 MyBatis 之 前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半 的元素就能工作了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。
if
choose(when,otherwise)
trim(where,set)
foreach
<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有货
以上是关于Mybatis-动态SQL的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis -- 动态Sql概述动态Sql之<if>(包含<where>)动态Sql之<foreach>sql片段抽取
mybatis动态sql之利用sql标签抽取可重用的sql片段
MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段