在 Java 项目中使用 MyBatis 时,优化通常可以从 SQL、配置、架构、代码写法、监控 几个层面来做。下面系统地总结常见优化点(实战向)。
SELECT *<!-- 不推荐 -->
<select id="list" resultType="User">
SELECT * FROM user
</select>
<!-- 推荐 -->
SELECT id, username, status FROM user
✅ 减少 IO、内存、网络开销
LIKE '%xx'-- 不走索引
WHERE DATE(create_time) = '2024-01-01'
-- 走索引
WHERE create_time >= '2024-01-01' AND create_time < '2024-01-02'
-- 低效
LIMIT 100000, 10
-- 优化(游标分页)
WHERE id > 100000 LIMIT 10
<insert id="batchInsert">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="u" separator=",">
(#{u.name}, #{u.age})
</foreach>
</insert>
或:
sqlSession.flushStatements();
mybatis:
configuration:
map-underscore-to-camel-case: true
避免手动 resultMap
resultMap 而非 resultType(复杂对象)fetchType<collection property="orders" ofType="Order" fetchType="lazy"/>
✅ 防止一次性加载大量数据
⚠️ Spring 中每次请求新 SqlSession,效果有限
<cache/>
适合:
❌ 分布式环境慎用(建议 Redis)
user = redis.get(id);
if (user == null) {
user = userMapper.selectById(id);
redis.set(id, user);
}
<if> 导致索引失效<if test="name != null">
AND name = #{name}
</if>
✅ 注意拼接后是否还能走索引
<sql> + <include> 复用<sql id="Base_Column">id, name, age</sql>
<select id="list">
SELECT <include refid="Base_Column"/> FROM user
</select>
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
logging:
level:
com.xxx.mapper: debug
MyBatis + Spring + AbstractRoutingDataSource
@Transactional
public void bigMethod() {
// 只放必要 SQL
}
❌ 循环中调用 Mapper
❌ 返回 List<Map> 大量字段
❌ 一次性查全表
❌ 滥用 <resultMap autoMapping>
如果你愿意,我可以:
你可以直接贴代码或说业务场景。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。