spring mvc中如何使用mybatis进行xml映射
时间: 2025-08-18 21:30:33 浏览: 4
<think>好的,我现在需要帮助用户解决在Spring MVC中使用MyBatis通过XML映射编写SQL查询的问题。用户之前已经询问过Spring MVC中编写SQL的方法,现在具体想了解如何结合MyBatis的XML映射来实现。让我先回顾一下之前的对话,确保信息的一致性和连贯性。
首先,用户的历史提问是关于在Spring MVC中书写SQL,我之前的回答涵盖了JPA、MyBatis和JDBC三种方式,并重点提到了MyBatis的XML映射文件示例。现在用户进一步询问具体的示例,说明他们可能已经决定使用MyBatis,并需要更详细的指导。
接下来,我需要确保回答符合用户的要求,即提供一个详细的示例,包括配置、XML映射文件的编写、Mapper接口、Service层和Controller的实现,以及测试步骤。同时,用户提到了参考站内的引用,其中有一个步骤列表,包括创建项目、配置框架、编写各层代码和测试。我需要将这些步骤整合到回答中,确保结构清晰,步骤明确。
考虑到用户可能需要从零开始搭建项目,我应该详细说明每个步骤,特别是配置部分,比如添加依赖、配置数据源和MyBatis。同时,要强调XML映射文件的位置和结构,以及如何与Mapper接口关联。用户可能对MyBatis的动态SQL感兴趣,因此添加动态查询示例会更有帮助。
另外,用户可能关心最佳实践,比如如何防止SQL注入,使用#{}而不是${},以及事务管理。这些内容需要在回答中提及,以增强答案的实用性。同时,考虑到用户之前的问题中提到了性能优化和代码组织规范,这部分内容也应该包含在最佳实践中。
我需要检查是否有遗漏的步骤,比如测试部分,可能需要指导用户如何编写简单的测试用例,或者使用Postman进行接口测试。此外,常见问题部分可以帮助用户避免常见的配置错误,比如XML文件路径不正确或接口与XML的命名空间不匹配。
最后,确保回答的结构清晰,使用标题分隔不同的部分,代码示例格式正确,并且语言简洁易懂。同时,生成的相关问题需要与当前主题紧密相关,帮助用户进一步探索MyBatis的高级功能或与其他框架的对比。</think>### Spring MVC + MyBatis XML 映射 SQL 详细示例
#### 一、环境准备(基于 Maven)
```xml
<!-- pom.xml 核心依赖 -->
<dependencies>
<!-- Spring MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<!-- MyBatis-Spring 整合 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.0</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
```
---
#### 二、XML映射文件核心示例
```xml
<!-- src/main/resources/mapper/UserMapper.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="BaseResultMap" type="User">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="username" property="name" jdbcType="VARCHAR"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
</resultMap>
<!-- 动态查询示例 -->
<select id="selectByCondition" resultMap="BaseResultMap">
SELECT * FROM users
<where>
<if test="name != null">
AND username LIKE CONCAT('%', #{name}, '%')
</if>
<if test="minAge != null">
AND age >= #{minAge}
</if>
</where>
ORDER BY id DESC
</select>
<!-- 插入并返回自增ID -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, email)
VALUES (#{name}, #{email})
</insert>
</mapper>
```
---
#### 三、关键组件实现
1. **Mapper 接口定义**
```java
// src/main/java/com/example/mapper/UserMapper.java
public interface UserMapper {
List<User> selectByCondition(@Param("name") String name,
@Param("minAge") Integer minAge);
int insertUser(User user);
}
```
2. **Service 层实现**
```java
// src/main/java/com/example/service/UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public List<User> searchUsers(String keyword, Integer minAge) {
return userMapper.selectByCondition(keyword, minAge);
}
}
```
3. **Spring 配置要点**
```xml
<!-- src/main/resources/spring-mybatis.xml -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper"/>
</bean>
```
---
#### 四、执行验证示例
```java
// JUnit 测试示例
@RunWith(SpringRunner.class)
@ContextConfiguration("classpath:spring-mybatis.xml")
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testDynamicQuery() {
List<User> users = userMapper.selectByCondition("张", 18);
Assert.assertTrue(users.size() > 0);
}
}
```
---
#### 五、最佳实践要点
1. **XML 文件规范**
- 所有 SQL 映射文件存放在 `/resources/mapper/` 目录
- 命名规范:`[EntityName]Mapper.xml`
- 每个 `<select>` 必须指定 `resultMap` 或 `resultType`
2. **防止 SQL 注入**
- 动态参数必须使用 `#{}`(预编译处理)
- 禁止直接拼接 `${}` 接收用户输入
3. **性能优化**
```xml
<!-- 批量插入优化 -->
<insert id="batchInsert">
INSERT INTO users (username, email) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.email})
</foreach>
</insert>
```
---
#### 六、常见问题排查
1. **XML 未加载**
检查 `sqlSessionFactory` 的 `mapperLocations` 配置路径
2. **参数映射失败**
确保接口方法使用 `@Param` 注解命名参数
3. **事务不生效**
确认 Service 类已添加 `@Transactional` 注解
检查是否开启注解驱动:
```xml
<tx:annotation-driven transaction-manager="transactionManager"/>
```
---
阅读全文
相关推荐




















