MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。在 MyBatis 中,XML 配置文件扮演著至關(guān)重要的角色,它可以用來配置數(shù)據(jù)源、映射實(shí)體類與數(shù)據(jù)庫表、編寫 SQL 語句等。下面將詳細(xì)介紹 MyBatis 中 XML 配置文件的使用。
一、MyBatis 核心配置文件
MyBatis 的核心配置文件通常命名為 mybatis-config.xml,它是 MyBatis 應(yīng)用程序的入口配置文件,用于配置 MyBatis 的全局設(shè)置、數(shù)據(jù)源、映射器等信息。以下是一個(gè)簡(jiǎn)單的核心配置文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>
</configuration>在上述代碼中,<environments> 標(biāo)簽用于配置多個(gè)數(shù)據(jù)庫環(huán)境,每個(gè) <environment> 標(biāo)簽代表一個(gè)具體的數(shù)據(jù)庫環(huán)境。<transactionManager> 標(biāo)簽用于配置事務(wù)管理器, <dataSource> 標(biāo)簽用于配置數(shù)據(jù)源。<mappers> 標(biāo)簽用于指定映射器,這里通過 <mapper> 標(biāo)簽的 resource 屬性指定了一個(gè) XML 映射文件的路徑。
二、XML 映射文件
XML 映射文件用于定義 SQL 語句和實(shí)體類之間的映射關(guān)系。通常一個(gè) XML 映射文件對(duì)應(yīng)一個(gè) Mapper 接口。以下是一個(gè)簡(jiǎn)單的 XML 映射文件示例:
<?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.example.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.entity.User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.entity.User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
<update id="updateUser" parameterType="com.example.entity.User">
UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}
</update>
<delete id="deleteUserById" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>在這個(gè)示例中,<mapper> 標(biāo)簽的 namespace 屬性指定了對(duì)應(yīng)的 Mapper 接口的全限定名。<select>、<insert>、<update> 和 <delete> 標(biāo)簽分別用于定義查詢、添加、更新和刪除操作。id 屬性是該 SQL 語句的唯一標(biāo)識(shí)符,resultType 屬性用于指定查詢結(jié)果的類型,parameterType 屬性用于指定輸入?yún)?shù)的類型。
三、SQL 語句中的參數(shù)處理
在 MyBatis 的 XML 映射文件中,SQL 語句可以通過 #{ } 或 ${ } 來引用參數(shù)。
1. #{ }:它是預(yù)編譯處理,MyBatis 會(huì)將 #{ } 替換為 ? 占位符,然后使用 PreparedStatement 來執(zhí)行 SQL 語句,這樣可以防止 SQL 注入攻擊。例如:
<select id="selectUserByName" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{name}
</select>2. ${ }:它是字符串替換,MyBatis 會(huì)直接將 ${ } 替換為參數(shù)的值,這種方式存在 SQL 注入風(fēng)險(xiǎn),通常用于動(dòng)態(tài)表名、列名等場(chǎng)景。例如:
<select id="selectUserByColumn" resultType="com.example.entity.User">
SELECT * FROM users WHERE ${column} = #{value}
</select>四、動(dòng)態(tài) SQL
MyBatis 提供了強(qiáng)大的動(dòng)態(tài) SQL 功能,可以根據(jù)不同的條件動(dòng)態(tài)生成 SQL 語句。常用的動(dòng)態(tài) SQL 標(biāo)簽有 <if>、<choose>、<when>、<otherwise>、<where>、<set>、<foreach> 等。
1. <if> 標(biāo)簽:用于條件判斷,只有當(dāng)條件成立時(shí)才會(huì)包含該 SQL 片段。例如:
<select id="selectUserByCondition" resultType="com.example.entity.User">
SELECT * FROM users
<where>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>2. <choose>、<when>、<otherwise> 標(biāo)簽:類似于 Java 中的 switch 語句,會(huì)依次判斷 <when> 標(biāo)簽的條件,一旦某個(gè)條件成立就會(huì)執(zhí)行該 <when> 標(biāo)簽內(nèi)的 SQL 片段,若所有條件都不成立則執(zhí)行 <otherwise> 標(biāo)簽內(nèi)的 SQL 片段。例如:
<select id="selectUserByChoose" resultType="com.example.entity.User">
SELECT * FROM users
<where>
<choose>
<when test="name != null and name != ''">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND 1 = 1
</otherwise>
</choose>
</where>
</select>3. <foreach> 標(biāo)簽:用于遍歷集合,常用于批量操作。例如:
<delete id="deleteUsersByIds" parameterType="java.util.List">
DELETE FROM users WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</delete>五、結(jié)果映射
當(dāng)數(shù)據(jù)庫表的列名和實(shí)體類的屬性名不一致時(shí),需要使用結(jié)果映射來建立它們之間的映射關(guān)系。MyBatis 提供了 <resultMap> 標(biāo)簽來實(shí)現(xiàn)結(jié)果映射。以下是一個(gè)示例:
<resultMap id="UserResultMap" type="com.example.entity.User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<result property="age" column="user_age"/>
</resultMap>
<select id="selectUserByIdWithResultMap" resultMap="UserResultMap">
SELECT user_id, user_name, user_age FROM users WHERE user_id = #{id}
</select>在上述代碼中,<resultMap> 標(biāo)簽定義了一個(gè)名為 UserResultMap 的結(jié)果映射,<id> 標(biāo)簽用于映射主鍵,<result> 標(biāo)簽用于映射普通屬性。在 <select> 標(biāo)簽中,使用 resultMap 屬性引用了該結(jié)果映射。
六、總結(jié)
MyBatis 的 XML 配置文件在整個(gè)框架中起著關(guān)鍵作用,通過核心配置文件可以配置數(shù)據(jù)源、事務(wù)管理器等全局信息,通過 XML 映射文件可以定義 SQL 語句和實(shí)體類之間的映射關(guān)系。同時(shí),MyBatis 提供的參數(shù)處理、動(dòng)態(tài) SQL 和結(jié)果映射等功能,使得開發(fā)者可以更加靈活地編寫和管理 SQL 語句。掌握 MyBatis 的 XML 配置文件的使用,對(duì)于開發(fā)高效、安全的持久層應(yīng)用程序至關(guān)重要。
在實(shí)際開發(fā)中,要根據(jù)具體的業(yè)務(wù)需求合理使用各種標(biāo)簽和功能,同時(shí)要注意 SQL 注入等安全問題。通過不斷實(shí)踐和學(xué)習(xí),能夠更好地發(fā)揮 MyBatis 的優(yōu)勢(shì),提高開發(fā)效率和代碼質(zhì)量。