Mybatis的Mapper映射文件中常用标签

k180 / 2024-10-15 / 原文

select

点击查看代码
<select id="selectPerson" 
parameterType="int" 
parameterMap="deprecated" 
resultType="hashmap" 
resultMap="personResultMap" 
flushCache="false" 
useCache="true" 
timeout="10000" 
fetchSize="256" 
statementType="PREPARED" 
resultSetType="FORWARD_ONLY" 
databaseId="mysql" 
resultOrdered="false" 
resultSets="xxx,xxx" 
lang="">
id 必选标签。同一个命名空间里面的唯一标识符,如果需要被外部接口调用,则需要和Mapper接口中的方法名保持一致。

parameterType
可选标签。参数类的完全限定名或别名,上面示例中的表示我们传入的参数是一个String类型(关于别名如果不清楚的可以点击这里)。如果不写这个属性的话,MyBatis在解析xml文件的时候会默认设为unset,然后根据TypeHandler推断出参数类型。如果有多个参数的情况下建议还是不写这个参数,否则可能会出现参数类型转换错误

resultType
非必选标签。
注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。主要是用来定义一个返回结果集对象的全限定名或者别名。如果接收参数是一个集合,那么这里定义的就是集合中可以包含的类型,而并不是集合本身。

resultMap
非必选标签。
注意这里的非选是因为resultType和resultMap不能并存,两者能且只能选择一个。resultMap类型的结果集映射,是MyBatis最强大的特性,在这里我们不展开,过两天会有一篇单独介绍MyBatis一对一和一对多等复杂查询时候会单独介绍该属性。

insert

点击查看代码
<insert
id="insertLwUser"
parameterType="lwUser"
parameterMap="deprecated"
flushCache="true"
statementType="PREPARED"
keyProperty=""
keyColumn=""
useGeneratedKeys=""
timeout="20"
databaseId="mysql"
lang="">
keyProperty 可选标签。唯一标记一个属性,MyBatis会将通过getGeneratedKeys 的返回值或者通过insert 语句的selectKey 子元素设置它的键值,默认值是unset 。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表

update

delete

sql,include

这个元素可以被用来定义可重用的 SQL 代码段,可以包含在其他语句中。

点击查看代码
 <select id="selectUserAddress" resultType="com.lonelyWolf.mybatis.model.UserAddress">
        select <include refid="myCloumn"></include> from lw_user_address
    </select>

    <sql id="myCloumn" >
        id,address
    </sql>

cache

MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。但是默认情况下只开启了一级缓存,即局部的session缓存,如果想要开启二级缓存。那么就需要使用到cache标签

点击查看代码
<cache
type="com.lonelyWolf.xxx"
eviction="FIFO"
flushInterval="60000"
readOnly="true"
size="512"/>

type
如果说我们自己自定义了缓存,那么这里可以配置自定义缓存类的全限定名或者别名,如果没有自定义缓存,则不需要配置type属性。
eviction
缓存回收策略,MyBatis中more提供了以下策略可以选择:

LRU:最近最少使用算法(默认算法)。移除最长时间不被使用的对象
FIFO:先进先出算法。按对象进入缓存的顺序来移除它们
SOFT:软引用。移除基于垃圾回收器状态和软引用规则的对象。
WEAK:弱引用。更积极地移除基于垃圾收集器状态和弱引用规则的对象
flushInterval
刷新间隔时间(单位是毫秒)。可以被设置为任意的正整数。默认情况是不设置,也就是不会主动刷新缓存(只有等待sql被执行的时候才会被刷新)。

readOnly
是否只读。属性可以被设置为 true 或 false。如果设置为true,那么只读的缓存会给所有调用者返回缓存对象的相同示例,因为缓存无法被修改。这在一定程度上可以提升性能。
默认是false,也就是可以修改缓存,那么当读取缓存的时候会通过序列化的方式返回缓存对象的拷贝,虽然这么做会慢一点,但是安全,因此默认才会设置为false,允许修改缓存。

if和where

点击查看代码
	<sql id="hhh">select *from t_user</sql>
    <select id="queryUserByUnameAndPwd resultType="User">
		<include refid="hhh"/>
		<where>
			<if test="username!=null">
			 	and username = #{username}
			</if>
			<if test="password!=null">
				and password = #{password}
			</if>
		</where>
    </select>

if和set

点击查看代码
<update id="updateUser" parameterType="User">
	update t_user
	<set>
	<if test="password!=null">
	password = #{password},
	</if>
	<if test="username!=null">
	username=#{username}
	</if>
	where id = #{id}
</update>

trim

点击查看代码
 <select id="queryUserById2" resultType="User">
        <include refid="user_fired"/>
        <!--prefix=“where" 给拼接的sql语句加前缀,前缀为where,
        prefixOverrides="or|and" where子句中如果以or或者and开头,会被覆盖-->

        <trim prefix="where" prefixOverrides="or|and">
            <if test="username!=null">
                username = #{username}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </trim>
    </select>
    <update id="updateUserById" parameterType="User">
        update t_user
        <!--prefix=“set" 给拼接的sql语句加前缀,前缀为set,
        suffixOverrides=","自动将最后一个逗号删除-->

        <trim prefix="set" suffixOverrides=",">
            <if test="username!=null">
                username = #{username},
            </if>
            <if test="gender!=null">
                gender = #{gender},
            </if>
        </trim>
        where id = #{id}
    </update>

foreach

delete from t_user where id in #{i}
<insert id="insertUsers" parameterType="java.util.List">
    insert into t_user values
    <foreach collection="list" open="" close="" separator="," item="u">
        (null,#{u.username},#{u.password},#{u.gender},#{u.registTime})
    </foreach>
</insert>

choose和when和otherwise

点击查看代码
    <select id="findUser" resultType="User">
        select *from t_user where id = #{id}
        <choose>
            <when test="username!=null">
                AND username like #{username}
            </when>
            <when test="password!=null">
                AND password = #{password}
            </when>
            <otherwise>
                AND gender = 1
            </otherwise>
        </choose>
    </select>

bind

点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.how2java.pojo">
        <!-- 本来的模糊查询方式 -->
<!--         <select id="listProduct" resultType="Product"> -->
<!--             select * from   product_  where name like concat('%',#{0},'%') -->
<!--         </select> -->
             
        <select id="listProduct" resultType="Product">
            <bind name="likename" value="'%' + name + '%'" />
            select * from   product_  where name like #{likename}
        </select>
</mapper>