MyBatis
MyBatis是一个优秀的持久层框架,它允许开发者直接使用SQL与数据库进行交互,同时提供了丰富的映射和转换功能,使得开发者可以专注于SQL本身而不是繁琐的JDBC操作。其中,MyBatis Mapper是MyBatis的核心组件之一,负责将SQL查询结果映射到Java对象。
Mybatis的Mapper映射文件基本结构
下面是一个简单的Mapper映射文件示例,其中定义了一个名为UserMapper的接口的映射。
<!-- 查询用户 -->
<select id="selectUser" parameterType="int" resultType="com.example.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
<!-- 插入用户 -->
<insert id="insertUser" parameterType="com.example.model.User">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<!-- 更新用户 -->
<update id="updateUser" parameterType="com.example.model.User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
Mapper映射文件中常用标签及作用
1.<mapper> 标签:mapper元素是Mapper XML文件的根元素,它有一个namespace属性用于指定对应的Mapper接口或命名空间。
这是最外层的标签,用于定义一个命名空间,通常与 Mapper 接口的完全限定名相同。
<mapper namespace="com.example.mapper.UserMapper">
<!-- 其他标签定义 -->
</mapper>
<select>:用于定义一个查询操作的SQL语句。
<select id="selectUserById" resultMap="userResultMap">
SELECT * FROM users WHERE id = #{id}
</select>
<insert>:用于定义一个插入操作的SQL语句。
<insert id="insertUser">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<update>:用于定义一个更新操作的SQL语句。
<update id="updateUser">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete>:用于定义一个删除操作的SQL语句。
<delete id="deleteUser">
DELETE FROM users WHERE id = #{id}
</delete>
<parameterMap>:已经不再推荐使用,用于定义SQL语句中的参数。
<parameterMap id="userParam" type="com.example.model.User">
<parameter property="name"/>
<parameter property="email"/>
</parameterMap>
<insert id="insertUser">
INSERT INTO users (name, email) VALUES (#{name}, #{email})
</insert>
<resultMap>:用于定义如何从数据库结果集映射到Java对象的复杂语句。
<id property="id" column="id" />
<result property="name" column="name" />
<result property="email" column="email" />
</resultMap>
<sql>,<include>::用于定义可重用的SQL段。用于引用定义的SQL段。搭配使用。
<sql id="userColumns">
id, name, email
</sql>
<select id="selectAllUsers" resultType="com.example.model.User">
SELECT <include refid="userColumns" /> FROM users
</select>
-
<where>:用于动态地生成SQL语句的WHERE部分。
<select id="selectUserByUsernameAndSex" resultType="user" parameterType="com.ys.po.User">
select * from user
<where>
<if test="username != null and username != ''">
AND username = #{username}
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
</where>
</select>
<if>:根据条件包含SQL片段。
<select id="selectUserByUsernameAndSex" resultType="user" parameterType="com.ys.po.User">
select * from user
<where>
<if test="username != null and username != ''">
AND username = #{username}
</if>
<if test="sex != null">
AND sex = #{sex}
</if>
</where>
</select>
<choose>,<when>,<otherwise>:用于多分支选择。
<select id="selectUserByChoose" resultType="com.ys.po.User" parameterType="com.ys.po.User">
select * from user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="username != null">
AND username = #{username}
</when>
<otherwise>
AND sex = #{sex}
</otherwise>
</choose>
</where>
</select>
<set>:用于动态地生成SQL语句的SET部分。
<update id="updateUser">
update user
<set>
<if test="username != null">username = #{username},</if>
<if test="sex != null">sex = #{sex},</if>
</set>
where id = #{id}
</update>
<trim>:用于去除SQL语句中的多余空格和括号。
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</trim>
</select>
<foreach>:用于遍历集合或数组。
<select id="selectUsersByIdList" resultType="user">
select * from user
where id in
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</select>