温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis怎样优化

发布时间:2026-10-13 22:11:42 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

在 Java 项目中使用 MyBatis 时,优化通常可以从 SQL、配置、架构、代码写法、监控 几个层面来做。下面系统地总结常见优化点(实战向)。


一、SQL 层面优化(最重要)

1. 避免 SELECT *

<!-- 不推荐 -->
<select id="list" resultType="User">
  SELECT * FROM user
</select>

<!-- 推荐 -->
SELECT id, username, status FROM user

✅ 减少 IO、内存、网络开销


2. 合理使用索引

  • 查询条件字段要有索引
  • 避免:
    • 索引列使用函数
    • 隐式类型转换
    • LIKE '%xx'
-- 不走索引
WHERE DATE(create_time) = '2024-01-01'

-- 走索引
WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02'

3. 分页优化

-- 低效
LIMIT 100000, 10

-- 优化(游标分页)
WHERE id > 100000 LIMIT 10

4. 批量操作代替循环单条

<insert id="batchInsert">
  INSERT INTO user (name, age) VALUES
  <foreach collection="list" item="u" separator=",">
    (#{u.name}, #{u.age})
  </foreach>
</insert>

或:

sqlSession.flushStatements();

二、MyBatis 配置优化

5. 开启驼峰映射

mybatis:
  configuration:
    map-underscore-to-camel-case: true

避免手动 resultMap


6. 使用 resultMap 而非 resultType(复杂对象)

  • 一对一 / 一对多
  • 避免重复字段映射

7. 合理使用 fetchType

<collection property="orders" ofType="Order" fetchType="lazy"/>

✅ 防止一次性加载大量数据


三、缓存优化

8. 一级缓存(SqlSession)

  • 默认开启
  • 同一 SqlSession 内有效

⚠️ Spring 中每次请求新 SqlSession,效果有限


9. 二级缓存(Mapper 级别)

<cache/>

适合:

  • 读多写少
  • 数据变化不频繁

❌ 分布式环境慎用(建议 Redis)


10. 使用 Redis 做业务缓存(推荐)

user = redis.get(id);
if (user == null) {
    user = userMapper.selectById(id);
    redis.set(id, user);
}

四、动态 SQL 优化

11. 避免 <if> 导致索引失效

<if test="name != null">
  AND name = #{name}
</if>

✅ 注意拼接后是否还能走索引


12. 使用 <sql> + <include> 复用

<sql id="Base_Column">id, name, age</sql>

<select id="list">
  SELECT <include refid="Base_Column"/> FROM user
</select>

五、连接与执行优化

13. 使用连接池(HikariCP 推荐)

spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5

14. 开启 MyBatis 日志定位慢 SQL

logging:
  level:
    com.xxx.mapper: debug

六、架构级优化

15. 读写分离

  • 写:主库
  • 读:从库

MyBatis + Spring + AbstractRoutingDataSource


16. 分库分表(数据量大)

  • ShardingSphere
  • 按 ID / 时间分片

17. 避免大事务

@Transactional
public void bigMethod() {
    // 只放必要 SQL
}

七、常见性能坑

❌ 循环中调用 Mapper
❌ 返回 List<Map> 大量字段
❌ 一次性查全表
❌ 滥用 <resultMap autoMapping>


八、推荐监控工具

  • p6spy(SQL 耗时)
  • Druid Monitor
  • SkyWalking
  • Prometheus + Grafana

如果你愿意,我可以:

  • ✅ 针对你 具体 SQL / XML 优化
  • ✅ 给你一个 MyBatis 性能最佳实践模板
  • ✅ 讲 Spring Boot + MyBatis 调优实战

你可以直接贴代码或说业务场景。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手