MyBatis 执行动态 SQL语句详解
什么是动态 SQL语句
动态SQL语句是根据不同的输入条件,动态创建不同的SQL语句,以便能够灵活地满足不同的查询需求。
MyBatis如何执行动态 SQL语句
MyBatis执行动态SQL语句的方式是通过将动态SQL语句解析成对应的静态SQL语句,然后再执行静态SQL语句。
这个过程MyBatis通过SqlNode、SqlSource和BoundSql三个核心类来实现:
-
SqlNode:每个sql语句的节点(例如条件判断、循环等)都会被转化成SqlNode,SqlNode的职责是负责对其子节点进行递归解析,并生成对应的静态SQL文本,最终交由SqlSource执行静态SQL。
-
SqlSource:负责将SqlNode生成的静态SQL文本与参数值进行合并,形成BoundSql对象。
-
BoundSql:包含了静态SQL语句和输入参数,可以执行对应的SQL语句。
动态 SQL语句实例1
动态 SQL语句示例: 查询商品列表,根据要求查询不同的商品
<select id="getGoodsList" parameterType="map" resultType="Goods">
select * from goods_tb
<where>
<if test="type != null">
and type = #{type}
</if>
<if test="price != null">
and price >= #{price}
</if>
<if test="name != null and name != ''">
and name like CONCAT('%',#{name},'%')
</if>
</where>
order by createTime desc
limit ${startIndex}, ${pageSize}
</select>
针对以上动态SQL语句,如果传入的参数 type = "电子",price = 1000,name = "电视",可以解析成如下的静态 SQL语句:
select * from goods_tb
where type = '电子'
and price >= 1000
and name like '%电视%'
order by createTime desc
limit 0, 10
动态 SQL语句实例2
动态 SQL语句示例:根据传入的条件参数,生成插入(insert)操作的SQL语句
<insert id="insertUser" parameterType="User">
insert into user_tb
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="age != null">
age,
</if>
<if test="sex != null">
sex,
</if>
<if test="email != null">
email
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id},
</if>
<if test="name != null">
#{name},
</if>
<if test="age != null">
#{age},
</if>
<if test="sex != null">
#{sex},
</if>
<if test="email != null">
#{email}
</if>
</trim>
</insert>
针对以上动态SQL语句,如果传入的参数为{id=1, name="Tom", age=18},则可以解析成如下的静态 SQL语句:
insert into user_tb (id, name, age)
values (1, 'Tom', 18)
总结
动态 SQL语句是MyBatis非常强大的一项功能,它能够通过简单的语法,实现复杂的查询条件,并带来更好的灵活性,能够大幅度减少开发工作量,实现快速开发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis 执行动态 SQL语句详解 - Python技术站