【SpringBoot】执行mapper文件,bean属性值变化

博客探讨了在SpringBoot集成Mybatis时,由于mapper文件中selectKey标签返回类型与insert标签不一致,导致bean属性值变化的问题。详细分析了selectKey返回String与insert返回int的冲突,并提供了日志截图作为证据。

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

参考:https://blog.youkuaiyun.com/czd3355/article/details/71302441
参考:https://blog.youkuaiyun.com/isea533/article/details/21153791

查询后发现是mapper文件中selectKey标签的影响

<insert id="insert" parameterType="com.xxx.xxx.bean.OutlandProject">
  <selectKey keyProperty="pid" order="AFTER" resultType="java.lang.String">
    SELECT LAST_INSERT_ID()
  </selectKey>
  insert into outland_project (pid, npr, bom, auth)
      values (#{pid,jdbcType=VARCHAR},#{npr,jdbcType=VARCHAR}, #{bom,jdbcType=VARCHAR}, #{auth,jdbcType=VARCHAR})
</insert>

selectKey标签中返回主键的类型是String,而insert标签的返回值是int,所以返回的OutlandProject的主键pid变化了

日志如图:

### 如何在 Spring Boot 中配置 MyBatis 的自定义 Mapper 路径 要在 Spring Boot 中配置 MyBatis 并指定自定义的 Mapper 文件路径,可以通过 `application.yml` 或 `application.properties` 来完成。以下是详细的说明: #### 1. 配置文件中的设置 通过配置文件可以指定 MyBatis 的 SQL 映射文件的位置以及全局配置文件的位置。例如,在 YAML 格式的配置文件中,可以这样写[^1]: ```yaml spring: datasource: username: root password: 1234 url: jdbc:mysql://localhost:3306/mydb driver-class-name: com.mysql.cj.jdbc.Driver mybatis: config-location: classpath:mybatis/mybatis-config.xml # 全局配置文件位置 mapper-locations: classpath:mybatis/mapper/*.xml # 自定义 Mapper 文件路径 ``` 上述配置指定了两个重要参数: - **config-location**: 定义了 MyBatis 的全局 XML 配置文件所在位置。 - **mapper-locations**: 指定 SQL 映射文件所在的目录。 如果需要更灵活的方式加载多个路径下的 Mapper 文件,则可以在 `mapper-locations` 使用通配符或者分号分割多个路径。 --- #### 2. Java 配置类支持 除了通过配置文件外,还可以借助 Java 配置类实现更加复杂的场景需求。比如引入额外的功能模块或动态调整资源加载逻辑时,推荐创建一个专门用于 MyBatis 的配置类并标注相应的注解[^2]。 下面是一个简单的例子展示如何手动注册 Mapper 所需的内容: ```java package org.springboot.sample.config; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @MapperScan(basePackages = "org.springboot.sample.mapper") // 设置 Mapper 接口扫描的基础包 public class MyBatisConfig { @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { // 可在此处进一步定制化 SqlSessionFactory 实现细节... return new SqlSessionFactory(); } } ``` 此方法允许开发者显式声明哪些包内的接口会被识别为 MyBatis Mappers,并且能够方便地注入其他 Bean 进行依赖管理。 --- #### 3. 动态多数据源的支持(可选) 对于某些复杂项目可能涉及切换不同数据库实例的情况,这时就需要考虑加入动态数据源功能。通常做法是先定义好各个可用的数据源类型作为枚举值[^5],再配合 AOP 切面技术实现在运行期间无缝转换目标连接池。 示例代码如下所示: ```java // 枚举表示不同的数据源名称 public enum DBTypeEnum { MASTER, SLAVE1, SLAVE2; } // 数据源上下文持有器 @Component public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDbType(DBTypeEnum dbType) { contextHolder.set(dbType.name()); } public static String getDbType() { return contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } } ``` 随后还需要编写具体的路由策略和服务提供者来绑定这些抽象概念至实际物理对象之上。 --- #### 总结 综上所述,无论是采用静态方式还是动态机制都可以很好地满足大多数业务系统的开发诉求。只需按照官方文档指引合理安排各项属性即可轻松达成预期效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值