序言
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}
????
通过使用
2. 动态SQL
动态SQL是MyBatis的强大特性之一,允许我们根据不同的条件动态构建SQL语句。
动态查询示例:
在这个例子中,我们根据传入的参数动态添加查询条件。如果某个参数为空,对应的条件就不会被添加到SQL语句中。
3. 多条件分支查询
对于更复杂的查询逻辑,我们可以使用
多条件分支查询示例:
这个例子展示了如何根据不同的搜索类型选择不同的查询条件,如果没有指定搜索类型,则默认搜索用户名和邮箱。
4. SQL语句优化
使用
SQL语句优化示例:
在这个例子中,
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提供了强大的对象关系映射功能,可以处理复杂的表关系。
一对多映射示例:
????
????
????
????????
????????
????????
????
这个例子展示了如何将用户和订单信息映射到一个复杂的对象结构中。
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
这个例子定义了一个动态数据源,可以根据上下文选择主库或从库。你需要实现一个DataSourceContextHolder来管理当前线程的数据源类型。
15. SQL分析和优化
MyBatis提供了SQL执行分析功能,可以帮助我们找出性能瓶颈。
SQL分析配置示例:
????
????????
????????
????????
????????
????
????
????????
????????????sqlCollector=com.example.SqlCollector
????????
????
在这个配置中,我们不仅加入了分页插件,还加入了一个自定义的SQL收集器,可以用于分析SQL执行情况。
总结
我们详细介绍了15种MyBatis的高级用法和技巧,涵盖了从基本的CRUD操作优化到复杂的多数据源配置和读写分离等高级主题。这些技巧可以帮助开发者更高效地使用MyBatis,构建出性能更好、可维护性更强的应用系统。
学习交流
最后,把我的座右铭送给你:投资自己才是最大的财富。 如果你觉得本文章对你有帮助,点赞,收藏不迷路
公众号:我不是架构师,持续为你输出更多的硬核文章和面试经验。