MyBatis是基于java的持久层框架,因为内部封装了JDBC,所以只需要关注SQL本身,无需关注驱动的加载和创建连接。
MyBatis通过XML或注解的方式将要执行的statement配置,通过java对象和statement中的sql动态参数进行映射生成最终执行的SQL语句,由MyBatis框架执行SQL,并将结果映射为java对象。
MyBatis框架采用了ORM思想,解决了实体类与数据库表之间的映射关系问题。JDBC进行封装,屏蔽了JDBC API底层访问,避免了与JDBC API打交道,从而实现持久化操作。
动态SQL
什么是动态SQL?
是MyBatis的强大特性之一,同一个dao方法,根据不同的条件可以表示不同的sql语句。
解决了什么问题?
拼接sql时忘记添加一些空格或是没有去掉列表最后一个列名的逗号,都会使得SQL语句错误从而无法正常运行。
动态SQL的标签:
元素 | 作用 | 备注 |
if | 判断语句 | 单条件分支 |
trim(where) | 辅助元素 | 用于处理SQL拼接问题 |
choose(when,otherwise) | 相当于java中的switch | 多条件分支 |
set | 辅助元素 | 智能忽略最后的逗号 |
foreach | 循环语句 | 批量插入,更新,查询是经常用到 |
if+where标签:
<select id = "">
SELECT * FROM user
<where>
<if test="id != null">
id=#{id}
</if>
<if test="name != null">
and name=#{name}
</if>
</where>
</select>
每满足一个条件都会与SQL语句拼接,where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
trim标签:
<select id="">
SELECT * FROM user
<trim prefix="where" suffix="order by" prefixOverrides="and | or" suffixOverrides=",">
<if test="name != null">
AND name=#{name}
</if>
<if test="address != null">
AND address=#{address}
</if>
</trim>
</select>
prefix:前缀
suffix:后缀
prefixOverrides:去掉第一个and或者or
suffixOverrides:去掉最后一个逗号或其他的标记
choose(when,otherwise)标签:
<select id="">
SELECT * FROM user
<where>
<choose>
<when test="id != null">
id=#{id}
</when>
<when test="name != null">
AND name = #{name}
</when>
<otherwise>
id=1
</otherwise>
</choose>
</where>
</select>
相当于switch,在此标签中有一个when成立,其余中的内容不再执行,<otherwise>标签中的内容也不会执行。
set标签:
<update id="">
UPDATE user
<set>
<if test="name != null">
name=#{name}
</if>
<if test="address != null">
address=#{address}
</if>
</set>
WHERE id=#{id}
</update>
智能忽略最后的逗号。
foreach标签:
<select id="">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="user_id" separator="," open="(" close=")">
#{user_id}
</foreach>
</select>
通常在构建IN条件语句时使用,对传入的集合或数组进行遍历以及动态的SQL组装,
collection:要遍历的集合元素,注意编写时不要编写#{}。
item:遍历集合的每个元素,生成的变量名。
separator:结束部分。
open:语句的开始部分。
close:技术部分。