Mybatis的常用标签
Mybatis的常用标签主要分为四大类,如果掌握了这些标签的使用可以应对百分之九十的工作场景。
一.核心CRUD标签
1.<select>
<select id="selectUserById" resultType="com.example.entity.User">SELECT id, name, age, email FROM user WHERE id = #{id}
</select>
这是用的最多的一个标签。关键点说明:
#{}
:是 MyBatis 的参数占位符,它会进行预编译,能有效防止 SQL 注入。resultType:结果集映射,告诉 MyBatis 将 SQL 查询结果中的每一行数据,自动封装成一个
com.example.entity.User
类的对象。
特殊查询示例:
<select id="queryDefaultData" resultType="java.util.LinkedHashMap">SELECT id,${fieldName}FROM(${tableName}) as t</select>
Mapper接口方法:
List<Map<String,Object>> queryDefaultData(@Param("fieldName") String fieldName, @Param("tableName") String tableName);
这是一个高度灵活的查询,可以动态地指定要查询的字段和表,并将结果以 LinkedHashMap
的形式返回。可以看到 ${fieldName}是从接口里面传进来的,${}
是直接字符串拼接,不会进行预编译。这样会有风险,攻击者可以传入恶意字符串来操纵SQL语句。
其中resultType="java.util.LinkedHashMap"
是关键的部分。
它表示查询结果的每一行都不会被映射到一个预定义的 Java Bean(如 User
),而是被映射到一个 LinkedHashMap<String, Object>
对象。
Map 的 Key:是查询结果集的列名(id
, 以及 ${fieldName}
的值)。
Map 的 Value:是对应列的值。
例如,查询结果可能是这样的一个 Map:{"id": 1, "user_name": "Alice", "age": 25}
。
使用 LinkedHashMap
而不是普通的 HashMap
可以保持列的顺序(即查询时字段的顺序)。
2.<insert>
<insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (name, age, email)VALUES (#{name}, #{age}, #{email})
</insert>
parameterType
属性通常是可以省略的并且parameterType
不仅可以指定自定义的 Java Bean,还可以是:
基本类型及其包装类:
parameterType="java.lang.Long"
或别名long
字符串:
parameterType="java.lang.String"
或别名string
Map:
parameterType="java.util.Map"
或别名map
集合/数组:虽然不常用,但也可以指定。
3.<update>
<update id="updateUser" parameterType="com.example.entity.User">UPDATE userSET name = #{name}, age = #{age}, email = #{email}WHERE id = #{id}
</update>
4.<delete>
<delete id="deleteUserById">DELETE FROM user WHERE id = #{id}
</delete>
二.SQL片段重用标签
示例:
1.下面是定义的sql片段
<sql>:
<!-- 通用查询结果列 --><sql id="Base_Column_List">id, creater, updater, create_time, update_time</sql>
2.引用通用列
<include>:
<select id="selectByCodeOrName" resultType="com.test.Pool">select<include refid="Base_Column_List"/>fromtbl_poolwherecode = #{code}
</select>
三.动态SQL标签
1.if标签
用途:简单的条件判断。如果
test
条件为真,则包含其内部的SQL。关键属性:
test
(OGNL表达式)。
<if test="req.user!= null and req.user != ''">AND q.user= #{req.user}</if>
2.<choose>
、<when>
、<otherwise>
多选标签,类似Java中的if....else判断语句。
<if test="req != null"><choose><when test="req.exportFieldIds != null and req.exportFieldIds.size()>0">AND fp.id = #{fieldId}</when><otherwise><if test="req.cype != null and req.cype != ''">AND fp.cype = #{req.cype}</if></otherwise></choose>
</if>
3.<foreach>标签
用途:遍历集合(如List、数组),常用于
IN
条件查询和批量插入操作。关键属性:
collection
,item
,index
,open
,close
,separator
。
示例:
<select id="selectByFieldCodeList" resultType="com.Pool">select<include refid="Base_Column_List"/>fromtbl_poolwhere code in<foreach collection="codeList" item="item" open="(" separator="," close=")">#{item}</foreach></select>