当前位置: 首页 > news >正文

14、《SpringBoot+MyBatis集成(2)——进阶配置XML与注解的灵活运用》


SpringBoot+MyBatis集成进阶配置 - XML与注解的灵活运用


前言

在Spring Boot与MyBatis的集成开发中,开发者常面临XML映射文件注解两种SQL定义方式的选择,以及复杂场景下的动态SQL、多数据源等进阶需求。本文将从核心配置的灵活性出发,对比XML与注解的适用场景,详解动态SQL的实现技巧,并结合ResultMaptypeAliases等高级特性,最终通过多数据源配置实战演示企业级解决方案。无论你是希望优化现有项目,还是应对复杂业务逻辑,本文均能提供清晰的实践路径。


一、XML与注解:如何选择?
1. 注解的简洁与局限

通过@Select@Insert等注解直接在Mapper接口中编写SQL,适合简单、静态的SQL场景,例如:

@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);

优点

  • 代码简洁,无需维护XML文件。
  • 适合快速开发小型项目。

缺点**:

  • 复杂SQL可读性差(如动态条件、关联查询)。
  • 无法直接使用MyBatis的动态SQL标签。

2. XML的动态与强大

XML映射文件通过<if><foreach>等标签支持动态SQL,适合复杂查询和批量操作:

<select id="findUsers" resultType="User">
  SELECT * FROM user
  <where>
    <if test="name != null">AND name = #{name}</if>
    <if test="status != null">AND status = #{status}</if>
  </where>
</select>

优点

  • 动态SQL灵活,易于维护复杂逻辑。
  • 支持结果集映射(ResultMap)和关联查询。

缺点

  • 需额外维护XML文件,项目结构稍显复杂。

结论简单查询用注解,复杂逻辑用XML,二者可混合使用!


二、动态SQL实战:提升代码灵活性
1. 条件分支与循环
  • <if>标签:根据参数动态拼接条件。
  • <foreach>标签:实现批量插入或IN查询:
<insert id="batchInsert">
  INSERT INTO user (name, email) VALUES
  <foreach item="user" collection="list" separator=",">
    (#{user.name}, #{user.email})
  </foreach>
</insert>
2. 多表关联查询与ResultMap

通过ResultMap定义嵌套结果集,解决一对多关联查询:

<resultMap id="OrderWithItems" type="Order">
  <id property="id" column="order_id"/>
  <collection property="items" ofType="OrderItem">
    <id property="id" column="item_id"/>
    <result property="product" column="product_name"/>
  </collection>
</resultMap>

三、核心配置优化:typeAliases与mapperLocations
1. 简化实体类引用

application.yml中配置type-aliases-package,避免XML中写全类名:

mybatis:
  type-aliases-package: com.example.entity
  mapper-locations: classpath:mapper/*.xml
2. 自动扫描Mapper接口

通过@MapperScan注解指定Mapper接口路径,避免逐个添加@Mapper

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application { ... }

四、多数据源配置实战
场景需求

同时连接主库(写操作)从库(读操作),需独立配置数据源与MyBatis会话。

1. 主数据源配置
@Configuration
@MapperScan(basePackages = "com.example.mapper.primary", sqlSessionFactoryRef = "primarySqlSessionFactory")
public class PrimaryDataSourceConfig {

    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/primary/*.xml"));
        return bean.getObject();
    }
}
2. 从数据源配置
@Configuration
@MapperScan(basePackages = "com.example.mapper.secondary", sqlSessionFactoryRef = "secondarySqlSessionFactory")
public class SecondaryDataSourceConfig {

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/secondary/*.xml"));
        return bean.getObject();
    }
}
3. 配置文件(application.yml)
spring:
  datasource:
    primary:
      url: jdbc:mysql://localhost:3306/primary_db
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver
    secondary:
      url: jdbc:mysql://localhost:3306/secondary_db
      username: root
      password: 123456
      driver-class-name: com.mysql.cj.jdbc.Driver

五、总结与最佳实践
  1. XML与注解混合使用:简单CRUD用注解,动态SQL和关联查询用XML。
  2. 动态SQL提升灵活性:善用<if><foreach>处理复杂业务逻辑。
  3. 配置优化技巧type-aliases-package简化代码,mapperLocations规范路径。
  4. 多数据源方案:通过独立配置DataSourceSqlSessionFactory实现读写分离。

避坑指南

  • 多数据源场景下,需明确指定@MapperScansqlSessionFactoryRef属性。
  • 避免在多数据源中重复扫描同一Mapper接口路径。

欢迎在评论区留言讨论你在MyBatis配置中遇到的难题!


文章转载自:

http://tuomCUoo.Lmqfq.cn
http://Pf1o0Bu9.Lmqfq.cn
http://h7Nw57VQ.Lmqfq.cn
http://KqO93fGs.Lmqfq.cn
http://kch5Ta4R.Lmqfq.cn
http://HRcPgmzB.Lmqfq.cn
http://CcLprV8t.Lmqfq.cn
http://yzhcjcj7.Lmqfq.cn
http://EWD9xLjv.Lmqfq.cn
http://OxcBKDjj.Lmqfq.cn
http://fUNo7RLm.Lmqfq.cn
http://eOkzMZTB.Lmqfq.cn
http://mXDdSW16.Lmqfq.cn
http://D6sCjQ4F.Lmqfq.cn
http://RBNk6qyI.Lmqfq.cn
http://2NgMocjV.Lmqfq.cn
http://W1H2fB5X.Lmqfq.cn
http://Eym7FQPz.Lmqfq.cn
http://2N9xxPi1.Lmqfq.cn
http://hUBqvx5G.Lmqfq.cn
http://5qCzinTy.Lmqfq.cn
http://kMb4r8NE.Lmqfq.cn
http://AqIFmdW4.Lmqfq.cn
http://PnCrfOs7.Lmqfq.cn
http://xT5fC7KH.Lmqfq.cn
http://9uPL4Pzw.Lmqfq.cn
http://OHMyDZYS.Lmqfq.cn
http://BMpqhxYh.Lmqfq.cn
http://DoPZAHQj.Lmqfq.cn
http://vWmuCwqa.Lmqfq.cn
http://www.dtcms.com/a/28861.html

相关文章:

  • 25年2月通信基础知识补充:多普勒频移与多普勒扩展、3GPP TDL信道模型
  • 使用JWT实现微服务鉴权
  • HbuilderX如何运行到手机模拟器,安卓模拟器
  • 玩机日记 12 群晖部署AList并配置SSL,安装opkg,使用rclone挂载到本地
  • 使用 OpenTelemetry 和 Langtrace 的 Elastic 分发跟踪基于 RAG 的聊天机器人
  • 【Next.js App Router 深度解剖手册】
  • C++项目:高并发内存池_上
  • Docker构建时,设定默认进入的工作目录的方法
  • 1、FreeRTOS基础知识
  • 用户体验测试
  • unity学习50:NavMeshAgent 区域Areas和cost
  • 鸿蒙NEXT开发-应用数据持久化之关系型数据库
  • cenos 安装 /usr/local/nginx/sbin/nginx这个路径的nginx
  • 微信小程序(uni)+蓝牙连接+Xprint打印机实现打印功能
  • Windows ARM工控主板支持EC200A系列4G模块
  • 向量的点乘的几何意义
  • unity学习45:Animator 的动画层layer
  • SpringBoot整合Redis和Redision锁
  • 多任务(20250210)
  • 计算机网络之TCP的可靠传输
  • 大数据技术之HBase操作归纳
  • uniapp 安卓端 使用axios 和 renderjs 上传 FormData 参数
  • 深入浅出GraphQL:现代API设计的未来
  • C转C++
  • python小项目编程-初级(5、词频统计,6、简单得闹钟)
  • 巧用GitHub的CICD功能免费打包部署前端项目
  • 易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR
  • 【黑马点评】——相关文章汇总(包括实现,优化,测试和面经总结)
  • 亚马逊新规木炭/火柴/打火机政策SOR/2016-178/182/187标准检测流程:
  • 跟着 Lua 5.1 官方参考文档学习 Lua (5)