You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:17:06