映射文件是MyBatis中的重要组成部分,它包含了开发中编写的SQL语句、参数、结果集等。映射文件需要通过MyBatis配置文件中的<mapper>元素引入才能生效。MyBatis规定了映射文件的层次结构。
1、映射文件概览
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="MyDog">
<!--开启此映射文件的缓存-->
<cache/>
<!--指定引用的命名空间,当此命名空间执行DML操作修改时,
被引用的命名空间中的缓存也会失效-->
<cache-ref namespace=""/>
<!--参数映射集-->
<parameterMap id="" type="">
<parameter property="" jdbcType="" javaType="" typeHandler=""/>
</parameterMap>
<!--sql块-->
<sql id=""></sql>
<!--映射结果集-->
<resultMap id="" type="">
<id property="" column=""/>
<result property="" column="" />
</resultMap>
<!--查询元素-->
<select id="" resultType="" parameterType=""></select>
<!--新增元素-->
<insert id="" parameterType=""></insert>
<!--删除元素-->
<delete id=""></delete>
<!--更新元素-->
<update id="" parameterType=""></update>
</mapper>
< select >元素的常用属性:
<sql>元素:
通过<sql>元素来包裹常用的列名,当需要使用此列名时,可以利用<include>元素的refid属性来指定。在需要修改列名时,通过修改<sql>元素即可实现全文件的列名修改。
<sql>元素设计的初衷在于简化列名的书写,在一个命名空间内,重复的列名将会给维护带来很大的麻烦,因此,MyBatis使用<sql>元素来包含这些列名,使其得到重用。
2、模糊查询总结
写法为:
1、使用“${...}”,语法为“like '${...}'”; -->and sName LIKE '%${sName}%'
<select id="query" resultType="student">
SELECT * FROM students
<where>
<if test="null != sId and '' != sId">
and sId = #{sId}
</if>
<if test="null != sName and '' != sName">
and sName LIKE '%${sName}%'
</if>
<if test="null != sAge and '' != sAge">
and sAge = #{sAge}
</if>
</where>
</select>
2、使用“#{...}”,语法为“like '#{...}'”; -->and sName LIKE "%"#{sName}"%"
<select id="query" resultType="student">
SELECT * FROM students
<where>
<if test="null != sId and '' != sId">
and sId = #{sId}
</if>
<if test="null != sName and '' != sName">
and sName LIKE "%"#{sName}"%"
</if>
<if test="null != sAge and '' != sAge">
and sAge = #{sAge}
</if>
</where>
</select>
3、使用[CONCAT]函数连接参数形式,语法为“like CONCAT('%',#{...},'%')”。-->and sName LIKE concat("%",#{sName},"%")
<select id="query" resultType="student">
SELECT * FROM students
<where>
<if test="null != sId and '' != sId">
and sId = #{sId}
</if>
<if test="null != sName and '' != sName">
and sName LIKE concat("%",#{sName},"%")
</if>
<if test="null != sAge and '' != sAge">
and sAge = #{sAge}
</if>
</where>
</select>
4、使用<bind> --><bind name="bindName" value="'%'+sName+'%'" />
<select id="query" resultType="student">
<!--命名元素-->
<bind name="bindName" value="'%'+sName+'%'" />
SELECT * FROM students
<where>
<if test="null != sId and '' != sId">
and sId = #{sId}
</if>
<if test="null != sName and '' != sName">
and sName LIKE #{bindName}
</if>
<if test="null != sAge and '' != sAge">
and sAge = #{sAge}
</if>
</where>
</select>
注:#{}和${}的区别:
“#{}”表示占位符:在组成SQL的过程中,先将此位置占位,之后将取得的值赋值到此位置,在类型上有严格的限制。【相当于用PreparedStatement,不会有SQL注入风险】
“${}”表示拼接符:在组成SQL的过程中,此符号将取得的值直接拼接到相应位置。
【相当于用Statement,拼接SQL,有SQL注入风险】