一、resultMap中的映射关系
resultMap:设置自定义映射
resultMap标签的属性: id:该自定义映射的唯一标识
type:查询的数据要映射的实体类的类型
resultMap的子标签: id:设置主键的映射关系
result:设置普通字段的映射关系
resultMap的子标签的属性: property:设置映射关系中实体类中的属性名
column:设置映射关系中表中的字段名
<resultMap id="ResultMap" type="Emp">
<id property="eid" column="eid"></id>
<result property="empName" column="emp_name"></result>
<result property="age" column="age"></result>
<result property="sex" column="sex"></result>
<result property="email" column="email"></result>
</resultMap>
<select id="getEmp" resultMap="ResultMap">
select * from emp
</select>
二、参数占位符的映射
User getUserById(@Param("id") Long userId);
<select id="getUserById" resultType="User">
SELECT * FROM t_user WHERE id = #{id}
</select>
对于#{id}的映射规则:
#{id}
是MyBatis中的参数占位符,用于接收传入的参数值。在实际执行SQL语句时,#{id}
会被实际的参数值替换。
在MyBatis的使用中,#{id}
的映射规则是由MyBatis框架根据传入的参数自动进行映射的。具体的映射规则如下:
- 如果传入的参数是一个简单类型(如int、long、String等),那么
#{id}
会直接替换为对应的参数值,例如select * from t_user where id = 123
。 - 如果传入的参数是一个对象,MyBatis会根据对象的属性名和
#{}
中的名称进行自动映射,例如传入的对象是User对象,且User对象中有id属性,则#{id}
会被映射为对应的id属性的值,例如select * from t_user where id = #{id}
会被映射为select * from t_user where id = user.getId()
。
#{id}
的映射规则取决于传入的参数类型和参数值,MyBatis会根据参数类型自动进行映射。
在MyBatis中,除了直接使用#{id}
来引用参数外,还可以使用@Param
注解为参数起一个别名。这种方式的区别在于以下几点:
-
易读性:使用
@Param
注解可以让SQL语句中的参数更具有可读性,尤其是在多个参数的情况下,可以清晰地知道每个参数的含义。 -
参数重用:使用
@Param
注解可以为参数起别名,这样可以在多个地方重复使用同一个参数,而不需要在不同的地方使用不同的参数名。
在这个例子中,@Param("id")
起到了给参数userId起了一个别名id的作用,使得在SQL语句中可以直接使用#{id}
引用参数,增强了可读性和参数的重用性。
三、xml文件和mapper接口的对应
在MyBatis中,Mapper接口定义了对数据库的操作,而对应的SQL语句则是在XML文件中定义的。通过在XML文件中声明namespace
属性,可以将XML文件与对应的Mapper接口进行关联,从而实现了Mapper接口与XML文件的映射关系。
<!-- UserMapper.xml -->
<mapper namespace="com.qrc.mapper.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM t_user WHERE id = #{id}
</select>
<!-- 其他SQL语句... -->
</mapper>
四、动态sql标签
if标签
1.if标签中test属性是必须的。
2.if标签中test属性的值是false或者true。
3.如果test是true,则if标签中的sql语句就会拼接。反之,则不会拼接。
4.test属性中可以使用的是:
当使用了@Param注解,那么test中要出现的是@Param注解指定的参数名。@Param(“brand”),那么这里只能使用brand
当没有使用@Param注解,那么test中要出现的是:param1 param2 param3 arg0 arg1 arg2…当使用了POJO,那么test中出现的是POJO类的属性名。
5.在mybatis的动态SQL当中,不能使用&&,只能使用and。
<select id="selectUserCount" resultType="integer">
select count(*) from user_info
<where>
<if test="userCode != null and userCode != ''">
and user_code like concat('%', #{userCode}, '%')
</if>
<if test="userType != null and userType != ''">
and user_type = #{userType}
</if>
<if test="userState != null and userState != ''">
and user_state = #{userState}
</if>
and is_delete = 0
</where>
</select>
where标签
- where标签的作用:让where子句更加动态智能。
- 所有条件都为空时,where标签保证不会生成where子句。·自动去除某些条件前面多余的and或or。
Trim标签
在MyBatis中,<trim>
标签用于在生成动态SQL时对SQL语句进行修剪和处理。<trim>
标签通常用于处理SQL语句中的空白字符和条件语句,以便动态地构建SQL语句。
<trim>
标签通常包含以下属性:
prefix
:在修剪后的内容前面添加的字符串。prefixOverrides
:指定需要从修剪后的内容中移除的前缀。suffix
:在修剪后的内容后面添加的字符串。suffixOverrides
:指定需要从修剪后的内容中移除的后缀。
<trim>
标签通常与其他条件标签(如<if>
、<where>
、<set>
等)一起使用,以便根据条件动态地添加或移除SQL语句的一部分。
<update id="updateUser" parameterType="User">
UPDATE users
<trim prefix="SET" suffixOverrides=",">
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
</trim>
WHERE id = #{id}
</update>
示例中,<trim>
标签被用来处理SET
子句中可能出现的多余逗号。如果username
、password
或email
其中之一为null
,那么对应的属性和赋值语句会被移除,同时逗号也会被处理掉,以确保生成的SQL语句是正确的。
set标签
- 主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”
- 比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。
传统写法:
<update id="update">
update t_car set
name = #{name},
sex = #{sex}
where id = #{id}
</update>
set标签写法:
update t_car
<set>
<if test="name != null and name !=''">name = #{name},</if>
<if test="sex != null and sex !=''">sex = #{sex},</if>
<if test="guidePrice != null and guidePrice !=''">guide_price = #{guidePrice},</if>
</set>
where
id = #{id}
choose when otherwise标签
<select id="getUser" parameterType="map" resultType="User">
SELECT * FROM users
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND status = 'active'
</otherwise>
</choose>
</where>
</select>
示例中,<choose>
标签包裹了三个条件分支:当id
不为空时,执行对应的条件语句;当username
不为空时,执行对应的条件语句;否则,执行<otherwise>
中的默认条件语句。这样可以根据不同的条件
foreach标签
foreach标签的属性:
collection:指定数组或者集合
item:代表数组或集合中的元素
separator:循环之间的分隔符
动态地构建SQL语句,使得SQL查询更加灵活和可定制。
<select id="getUsersByIds" parameterType="map" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
示例中,<foreach>
标签用于迭代ids
集合,并将集合中的元素应用到SQL语句中的IN
子句中。在每次迭代中,${id}
会被替换为集合中的当前元素,同时根据open
、close
和separator
属性动态地构建SQL语句,使得生成的SQL语句形如id IN (1, 2, 3)
。
include标签和sql标签
<include>
标签和<sql>
标签都用于在动态SQL中实现代码重用,提高SQL语句的可维护性和可读性。
<sql id="baseColumn">
id, username, email
</sql>
<select id="getUser" parameterType="int" resultType="User">
SELECT
<include refid="baseColumn"/>
FROM users
WHERE id = #{id}
</select>