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

15 种超赞的 MyBatis 写法

ztj100 2025-02-07 19:55 17 浏览 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,构建出性能更好、可维护性更强的应用系统。

学习交流

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

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

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: