MyBatis 跨库查询太难?掌握这十点宝藏技巧,轻松应对

108 阅读4分钟

大家好,我是程序员500佰,技术宅男 目前正在前往独立开发路线,我会在这里分享关于编程技术独立开发技术资讯以及编程感悟等内容。 如果本文能给你提供启发和帮助,还请留下你的一健三连,给我一些鼓励,谢谢。

此篇内容精简 无累赘内容,我不会用过于复杂的语言 让大家看不懂

今天看到程序员xx城东说好的代码或文章是给人看的,因此好文章 一定很普通和干练

MyBatis 无论中厂、小厂我想大家都在用的吧,当然毫无疑问大厂也在使用,很多伙伴每天重复性的写curd,觉得无任何技术痛点,认为大厂的人不会用这么低级的开发程序,真的不必惊讶,大厂无疑都在使用这一套,大家都一样,只用小、老黄牛的区别!

今日我是在医院给大家总结这篇文章,总结一些mybatis避 “坑” 指南,今天就从浅入深,分享 10 个让人眼前一亮的 MyBatis 开发技巧,每一个都配上具体的场景和代码示例,务求通俗易懂,希望对你会有所帮助。

优化代码、加速循环 go go go

开整

1.@Mapper接口简化代码

当你认为一个简易sql不需要写XML时,@Mapper注解就起到效果了,非常方便:

image-20250529232835185.png

2.动态切换表名

场景:相同结构的数据存了多张表,这种业务场景,一般是在多租户、多部门、等业务查询,这个mybatis是支持动态传入表名的,例:

image-20250529234430286.png

3.动态SQL灵活使用

大家在拼接sql,是不是喜欢用拼接字符串的方式进行拼接,栗:

image-20250529222326912.png

这种写法上不存在性能问题,但是存在一定的安全漏洞(如:sql注入问题)

mybatis动态SQL支持ifchooseforeach 来编写动态SQL, 栗: image-20250529222241875.png

4.利用foreach实现批量操作

关于批量in(11,22,33)条件子查询,使用foreach非常实用,例如:(一看都懂哈)

image-20250529223339253.png 传入的 idList 是一个 List 或数组,MyBatis 会自动帮你展开为 IN (1, 2, 3) 这样的格式,完全不用担心语法问题

5.善用resultMap

场景:在遇到java变量命名是小驼峰命名规则,而很多朋哟在数据库表设计时变量命名规范使用如user_name进行命名,这个时候就需要使用resultMap标签进行映射。

image-20250529224918623.png

6.Mybatis-plus分页查询

是不是习惯性的使用limit进行分页查询呢?使用current、size传入页数和每页大小,例如:

getUserListByPage(id,userAccount,userRole,vipRole,current * 10, size,sortField,sortOrder)

mybatis-plus提供一个分页类Page,可轻松完成分页操作,例如:

image-20250529231353405.png

7.二级缓存

缓存、缓存想必一定是从内存中获取数据,可见查询性能一定得到大幅度优化。

为毛能得到性能优化?- 数据查询直接命中缓存。

例:开启二级缓存

image-20250529233841328.png

8.日志分析

优秀的程序员知道,系统从不说谎,借助日志排查sql执行(运行)时的异常,好用的不得了

当然更好用的还有LogInterceptor封装日志组件aop

开启日志:

<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

日志打印:

==> Preparing: SELECT * FROM t_user WHERE user_role= ?
==> Parameters: 1(Integer)
<==   Total: 1

9.自定义 TypeHandler

在数据库表设计字段类型为数值类型,但想返回布尔类型时可使用TypeHandler

注册TypeHandler实现:类型转换

例如:1/0 -> ture/false

@MappedTypes(Boolean.class)
public class BooleanTypeHandler extends BaseTypeHandler<Boolean> {
​
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter ? 1 : 0);
}

10.多数据库支持

当业务系统需要查询多个数据库时,可通过配置多数据源,支持连接多数据库,实现无缝跨库整合业务

@Configuration
@MapperScan(basePackages = "com.wubai.mapper", sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSourceConfig1 {
    @Bean(name = "dataSource1")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
​
    @Bean(name = "sqlSessionFactory1")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
​
    @Bean(name = "sqlSessionTemplate1")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

MyBatis 的魅力在于简单、高效,但很多时候我们用得太guo“基础”,没有发挥它的全部潜力。这些技巧,不是 checklist,也不是排行榜, 可让你的代码看起来更“惊艳”。

优秀从来不是一蹴而就,而是一次又一次的主动选择

愿你在这条路上,越走越轻松,也越走越有信心

我是程序员500佰,我正在前往独立开发路线,我会在这里分享编程技术、编程感悟。

微信图片_20250530004209.png