一.概念
Db 静态注入通常是指在应用中通过静态方式注入数据库连接或操作对象。最常用的地方在于不需要创建对象实例即可访问数据库操作。避免循环依赖。(注意:Db 静态处理器在MyBatis-Plus 3.0.0版本才引入)
二.循环依赖
循环依赖(Cyclic Dependency)是指在程序或系统中,两个或多个模块、类或组件相互依赖,形成一个闭环。这样会导致在加载、编译或运行时出现问题,因为一个模块在使用另一个模块的功能时,可能需要另一个模块的存在。
如上图所示,AddressServiceImpl在创建时需要先实例化UserServiceImpl,在实例化UserServiceImpl时,又要去实例化AddressServiceImpl,这就形成了一个闭环,导致循环依赖。这会在 Spring 的依赖注入过程中导致错误,因为系统无法确定哪个服务应该先被实例化。
三.使用DB静态注入
通过静态字段存储数据库连接或操作对象,实现全局共享。
举个例子,假设我在UserServiceImpl里想查Address表,此时我可以选择不注入它,而是通过以下方法。
Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();
使用baomidou提供的Db.lambdaQuery,传入 Address.class(Address是自定义的实体类)
,查询构建器能够获取到与 Address
相关的元数据,比如字段名、数据类型等。之后再链式地创建查询构造器,这里的 eq(Address::getUserId, userId)
表示查询 Address
表中 userId
字段等于 userId
变量的记录。
四.总结
Db 静态处理器是指通过静态方式管理数据库操作,通常使用静态字段和方法提供数据库查询、插入、更新等功能。
①主要特点
-
全局访问:通过静态方法和字段,允许在应用的任何地方访问数据库操作,简化代码。
-
类型安全:静态注入通常允许以类型安全的方式构建查询,减少运行时错误。
-
简化数据库操作:提供便捷的链式调用方式,易于构建复杂查询。
②优点
- 方便快捷:无须创建实例即可访问数据库操作,适合简单应用。
- 减少对象创建开销:静态字段在类加载时初始化,避免多次创建实例。
③缺点
- 全局状态管理:全局静态对象可能导致状态不一致,难以维护。
- 线程安全问题:多个线程同时访问静态实例时,可能会出现并发问题。
- 测试困难:静态依赖使得单元测试变得复杂,难以模拟或替换。
④使用建议
- 限制使用范围:在小型项目或简单场景中使用,避免在复杂应用中引入全局状态。
- 结合依赖注入:在大型项目中,可以结合依赖注入框架来管理数据库连接,增强灵活性和可测试性。
- 考虑性能优化:引入缓存机制、优化查询结构以提高性能。