Mybatis的mapper.xml配置文件——详解

本文详细介绍了MyBatis映射文件的使用方法,包括如何定义SQL语句、参数和返回值类型,以及如何使用公共SQL代码块、条件语句和循环语句等高级特性。同时,还讲解了如何自定义结果集映射,以及如何处理主键生成等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?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">
<!-- namespace:填写映射当前的Mapper接口,所有的增删改查的参数和返回值类型,
		就可以直接填写缩写,不区分大小写,直接通过方法名去找类型-->
<mapper namespace="com.itheima.mapper.UserMapper">
	<!-- sql:里面可以写入一个共同的sql代码,用于提取重复的代码。
		要使用该代码的时候就直接使用<include>标签
		id:为提取的sql代码,取一个id,起标识作用
		 -->
	<sql id="select">
		select * from user
	</sql>
	<!-- public User findUserById(int id); 
		id:填写在XxxMapper接口中的方法名
		parameterType:填写参数的类型
		resultType:填写方法中返回值的类型,不用写全路径,不区分大小写
	-->
	<select id="findUserById" parameterType="int" resultType="user">
		<!-- include:用于加载提取公共的sql语句,与<sql>标签对应
		       refid:填写<sql>标签中的id属性
		 -->
		<include refid="select"></include>
		where id = #{id}
	</select>
	<!-- resultMap属性:与resultMap标签一起使用,填写resultMap标签中定义的id属性 -->
	<select id="findAllOrders" resultMap="orders">
		select * from orders
	</select>
	<!-- resultMap标签:用于自定义封装结果
		type:最终结果还是封装到实体类中,type就是指定封装到哪一个类中
		id:与<select>标签中的resultMap中的属性一直,一定要唯一
		<id>:该标签是指定主键封装到实体类中的哪一个属性(可以省略)
		<result>:该标签是其他的列封装到实体类中,一般只需填写实体类中的属性与表中列不同的项即可
			property:填写实体类中的属性,column:填写表中的列名
	 -->
	<resultMap type="Orders" id="orders">
		<id property="id" column="id"/>
		<result property="userId" column="user_id"/>
	</resultMap>
	<!--  public void addUser(User user);
		insert:用于执行添加语句;update:执行更新语句
	   同样 delete:执行删除语句
	 -->
	<insert id="addUser" parameterType="user">
		<!-- selectKey配置主键信息的标签
			keyColumn:对应数据库表中的主键列
			keyProperty:对应实体类中的属性
			after:代表执行下面代码之前,先执行当前里面的代码
		 -->
		 <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
		 	select LAST_INSERT_ID()
		 </selectKey>
		insert into user
		(username,sex,address)
		values(#{username},#{sex},#{address})
	</insert>
	<!-- public List<User> findUserBySexAndUsername(User user); -->
	<select id="findUserBySexAndUsername" parameterType="User" resultType="user">
		<!--select * from user  where 1=1 -->
		<include refid="select"></include>
		<!-- where标签:一个where条件语句,通常和<if>标签混合使用 -->
		<where>
		<!-- if标签:执行一个判断语句,成立才会执行标签体内的sql语句
			test:写上条件判断语句
			注意:这里每一个if前面都尽量加上and,如果你是第一个条件,框架会自动帮你把and截取,如果是第二个if就不能省略and
		 -->
		<if test="sex != null and sex != ''">
			and sex = #{sex} 
		</if>
		<if test="username != null and username != ''">
			and username like '%${username}%'
		</if>
		</where>
	</select>
	
	<!-- public List<User> findUserByIds(QueryVo vo); -->
	<!-- QueryVo:是一个实体包装类,通常用于封装实体类之外的一些属性-->
	<select id="findUserByIds" parameterType="QueryVo" resultType="user">
		<include refid="select"></include>
		<where>
		<!-- foreach:循环语句,通常多用于参数是集合时,需要对参数进行遍历出来,再进行赋值查询
			collection:参数类型中的集合、数组的名字,例:下面的ids就是QueryVo这个类中的list集合的名字
			item:为遍历该集合起一个变量名,遍历出来的每一个字,都赋值到这个item中
			open:在sql语句前面添加的sql片段
			close:在sql语句后面添加的sql片段
			separator:指定遍历元素之前用什么分隔符
		 -->
		<foreach collection="ids" item="id" open="id in(" close=")" separator=",">
			#{id}
		</foreach>
		</where>
	</select>
</mapper>
编写 `mapper.xml` 文件是使用 MyBatis 框架进行数据库操作的核心部分之一。该文件定义了 SQL 语句以及如何将结果映射到 Java 对象中。 ### 基本结构 一个典型的 `mapper.xml` 文件包含以下部分: - **命名空间(namespace)**:用于唯一标识一组 SQL 映射语句。 - **SQL 语句标签**:如 `<select>`, `<insert>`, `<update>`, `<delete>` 等。 - **参数映射**:通过 `<parameterMap>` 或直接在 SQL 标签内指定参数类型。 - **结果映射**:通过 `<resultMap>` 定义数据库列与 Java 类属性之间的映射关系。 #### 示例代码 ```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"> <!-- 结果映射 --> <resultMap id="UserResult" type="com.example.model.User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="email"/> </resultMap> <!-- 查询所有用户 --> <select id="selectAllUsers" resultMap="UserResult"> SELECT user_id, user_name, email FROM users </select> <!-- 根据ID查询用户 --> <select id="selectUserById" parameterType="int" resultMap="UserResult"> SELECT user_id, user_name, email FROM users WHERE user_id = #{id} </select> <!-- 插入新用户 --> <insert id="insertUser" parameterType="com.example.model.User"> INSERT INTO users (user_name, email) VALUES (#{username}, #{email}) </insert> <!-- 更新用户信息 --> <update id="updateUser" parameterType="com.example.model.User"> UPDATE users SET user_name = #{username}, email = #{email} WHERE user_id = #{id} </update> <!-- 删除用户 --> <delete id="deleteUserById" parameterType="int"> DELETE FROM users WHERE user_id = #{id} </delete> </mapper> ``` ### 关键概念详解 1. **命名空间(namespace)** - 每个 `mapper.xml` 文件都有一个唯一的命名空间,通常对应一个接口或 DAO 类。 - 这有助于避免不同模块之间 SQL 映射的冲突。 2. **结果映射(resultMap)** - 使用 `<resultMap>` 可以明确地定义数据库字段与 Java 对象属性之间的映射关系。 - 特别适用于数据库字段名与 Java 属性名不一致的情况。 3. **参数传递** - 可以通过 `#{}` 占位符传递参数,MyBatis 会自动处理参数绑定。 - 支持基本类型、Java Bean、Map 等多种参数类型。 4. **自动映射** - 如果数据库字段名和 Java 属性名遵循驼峰命名规则,可以启用自动映射功能。 - 在配置文件中设置 `mapUnderscoreToCamelCase` 为 `true` 即可启用此功能[^4]。 5. **构造方法注入** - 如果希望在创建对象时直接通过构造函数注入值,可以使用 `<constructor>` 和 `<idArg>`/`<arg>` 标签。 - 这种方式适合不可变对象的设计模式[^1]。 ### 最佳实践 - **保持 SQL 清晰简洁**:尽量避免过于复杂的 SQL 逻辑,必要时可以通过存储过程来简化。 - **合理使用缓存**:对于频繁读取但较少更新的数据,可以考虑启用二级缓存以提高性能。 - **事务管理**:确保涉及多个操作的 SQL 语句在一个事务中执行,保证数据一致性。 - **安全防护**:防止 SQL 注入攻击,建议始终使用 `#{}` 而不是 `${}` 来插入变量。 通过以上示例和说明,开发者可以根据实际需求灵活编写 `mapper.xml` 文件,并结合 MyBatis 提供的强大功能实现高效的数据访问层开发。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值