使用MyBatis #{}查询缓慢,无法启用stringtype=unspecified如何提速?
优化MyBatis String类型参数#{}执行速度的方案(无需
stringtype=unspecified配置) 1. 显式指定参数的JDBC类型
在映射文件或接口参数中明确指定String参数的JDBC类型为VARCHAR,避免MyBatis自动类型推断带来的额外开销,同时帮助数据库精准匹配索引:
- XML映射文件示例:
<select id="getUserByName" resultType="User"> SELECT id, username, email FROM user WHERE username = #{name, jdbcType=VARCHAR} </select>
- 接口参数注解示例:
User getUserByName(@Param("name") @JdbcType(JdbcType.VARCHAR) String name);
2. 启用MyBatis缓存减少重复查询
针对重复查询场景,利用MyBatis的一级/二级缓存降低数据库访问次数:
- 一级缓存默认开启,无需额外配置;
- 二级缓存需在Mapper接口添加注解或XML配置:
@CacheNamespace(eviction = FifoCache.class, flushInterval = 60000) public interface UserMapper { // 接口方法 }
3. 优化数据库连接池配置
调整连接池参数,避免因连接获取耗时拖慢查询:
以HikariCP为例,合理设置连接池大小与超时:
spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=15 spring.datasource.hikari.connection-timeout=20000
4. 优化数据库索引与SQL语句
- 确保查询条件中的String字段已建立合适的B-tree索引,避免在字段上使用函数(如
UPPER())导致索引失效; - 避免
SELECT *,只查询所需字段,减少数据传输量。
5. 自定义String类型处理器
自定义TypeHandler直接按VARCHAR类型处理参数,跳过MyBatis默认的类型推断逻辑:
public class FastStringTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter); } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); } @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); } }
在MyBatis配置中注册该处理器:
<typeHandlers> <typeHandler handler="com.yourpackage.FastStringTypeHandler" javaType="java.lang.String"/> </typeHandlers>
6. 批量处理相同参数的查询
将多个单参数查询合并为批量查询,减少数据库交互次数:
<select id="listUsersByNames" resultType="User"> SELECT id, username, email FROM user WHERE username IN <foreach collection="names" item="name" open="(" separator="," close=")"> #{name, jdbcType=VARCHAR} </foreach> </select>
内容的提问来源于stack exchange,提问作者임완택
相关产品推荐
相关产品推荐

