MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,XML 配置文件扮演着至关重要的角色,它可以用来配置数据源、映射实体类与数据库表、编写 SQL 语句等。下面将详细介绍 MyBatis 中 XML 配置文件的使用。
一、MyBatis 核心配置文件
MyBatis 的核心配置文件通常命名为 mybatis-config.xml,它是 MyBatis 应用程序的入口配置文件,用于配置 MyBatis 的全局设置、数据源、映射器等信息。以下是一个简单的核心配置文件示例:
<?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> 标签用于配置多个数据库环境,每个 <environment> 标签代表一个具体的数据库环境。<transactionManager> 标签用于配置事务管理器, <dataSource> 标签用于配置数据源。<mappers> 标签用于指定映射器,这里通过 <mapper> 标签的 resource 属性指定了一个 XML 映射文件的路径。
二、XML 映射文件
XML 映射文件用于定义 SQL 语句和实体类之间的映射关系。通常一个 XML 映射文件对应一个 Mapper 接口。以下是一个简单的 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>在这个示例中,<mapper> 标签的 namespace 属性指定了对应的 Mapper 接口的全限定名。<select>、<insert>、<update> 和 <delete> 标签分别用于定义查询、添加、更新和删除操作。id 属性是该 SQL 语句的唯一标识符,resultType 属性用于指定查询结果的类型,parameterType 属性用于指定输入参数的类型。
三、SQL 语句中的参数处理
在 MyBatis 的 XML 映射文件中,SQL 语句可以通过 #{ } 或 ${ } 来引用参数。
1. #{ }:它是预编译处理,MyBatis 会将 #{ } 替换为 ? 占位符,然后使用 PreparedStatement 来执行 SQL 语句,这样可以防止 SQL 注入攻击。例如:
<select id="selectUserByName" resultType="com.example.entity.User">
SELECT * FROM users WHERE name = #{name}
</select>2. ${ }:它是字符串替换,MyBatis 会直接将 ${ } 替换为参数的值,这种方式存在 SQL 注入风险,通常用于动态表名、列名等场景。例如:
<select id="selectUserByColumn" resultType="com.example.entity.User">
SELECT * FROM users WHERE ${column} = #{value}
</select>四、动态 SQL
MyBatis 提供了强大的动态 SQL 功能,可以根据不同的条件动态生成 SQL 语句。常用的动态 SQL 标签有 <if>、<choose>、<when>、<otherwise>、<where>、<set>、<foreach> 等。
1. <if> 标签:用于条件判断,只有当条件成立时才会包含该 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> 标签:类似于 Java 中的 switch 语句,会依次判断 <when> 标签的条件,一旦某个条件成立就会执行该 <when> 标签内的 SQL 片段,若所有条件都不成立则执行 <otherwise> 标签内的 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> 标签:用于遍历集合,常用于批量操作。例如:
<delete id="deleteUsersByIds" parameterType="java.util.List">
DELETE FROM users WHERE id IN
<foreach item="id" collection="list" open="(" separator="," close=")">
#{id}
</foreach>
</delete>五、结果映射
当数据库表的列名和实体类的属性名不一致时,需要使用结果映射来建立它们之间的映射关系。MyBatis 提供了 <resultMap> 标签来实现结果映射。以下是一个示例:
<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> 标签定义了一个名为 UserResultMap 的结果映射,<id> 标签用于映射主键,<result> 标签用于映射普通属性。在 <select> 标签中,使用 resultMap 属性引用了该结果映射。
六、总结
MyBatis 的 XML 配置文件在整个框架中起着关键作用,通过核心配置文件可以配置数据源、事务管理器等全局信息,通过 XML 映射文件可以定义 SQL 语句和实体类之间的映射关系。同时,MyBatis 提供的参数处理、动态 SQL 和结果映射等功能,使得开发者可以更加灵活地编写和管理 SQL 语句。掌握 MyBatis 的 XML 配置文件的使用,对于开发高效、安全的持久层应用程序至关重要。
在实际开发中,要根据具体的业务需求合理使用各种标签和功能,同时要注意 SQL 注入等安全问题。通过不断实践和学习,能够更好地发挥 MyBatis 的优势,提高开发效率和代码质量。