日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot2 配置多数据源,整合MybatisPlus增强插件

發布時間:2025/3/16 javascript 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot2 配置多数据源,整合MybatisPlus增强插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、項目案例簡介

1、多數據簡介

實際的項目中,經常會用到不同的數據庫以滿足項目的實際需求。隨著業務的并發量的不斷增加,一個項目使用多個數據庫:主從復制、讀寫分離、分布式數據庫等方式,越來越常見。

2、MybatisPlus簡介

MyBatis-Plus(簡稱 MP)是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,為簡化開發、提高效率而生。

插件特點

無代碼侵入:只做增強不做改變,引入它不會對現有工程產生影響。 強大的 CRUD 操作:通過少量配置即可實現單表大部分 CRUD 操作滿足各類使用需求。 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件。 支持主鍵自動生成:可自由配置,解決主鍵問題。 內置代碼生成器:采用代碼或者 Maven 插件可快速生成各層代碼。 內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作。 內置性能分析插件:可輸出 Sql 語句以及其執行時間。

二、多數據源案例

1、項目結構

注意:mapper層和mapper.xml層分別放在不同目錄下,以便mybatis掃描加載。

2、多數據源配置

spring:# 數據源配置datasource:type: com.alibaba.druid.pool.DruidDataSourceadmin-data:driverClassName: com.mysql.jdbc.DriverdbUrl: jdbc:mysql://127.0.0.1:3306/cloud-admin-data?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: 123initialSize: 20maxActive: 100minIdle: 20maxWait: 60000poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 30timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 30000maxEvictableIdleTimeMillis: 60000validationQuery: SELECT 1 FROM DUALtestOnBorrow: falsetestOnReturn: falsetestWhileIdle: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000filters: stat,walluser-data:driverClassName: com.mysql.jdbc.DriverdbUrl: jdbc:mysql://127.0.0.1:3306/cloud-user-data?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=falseusername: rootpassword: 123initialSize: 20maxActive: 100minIdle: 20maxWait: 60000poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 30timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 30000maxEvictableIdleTimeMillis: 60000validationQuery: SELECT 1 FROM DUALtestOnBorrow: falsetestOnReturn: falsetestWhileIdle: trueconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000filters: stat,wall

這里參數的形式是多樣的,只需要配置參數掃描即可。

3、參數掃描類

@Component @ConfigurationProperties(prefix = "spring.datasource.admin-data") public class DruidOneParam {private String dbUrl;private String username;private String password;private String driverClassName;private int initialSize;private int maxActive;private int minIdle;private int maxWait;private boolean poolPreparedStatements;private int maxPoolPreparedStatementPerConnectionSize;private int timeBetweenEvictionRunsMillis;private int minEvictableIdleTimeMillis;private int maxEvictableIdleTimeMillis;private String validationQuery;private boolean testWhileIdle;private boolean testOnBorrow;private boolean testOnReturn;private String filters;private String connectionProperties;// 省略 GET 和 SET }

4、配置Druid連接池

@Configuration @MapperScan(basePackages = {"com.data.source.mapper.one"},sqlSessionTemplateRef = "sqlSessionTemplateOne") public class DruidOneConfig {private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ;@Resourceprivate DruidOneParam druidOneParam ;@Bean("dataSourceOne")public DataSource dataSourceOne () {DruidDataSource datasource = new DruidDataSource();datasource.setUrl(druidOneParam.getDbUrl());datasource.setUsername(druidOneParam.getUsername());datasource.setPassword(druidOneParam.getPassword());datasource.setDriverClassName(druidOneParam.getDriverClassName());datasource.setInitialSize(druidOneParam.getInitialSize());datasource.setMinIdle(druidOneParam.getMinIdle());datasource.setMaxActive(druidOneParam.getMaxActive());datasource.setMaxWait(druidOneParam.getMaxWait());datasource.setTimeBetweenEvictionRunsMillis(druidOneParam.getTimeBetweenEvictionRunsMillis());datasource.setMinEvictableIdleTimeMillis(druidOneParam.getMinEvictableIdleTimeMillis());datasource.setMaxEvictableIdleTimeMillis(druidOneParam.getMaxEvictableIdleTimeMillis());datasource.setValidationQuery(druidOneParam.getValidationQuery());datasource.setTestWhileIdle(druidOneParam.isTestWhileIdle());datasource.setTestOnBorrow(druidOneParam.isTestOnBorrow());datasource.setTestOnReturn(druidOneParam.isTestOnReturn());datasource.setPoolPreparedStatements(druidOneParam.isPoolPreparedStatements());datasource.setMaxPoolPreparedStatementPerConnectionSize(druidOneParam.getMaxPoolPreparedStatementPerConnectionSize());try {datasource.setFilters(druidOneParam.getFilters());} catch (Exception e) {LOGGER.error("druid configuration initialization filter", e);}datasource.setConnectionProperties(druidOneParam.getConnectionProperties());return datasource;}@Beanpublic SqlSessionFactory sqlSessionFactoryOne() throws Exception{SqlSessionFactoryBean factory = new SqlSessionFactoryBean();ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();factory.setDataSource(dataSourceOne());factory.setMapperLocations(resolver.getResources("classpath*:/dataOneMapper/*.xml"));return factory.getObject();}@Bean(name="transactionManagerOne")public DataSourceTransactionManager transactionManagerOne(){return new DataSourceTransactionManager(dataSourceOne());}@Bean(name = "sqlSessionTemplateOne")public SqlSessionTemplate sqlSessionTemplateOne() throws Exception {return new SqlSessionTemplate(sqlSessionFactoryOne());} }

注意事項

  • MapperScan 在指定數據源上配置;
  • SqlSessionFactory 配置掃描的Mapper.xml地址 ;
  • DataSourceTransactionManager 配置該數據源的事務;
  • 兩個數據源的配置手法相同,不贅述 ;

5、操作案例

  • 數據源一:簡單查詢
@Service public class AdminUserServiceImpl implements AdminUserService {@Resourceprivate AdminUserMapper adminUserMapper ;@Overridepublic AdminUser selectByPrimaryKey (Integer id) {return adminUserMapper.selectByPrimaryKey(id) ;} }
  • 數據源二:事務操作
@Service public class UserBaseServiceImpl implements UserBaseService {@Resourceprivate UserBaseMapper userBaseMapper ;@Overridepublic UserBase selectByPrimaryKey(Integer id) {return userBaseMapper.selectByPrimaryKey(id);}// 使用指定數據源的事務@Transactional(value = "transactionManagerTwo")@Overridepublic void insert(UserBase record) {// 這里數據寫入失敗userBaseMapper.insert(record) ;// int i = 1/0 ;} }

注意:這里的需要指定該數據源配置的事務管理器。

三、MybatisPlus案例

1、核心依賴

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.7.1</version><exclusions><exclusion><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId></exclusion></exclusions> </dependency> <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.0.7.1</version> </dependency>

2、配置文件

mybatis-plus:mapper-locations: classpath*:/mapper/*.xmltypeAliasesPackage: com.digital.market.*.entityglobal-config:db-config:id-type: AUTOfield-strategy: NOT_NULLlogic-delete-value: -1logic-not-delete-value: 0banner: falseconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: truecache-enabled: falsecall-setters-on-nulls: truejdbc-type-for-null: 'null'

3、分層配置

mapper層 UserBaseMapper extends BaseMapper<UserBase> 實現層 UserBaseServiceImpl extends ServiceImpl<UserBaseMapper,UserBase> implements UserBaseService 接口層 UserBaseService extends IService<UserBase>

4、mapper.xml文件

<mapper namespace="com.plus.batis.mapper.UserBaseMapper" ><resultMap id="BaseResultMap" type="com.plus.batis.entity.UserBase" ><id column="id" property="id" jdbcType="INTEGER" /><result column="user_name" property="userName" jdbcType="VARCHAR" /><result column="pass_word" property="passWord" jdbcType="VARCHAR" /><result column="phone" property="phone" jdbcType="VARCHAR" /><result column="email" property="email" jdbcType="VARCHAR" /><result column="create_time" property="createTime" jdbcType="TIMESTAMP" /><result column="update_time" property="updateTime" jdbcType="TIMESTAMP" /><result column="state" property="state" jdbcType="INTEGER" /></resultMap><sql id="Base_Column_List" >id, user_name, pass_word, phone, email, create_time, update_time, state</sql><select id="selectByParam" parameterType="com.plus.batis.entity.QueryParam" resultMap="BaseResultMap">select * from hc_user_base</select> </mapper>

注意事項

BaseMapper中的方法都已默認實現;這里也可以自定義實現一些自己的方法。

5、演示接口

@RestController @RequestMapping("/user") public class UserBaseController {private static final Logger LOGGER = LoggerFactory.getLogger(UserBaseController.class) ;@Resourceprivate UserBaseService userBaseService ;@RequestMapping("/info")public UserBase getUserBase (){return userBaseService.getById(1) ;}@RequestMapping("/queryInfo")public String queryInfo (){UserBase userBase1 = userBaseService.getOne(new QueryWrapper<UserBase>().orderByDesc("create_time")) ;LOGGER.info("倒敘取值:{}",userBase1.getUserName());Integer count = userBaseService.count() ;LOGGER.info("查詢總數:{}",count);UserBase userBase2 = new UserBase() ;userBase2.setId(1);userBase2.setUserName("spring");boolean resFlag = userBaseService.saveOrUpdate(userBase2) ;LOGGER.info("保存更新:{}",resFlag);Map<String, Object> listByMap = new HashMap<>() ;listByMap.put("state","0") ;Collection<UserBase> listMap = userBaseService.listByMap(listByMap) ;LOGGER.info("ListByMap查詢:{}",listMap);boolean removeFlag = userBaseService.removeById(3) ;LOGGER.info("刪除數據:{}",removeFlag);return "success" ;}@RequestMapping("/queryPage")public IPage<UserBase> queryPage (){QueryParam param = new QueryParam() ;param.setPage(1);param.setPageSize(10);param.setUserName("cicada");param.setState(0);return userBaseService.queryPage(param) ;}@RequestMapping("/pageHelper")public PageInfo<UserBase> pageHelper (){return userBaseService.pageHelper(new QueryParam()) ;} }

這里pageHelper方法是使用PageHelper插件自定義的方法。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/middle-ware-parent GitEE·地址 https://gitee.com/cicadasmile/middle-ware-parent

總結

以上是生活随笔為你收集整理的SpringBoot2 配置多数据源,整合MybatisPlus增强插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。