百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

15 种超赞的 MyBatis 写法

ztj100 2025-02-07 19:55 8 浏览 0 评论

序言

MyBatis的前身是iBatis,最初是Apache的一个开源项目。随着时间的推移,为了更好地适应Java持久层框架的需求,iBatis在2010年重构并更名为MyBatis。

这一转变标志着MyBatis在功能和性能上的显著提升,同时也意味着它能够更好地服务于日益复杂的企业级应用。

今天,我们就来探讨 15 种超赞的 MyBatis 写法,让你的数据库操作更加高效和灵活。

1. 批量操作优化

批量操作是提高数据库操作效率的重要手段。MyBatis提供了标签,可以有效地进行批量插入、更新或删除操作,从而减少与数据库的交互次数。

批量插入示例:


????INSERT?INTO?user?(username,?email,?create_time)?VALUES
????
????????(#{item.username},?#{item.email},?#{item.createTime})
????

批量更新示例:


????
????????UPDATE?user
????????SET?username?=?#{item.username},?email?=?#{item.email}
????????WHERE?id?=?#{item.id}
????

批量删除示例:


????DELETE?FROM?user?WHERE?id?IN
????
????????#{id}
????

通过使用标签,我们可以将多个操作合并为一条SQL语句,大大减少了数据库交互次数,提高了操作效率。

2. 动态SQL

动态SQL是MyBatis的强大特性之一,允许我们根据不同的条件动态构建SQL语句。标签是实现动态SQL的核心。

动态查询示例:


????SELECT?*?FROM?user
????WHERE?1=1
????
????????AND?username?LIKE?CONCAT('%',?#{username},?'%')
????
????
????????AND?email?=?#{email}
????
????
????????AND?status?=?#{status}
????

在这个例子中,我们根据传入的参数动态添加查询条件。如果某个参数为空,对应的条件就不会被添加到SQL语句中。

3. 多条件分支查询

对于更复杂的查询逻辑,我们可以使用标签来实现多条件分支查询。

多条件分支查询示例:


????SELECT?*?FROM?user
????WHERE?1=1
????
????????
????????????AND?username?LIKE?CONCAT('%',?#{keyword},?'%')
????????
????????
????????????AND?email?LIKE?CONCAT('%',?#{keyword},?'%')
????????
????????
????????????AND?(username?LIKE?CONCAT('%',?#{keyword},?'%')?OR?email?LIKE?CONCAT('%',?#{keyword},?'%'))
????????
????

这个例子展示了如何根据不同的搜索类型选择不同的查询条件,如果没有指定搜索类型,则默认搜索用户名和邮箱。

4. SQL语句优化

使用标签可以帮助我们优化生成的SQL语句,避免出现多余的AND或OR关键字。

SQL语句优化示例:


????SELECT?*?FROM?user
????
????????
????????????AND?username?LIKE?CONCAT('%',?#{username},?'%')
????????
????????
????????????AND?email?=?#{email}
????????
????????
????????????AND?status?=?#{status}
????????
????

在这个例子中,标签会自动去除第一个多余的AND或OR,并在有查询条件时添加WHERE关键字。

5. 自动生成主键

在插入操作中,我们经常需要获取数据库自动生成的主键。MyBatis提供了标签来实现这一功能。

自动生成主键示例:


????
????????SELECT?2531020
????
????INSERT?INTO?user?(username,?email,?create_time)
????VALUES?(#{username},?#{email},?#{createTime})

在这个例子中,插入操作完成后,会自动执行SELECT 2531020获取新插入记录的ID,并将其赋值给传入的User对象的id属性。

6. 注解方式使用MyBatis

除了XML配置,MyBatis还支持使用注解来定义SQL操作,这种方式可以使代码更加简洁。

注解方式示例:

public?interface?UserMapper?{
????@Select("SELECT?*?FROM?user?WHERE?id?=?#{id}")
????User?getUserById(Long?id);

????@Insert("INSERT?INTO?user?(username,?email,?create_time)?VALUES?(#{username},?#{email},?#{createTime})")
????@Options(useGeneratedKeys?=?true,?keyProperty?=?"id")
????int?insertUser(User?user);

????@Update("UPDATE?user?SET?username?=?#{username},?email?=?#{email}?WHERE?id?=?#{id}")
????int?updateUser(User?user);

????@Delete("DELETE?FROM?user?WHERE?id?=?#{id}")
????int?deleteUser(Long?id);
}

这种方式适合简单的CRUD操作,但对于复杂的SQL语句,仍然建议使用XML配置。

7. 高级映射

MyBatis提供了强大的对象关系映射功能,可以处理复杂的表关系。

一对多映射示例:


????
????
????
????????
????????
????????
????



????SELECT?u.id?as?user_id,?u.username,?o.id?as?order_id,?o.order_number,?o.create_time?as?order_create_time
????FROM?user?u
????LEFT?JOIN?orders?o?ON?u.id?=?o.user_id
????WHERE?u.id?=?#{userId}

这个例子展示了如何将用户和订单信息映射到一个复杂的对象结构中。

8. MyBatis-Plus集成

MyBatis-Plus是MyBatis的增强工具,它提供了许多便捷的CRUD操作和强大的条件构造器。

MyBatis-Plus使用示例:

@Service
public?class?UserServiceImpl?extends?ServiceImpl?implements?UserService?{
????public?List?findUsersByCondition(String?username,?String?email)?{
????????return?this.list(new?QueryWrapper()
????????????????.like(StringUtils.isNotBlank(username),?"username",?username)
????????????????.eq(StringUtils.isNotBlank(email),?"email",?email));
????}
}

在这个例子中,我们使用MyBatis-Plus提供的条件构造器来动态构建查询条件,无需编写XML。

9. 代码生成器

MyBatis Generator是一个强大的代码生成工具,可以根据数据库表自动生成MyBatis的Mapper接口、实体类和XML映射文件。

MyBatis Generator配置示例:



????
????????
????????

????????
????????????
????????????
????????

????????
????????????
????????

????????
????????????
????????

????????
????????????
????????
????


使用这个配置文件,我们可以自动生成与user表相关的所有必要代码。

10. 事务管理

在Spring环境中,我们可以使用@Transactional注解来管理事务,确保数据的一致性。

事务管理示例:

@Service
public?class?UserService?{
????@Autowired
????private?UserMapper?userMapper;

????@Transactional
????public?void?createUserWithOrders(User?user,?List?orders)?{
????????userMapper.insert(user);
????????for?(Order?order?:?orders)?{
????????????order.setUserId(user.getId());
????????????orderMapper.insert(order);
????????}
????}
}

在这个例子中,创建用户和订单的操作被包装在一个事务中,如果任何一步失败,整个操作都会回滚。

11. 缓存机制

MyBatis提供了一级缓存和二级缓存,可以有效提高查询性能。

二级缓存配置示例:

这个配置启用了LRU淘汰策略的二级缓存,缓存容量为512个对象,每60秒刷新一次。

12. 插件使用

MyBatis插件可以拦截核心方法的调用,实现如分页、性能分析等功能。

分页插件示例 (使用PageHelper):

@Service
public?class?UserService?{
????@Autowired
????private?UserMapper?userMapper;

????public?PageInfo?getUserList(int?pageNum,?int?pageSize)?{
????????PageHelper.startPage(pageNum,?pageSize);
????????List?users?=?userMapper.selectAll();
????????return?new?PageInfo<>(users);
????}

这个例子展示了如何使用PageHelper插件实现简单的分页功能。

13. 多数据源配置

在某些场景下,我们需要在同一个应用中操作多个数据库。MyBatis支持配置多个数据源来实现这一需求。

多数据源配置示例:

@Configuration
public?class?DataSourceConfig?{
????@Bean
????@ConfigurationProperties("spring.datasource.primary")
????public?DataSource?primaryDataSource()?{
????????return?DataSourceBuilder.create().build();
????}

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

????@Bean
????public?SqlSessionFactory?primarySqlSessionFactory(@Qualifier("primaryDataSource")?DataSource?dataSource)?throws?Exception?{
????????SqlSessionFactoryBean?factoryBean?=?new?SqlSessionFactoryBean();
????????factoryBean.setDataSource(dataSource);
????????return?factoryBean.getObject();
????}

????@Bean
????public?SqlSessionFactory?secondarySqlSessionFactory(@Qualifier("secondaryDataSource")?DataSource?dataSource)?throws?Exception?{
????????SqlSessionFactoryBean?factoryBean?=?new?SqlSessionFactoryBean();
????????factoryBean.setDataSource(dataSource);
????????return?factoryBean.getObject();
????}
}

这个配置类定义了两个数据源和对应的SqlSessionFactory,可以在不同的Mapper中使用不同的数据源。

14. 读写分离

读写分离是提高数据库性能的常用策略。MyBatis可以通过配置多数据源来实现简单的读写分离。

读写分离配置示例:

@Configuration
public?class?DataSourceConfig?{
????@Bean
????@ConfigurationProperties("spring.datasource.master")
????public?DataSource?masterDataSource()?{
????????return?DataSourceBuilder.create().build();
????}

????@Bean
????@ConfigurationProperties("spring.datasource.slave")
????public?DataSource?slaveDataSource()?{
????????return?DataSourceBuilder.create().build();
????}

????@Bean
????public?DataSource?routingDataSource(@Qualifier("masterDataSource")?DataSource?masterDataSource,
????????????????????????????????????????@Qualifier("slaveDataSource")?DataSource?slaveDataSource)?{
????????Map?targetDataSources?=?new?HashMap<>();
????????targetDataSources.put(DataSourceType.MASTER,?masterDataSource);
????????targetDataSources.put(DataSourceType.SLAVE,?slaveDataSource);

????????AbstractRoutingDataSource?routingDataSource?=?new?AbstractRoutingDataSource()?{
????????????@Override
????????????protected?Object?determineCurrentLookupKey()?{
????????????????return?DataSourceContextHolder.getDataSourceType();
????????????}
????????};
????????routingDataSource.setTargetDataSources(targetDataSources);
????????routingDataSource.setDefaultTargetDataSource(masterDataSource);

????????return?routingDataSource;
????}
}


这个例子定义了一个动态数据源,可以根据上下文选择主库或从库。你需要实现一个DataSourceContextHolder来管理当前线程的数据源类型。

15. SQL分析和优化

MyBatis提供了SQL执行分析功能,可以帮助我们找出性能瓶颈。

SQL分析配置示例:


????
????????
????????
????????
????????
????
????
????????
????????????sqlCollector=com.example.SqlCollector
????????
????

在这个配置中,我们不仅加入了分页插件,还加入了一个自定义的SQL收集器,可以用于分析SQL执行情况。

总结

我们详细介绍了15种MyBatis的高级用法和技巧,涵盖了从基本的CRUD操作优化到复杂的多数据源配置和读写分离等高级主题。这些技巧可以帮助开发者更高效地使用MyBatis,构建出性能更好、可维护性更强的应用系统。

学习交流

最后,把我的座右铭送给你:投资自己才是最大的财富。 如果你觉得本文章对你有帮助,点赞,收藏不迷路

公众号:我不是架构师,持续为你输出更多的硬核文章和面试经验。

相关推荐

利用navicat将postgresql转为mysql

导航"拿来主义"吃得亏自己动手,丰衣足食...

Navicat的详细教程「偷偷收藏」(navicatlite)

Navicat是一套快速、可靠并价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux。可以用来对本机或远程的MySQL、SQLServer、SQLite、...

Linux系统安装SQL Server数据库(linux安装数据库命令)

一、官方说明...

Navicat推出免费数据库管理软件Premium Lite

IT之家6月26日消息,Navicat推出一款免费的数据库管理开发工具——NavicatPremiumLite,针对入门级用户,支持基础的数据库管理和协同合作功能。▲Navicat...

Docker安装部署Oracle/Sql Server

一、Docker安装Oracle12cOracle简介...

Docker安装MS SQL Server并使用Navicat远程连接

...

Web性能的计算方式与优化方案(二)

通过前面《...

网络入侵检测系统之Suricata(十四)——匹配流程

其实规则的匹配流程和加载流程是强相关的,你如何组织规则那么就会采用该种数据结构去匹配,例如你用radixtree组织海量ip规则,那么匹配的时候也是采用bittest确定前缀节点,然后逐一左右子树...

使用deepseek写一个图片转换代码(deepnode处理图片)

写一个photoshop代码,要求:可以将文件夹里面的图片都处理成CMYK模式。软件版本:photoshop2022,然后生成的代码如下://Photoshop2022CMYK批量转换专业版脚...

AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)

以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:一、将单线偏移为双线;;;;;;;;;;;;;;;;;;;;;;单线变双线...

Core Audio音频基础概述(core 音乐)

1、CoreAudioCoreAudio提供了数字音频服务为iOS与OSX,它提供了一系列框架去处理音频....

BlazorUI 组件库——反馈与弹层 (1)

组件是前端的基础。组件库也是前端框架的核心中的重点。组件库中有一个重要的板块:反馈与弹层!反馈与弹层在组件形态上,与Button、Input类等嵌入界面的组件有所不同,通常以层的形式出现。本篇文章...

怎样创建一个Xcode插件(xcode如何新建一个main.c)

译者:@yohunl译者注:原文使用的是xcode6.3.2,我翻译的时候,使用的是xcode7.2.1,经过验证,本部分中说的依然是有效的.在文中你可以学习到一系列的技能,非常值得一看.这些技能不单...

让SSL/TLS协议流行起来:深度解读SSL/TLS实现1

一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...

社交软件开发6-客户端开发-ios端开发验证登陆部分

欢迎订阅我的头条号:一点热上一节说到,Android客户端的开发,主要是编写了,如何使用Androidstudio如何创建一个Android项目,已经使用gradle来加载第三方库,并且使用了异步...

取消回复欢迎 发表评论: