SpringMVC项目中MySQL+MyBatis与Spring Data MongoDB整合实现求助
我明白在SpringMVC项目里同时整合MyBatis+MySQL和Spring Data MongoDB确实容易踩坑,尤其是数据源和会话工厂的配置冲突问题。下面给你一套完整的示例代码和配置步骤,应该能帮你顺利搞定:
1. Maven依赖配置(pom.xml)
先把需要的依赖都引入,确保版本兼容:
<dependencies> <!-- SpringMVC核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.20</version> </dependency> <!-- MyBatis整合Spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> </dependency> <!-- Spring Data MongoDB --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>3.3.4</version> </dependency> <!-- 可选:数据库连接池(用Druid更稳定) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.11</version> </dependency> <!-- Servlet API(容器提供,无需打包) --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>
2. 核心配置文件
2.1 Spring 上下文配置(applicationContext.xml)
这个文件是核心,要把MyBatis和MongoDB的配置完全隔离,避免互相干扰:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd"> <!-- 1. 配置MySQL数据源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="your_mysql_password"/> </bean> <!-- 2. 配置MyBatis的SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!-- 可选:指定MyBatis全局配置文件 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- 可选:给MySQL实体类设置别名,简化Mapper里的引用 --> <property name="typeAliasesPackage" value="com.example.entity.mysql"/> </bean> <!-- 3. 扫描MyBatis的Mapper接口 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.example.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> </bean> <!-- 4. 配置MongoDB连接 --> <mongo:mongo-client host="localhost" port="27017"> <mongo:client-options connection-timeout="10000"/> </mongo:mongo-client> <!-- 5. 配置MongoTemplate,操作MongoDB的核心类 --> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoClient"/> <constructor-arg value="test_mongo_db"/> <!-- 指定MongoDB数据库名 --> </bean> <!-- 6. 扫描Spring Data MongoDB的Repository接口 --> <mongo:repositories base-package="com.example.repository.mongo"/> <!-- 扫描Service层组件 --> <context:component-scan base-package="com.example.service"/> </beans>
2.2 SpringMVC 配置(spring-mvc.xml)
这个文件只负责MVC相关配置,别和持久层配置混在一起:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 只扫描Controller层,避免和Service层重复扫描 --> <context:component-scan base-package="com.example.controller"/> <!-- 启用注解驱动,支持@RestController、@RequestMapping等 --> <mvc:annotation-driven/> <!-- 视图解析器(如果用JSP视图的话) --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
3. 实体类示例
MySQL实体类(com.example.entity.mysql.User)
package com.example.entity.mysql; public class User { private Integer id; private String username; private String email; // Getter和Setter方法 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
MongoDB实体类(com.example.entity.mongo.Log)
package com.example.entity.mongo; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import java.util.Date; @Document(collection = "operation_log") // 指定MongoDB对应的集合名 public class Log { @Id // MongoDB的主键标识 private String id; private String operation; private Date createTime; // Getter和Setter方法 public String getId() { return id; } public void setId(String id) { this.id = id; } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
4. MyBatis Mapper示例(com.example.mapper.UserMapper)
这里用注解方式简化配置,也可以用XML写SQL:
package com.example.mapper; import com.example.entity.mysql.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; public interface UserMapper { @Select("SELECT id, username, email FROM user WHERE id = #{id}") User getUserById(Integer id); @Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})") int insertUser(User user); }
5. Spring Data MongoDB Repository示例(com.example.repository.mongo.LogRepository)
继承MongoRepository就能自动获得CRUD方法,也可以自定义查询:
package com.example.repository.mongo; import com.example.entity.mongo.Log; import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface LogRepository extends MongoRepository<Log, String> { // 自定义查询:根据操作类型查询日志 List<Log> findByOperation(String operation); }
6. Service层示例(com.example.service.UserService)
在Service里同时注入MyBatis的Mapper和MongoDB的Repository,实现业务逻辑:
package com.example.service; import com.example.entity.mysql.User; import com.example.entity.mongo.Log; import com.example.mapper.UserMapper; import com.example.repository.mongo.LogRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; @Service @Transactional // 这个注解只对MySQL的操作生效,MongoDB不需要事务 public class UserService { @Autowired private UserMapper userMapper; @Autowired private LogRepository logRepository; public User getUserById(Integer id) { // 从MySQL查询用户 User user = userMapper.getUserById(id); // 记录操作日志到MongoDB Log log = new Log(); log.setOperation("查询用户,ID:" + id); log.setCreateTime(new Date()); logRepository.save(log); return user; } public void addUser(User user) { // 插入用户到MySQL userMapper.insertUser(user); // 记录日志到MongoDB Log log = new Log(); log.setOperation("新增用户,用户名:" + user.getUsername()); log.setCreateTime(new Date()); logRepository.save(log); } }
7. Controller层示例(com.example.controller.UserController)
写个简单的接口测试整合效果:
package com.example.controller; import com.example.entity.mysql.User; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUser(@PathVariable Integer id) { return userService.getUserById(id); } @PostMapping("/add") public String addUser(@RequestBody User user) { userService.addUser(user); return "用户新增成功"; } }
8. 关键注意事项
- 包路径隔离:一定要把MyBatis的Mapper、MySQL实体类和MongoDB的Repository、Mongo实体类放在不同的包下,避免Spring扫描时混淆。
- 事务区别:
@Transactional只对MySQL的操作生效,MongoDB本身默认不支持事务(除非配置副本集),所以不用给MongoDB操作加事务注解。 - 连接验证:确保MySQL和MongoDB服务都正常启动,配置的IP、端口、账号密码、数据库名都是正确的。
- MyBatis配置可选:如果不需要全局的MyBatis配置(比如插件、缓存),可以省略
mybatis-config.xml,直接在SqlSessionFactoryBean里配置别名等参数。
内容的提问来源于stack exchange,提问作者user9443945
相关产品推荐
相关产品推荐

