您好,登錄后才能下訂單哦!
本篇內容介紹了“SpringBoot整合MybatisPlus配置多數據源增強插件的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
實際的項目中,經常會用到不同的數據庫以滿足項目的實際需求。隨著業務的并發量的不斷增加,一個項目使用多個數據庫:主從復制、讀寫分離、分布式數據庫等方式,越來越常見。
MyBatis-Plus(簡稱 MP)是一個MyBatis的增強工具,在MyBatis的基礎上只做增強不做改變,為簡化開發、提高效率而生。
插件特點
無代碼侵入:只做增強不做改變,引入它不會對現有工程產生影響。 強大的 CRUD 操作:通過少量配置即可實現單表大部分 CRUD 操作滿足各類使用需求。 支持 Lambda 形式調用:通過 Lambda 表達式,方便的編寫各類查詢條件。 支持主鍵自動生成:可自由配置,解決主鍵問題。 內置代碼生成工具:采用代碼或者 Maven 插件可快速生成各層代碼。 內置分頁插件:基于 MyBatis 物理分頁,開發者無需關心具體操作。 內置性能分析插件:可輸出 Sql 語句以及其執行時間。
注意:mapper層和mapper.xml層分別放在不同目錄下,以便mybatis掃描加載。
spring: # 數據源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource admin-data: driverClassName: com.mysql.jdbc.Driver dbUrl: jdbc:mysql://127.0.0.1:3306/cloud-admin-data?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: 123 initialSize: 20 maxActive: 100 minIdle: 20 maxWait: 60000 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 30 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 30000 maxEvictableIdleTimeMillis: 60000 validationQuery: SELECT 1 FROM DUAL testOnBorrow: false testOnReturn: false testWhileIdle: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 filters: stat,wall user-data: driverClassName: com.mysql.jdbc.Driver dbUrl: jdbc:mysql://127.0.0.1:3306/cloud-user-data?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: 123 initialSize: 20 maxActive: 100 minIdle: 20 maxWait: 60000 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 30 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 30000 maxEvictableIdleTimeMillis: 60000 validationQuery: SELECT 1 FROM DUAL testOnBorrow: false testOnReturn: false testWhileIdle: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 filters: stat,wall
這里參數的形式是多樣的,只需要配置參數掃描即可。
@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 }
@Configuration @MapperScan(basePackages = {"com.data.source.mapper.one"},sqlSessionTemplateRef = "sqlSessionTemplateOne") public class DruidOneConfig { private static final Logger LOGGER = LoggerFactory.getLogger(DruidOneConfig.class) ; @Resource private 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; } @Bean public 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 配置該數據源的事務;
兩個數據源的配置手法相同,不贅述 ;
數據源一:簡單查詢
@Service public class AdminUserServiceImpl implements AdminUserService { @Resource private AdminUserMapper adminUserMapper ; @Override public AdminUser selectByPrimaryKey (Integer id) { return adminUserMapper.selectByPrimaryKey(id) ; } }
數據源二:事務操作
@Service public class UserBaseServiceImpl implements UserBaseService { @Resource private UserBaseMapper userBaseMapper ; @Override public UserBase selectByPrimaryKey(Integer id) { return userBaseMapper.selectByPrimaryKey(id); } // 使用指定數據源的事務 @Transactional(value = "transactionManagerTwo") @Override public void insert(UserBase record) { // 這里數據寫入失敗 userBaseMapper.insert(record) ; // int i = 1/0 ; } }
注意:這里的需要指定該數據源配置的事務管理器。
<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>
mybatis-plus: mapper-locations: classpath*:/mapper/*.xml typeAliasesPackage: com.digital.market.*.entity global-config: db-config: id-type: AUTO field-strategy: NOT_NULL logic-delete-value: -1 logic-not-delete-value: 0 banner: false configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true cache-enabled: false call-setters-on-nulls: true jdbc-type-for-null: 'null'
mapper層 UserBaseMapper extends BaseMapper<UserBase> 實現層 UserBaseServiceImpl extends ServiceImpl<UserBaseMapper,UserBase> implements UserBaseService 接口層 UserBaseService extends IService<UserBase>
<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中的方法都已默認實現;這里也可以自定義實現一些自己的方法。
@RestController @RequestMapping("/user") public class UserBaseController { private static final Logger LOGGER = LoggerFactory.getLogger(UserBaseController.class) ; @Resource private 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插件自定義的方法。
“SpringBoot整合MybatisPlus配置多數據源增強插件的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。