mybatis多資料庫
Ⅰ Mybatis是什麼以及Mybatis和JDBC的關系
Mybatis是什麼
mybatis是一個持久層ORM框架。它內部封裝了jdbc,使得開發更簡潔,更高效。
MyBatis可以通過xml或註解完成ORM映射關系配置。
Mybatis和JDBC的關系
JDBC是java提供的一個操作資料庫的API; MyBatis是一個持久層ORM框架,底層是對JDBC的封裝。
MyBatis對JDBC操作資料庫做了一系列的優化:
(1) mybatis使用已有的連接池管理,避免浪費資源,提高程序可靠性。
(2) mybatis提供插件自動生成DAO層代碼,提高編碼效率和准確性。
(3)mybatis 提供了一級和二級緩存,提高了程序性能。
(4) mybatis使用動態sql語句,提高了SQL維護。(此優勢是基於XML配置)
(5) mybatis對資料庫操作結果進行自動映射
MyBatis的優點和缺點
優點:
簡單:易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
實用:提供了數據映射功能,提供了對底層數據訪問的封裝(例如ado.net),提供了DAO框架,可以使我們更容易的開發和配置我們的DAL層。
靈活:通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
功能完整:提供了連接管理,緩存支持,線程支持,(分布式)事物管理,通過配置作關系對象映射等數據訪問層需要解決的問題。提供了DAO支持,並在DAO框架中封裝了ADO.NET,NHibernate和DataMapper。
增強系統的可維護性:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
缺點:
sql工作量很大,尤其是欄位多、關聯表多時,更是如此。
sql依賴於資料庫,導致資料庫移植性差。
由於xml里標簽id必須唯一,導致DAO中方法不支持方法重載。
欄位映射標簽和對象關系映射標簽僅僅是對映射關系的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標簽,如果sql里沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關系的,即Collection的對象為null)。
DAO層過於簡單,對象組裝的工作量較大。
不支持級聯更新、級聯刪除。
編寫動態sql時,不方便調試,尤其邏輯復雜時。
提供的寫動態sql的xml標簽功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。使用不當,容易導致N+1的sql性能問題。
Ⅱ SpringBoot+Mybatis 通過databaseIdProvider支持多資料庫
本人最近接到一個任務,將一個系統改成同時兼容Oracle和PostgreSQL(原來是僅支持Oracle)。雖然大部分的sql語句通用,但是還有許多語法存在差異,所以我們可以通過mybatis自身提供的databaseIdProvider解決這個問題,這里記錄一下過程。
通過配置文件開啟mysql支持或者postgresql支持
Ⅲ spring+mybatis 多資料庫事務管理:一個方法裡面能同時對兩個資料庫的數據進行操作
定義兩個DAO分別使用不同的數據源,ADAO連接A資料庫,BDAO連接B資料庫
定義一個Service類,加上Spring註解@Transactional,表示進行事務管理。
將ADAO和BDAO注入到Service類裡面。
在service類裡面創建一個方法,方法里調用ADAO的方法插入數據到A資料庫的user表,然後調用BDAO的方法插入數據到B資料庫的user表
Ⅳ Spring Boot(十二):MyBatis-Plus的多數據源和分頁
同一個項目有時會涉及到多個資料庫,這時我們就要配置多個數據源。配置多數據源的常見情況有以下兩種:
1)同一個項目中涉及兩個或多個業務資料庫,它們之間相互獨立,這種情況也可以作為兩個或多個項目來開發
2)兩個或多個資料庫之間是主從關系,主庫負責寫,從庫負責讀
1、pom.xml配置
在pom.xml中增加MyBatis-Plus多數據源依賴:
2、配置文件配置
在配置文件application.yml中配置我們需要連接的資料庫:blog和user,默認為blog
3、啟動類配置
在@SpringBootApplication註解上增加exclude = DruidDataSourceAutoConfigure.class配置:
這個配置的作用是去掉對DruidDataSourceAutoConfigure的自動配置,否則程序會報錯:
原因:
DruidDataSourceAutoConfigure在之前,其會注入一個DataSourceWrapper,會在原生的spring.datasource下找url, username, password等,而我們動態數據源的配置路徑是變化的。
4、實體類和層配置
在po文件夾下創建blog和user文件夾,分別用於存儲blog資料庫和user資料庫的實體:
註解:
@TableName: 表名註解,標識實體類對應的表
@TableId: 主鍵註解,當type = IdType.AUTO時,表示這個主鍵是自增主鍵
在文件夾下創建blog和user文件夾,分別用於存儲blog和user的:
註解:
@Repository: 將數據訪問層(DAO層)的類標識為Spring Bean
@DS: 配置非默認數據源,本示例中blog為默認數據源,user為非默認數據源,在使用@DS註解時,有如下注意事項:
1)不能使用事務,否則數據源不會切換,使用的還是第一次載入的數據源
2)第一次載入數據源之後,第二次,第三次……操作其他數據源,如果數據源不存在,使用的還是第一次載入的數據源
3)數據源名稱不要包含下劃線,否則不能切換
5、測試驗證
編寫ArticleController和UserInfoController:
注 : 業務邏輯復雜時,Controller和Mapper中間會有Service層來處理業務邏輯,現在我們就簡單的測試一下多數據源,所以直接使用Controller調用Mapper了
1、配置分頁插件
2、分頁方法
1)使用MyBatis-Plus的selectPage方法
使用MyBatis-Plus的selectPage方法,返回了IPage,示例:
2)sql分頁
有時候有些分頁需要關聯多張表,使用LambdaQueryWrapper不太方便,這時候可以自己寫sql來實現分頁,主要有兩種:純sql自己實現分頁和使用IPage實現分頁
注 : 這里的sql示例就使用單表查詢了,具體的可根據業務場景使用多表查詢
A、純sql自己實現分頁
分頁的數據list和總條數單獨調用方法返回 :
B、使用IPage實現分頁(常用)
返回IPage,返回值的數據結構見「 1)使用MyBatis-Plus的selectPage方法 」
本文簡單介紹了一下MyBatis-Plus的多數據源和分頁,本文示例代碼, 詳見https://gitee.com/tunan222/spring-boot-demo
若您覺得還可以,請幫忙點個 「贊」 ,謝謝
Ⅳ spring+mybatis怎麼配置一個數據源,多個資料庫
pring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:init-config.properties</value>
</property>
</bean>
<!-- enable component scanning (beware that this does not enable mapper scanning!) -->
<context:component-scan base-package="org.zhuc.mybatis" />
<!-- enable autowire -->
<context:annotation-config />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="url" value="${dataSource.url}" />
<property name="username" value="${dataSource.username}" />
<property name="password" value="${dataSource.password}" />
<property name="connectionProperties" value="${dataSource.driver}"></property>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="60000" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name=""
value="20" />
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="stat" />
</bean>
<!-- define the SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="org.zhuc.mybatis.domain" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="org.zhuc.mybatis.mapper" />
</bean>
<!-- transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
<qualifier value="isap" />
</bean>
<!-- 全註解方式 需加上@Transactional -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 事務控制的業務方法配 -->
<!--
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="page*" read-only="true" />
<tx:method name="list*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
-->
<!-- 事務控制攔截 -->
<!--
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* org.zhuc..*.service..*Service.*(..))"
advice-ref="txAdvice" />
</aop:config>
-->
<!-- =================================================================== -->
<!-- 數據源2 -->
<bean id="dataSource2" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 基本屬性 url、user、password -->
<property name="url" value="${dataSource2.url}" />
<property name="username" value="${dataSource2.username}" />
<property name="password" value="${dataSource2.password}" />
<property name="connectionProperties" value="${dataSource2.driver}"></property>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<property name="maxActive" value="20" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="60000" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name=""
value="20" />
<!-- 配置監控統計攔截的filters -->
<property name="filters" value="stat" />
</bean>
<bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource2" />
<property name="typeAliasesPackage" value="org.zhuc.mybatis.domain2" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory2"/>
<property name="basePackage" value="org.zhuc.mybatis.mapper2" />
</bean>
<bean id="transactionManager2"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource2" />
<qualifier value="insurance" />
</bean>
<!-- 全註解方式 -->
<tx:annotation-driven transaction-manager="transactionManager2" />
</beans>
Ⅵ mybatis怎麼配置兩個資料庫
這是我之前寫的一個在xml文件中配置oracle數據源的部分代碼,由於我是用了分散配置,所以vaule=的值是在另外一個文件中,lz可以直接將相關信息硬編碼進去
Ⅶ spring+mybatis怎麼配置一個數據源,多個資料庫
<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertyname="locations"value="classpath:config/jdbc.properties"/>
</bean>
<beanid="dataSource"destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="${jdbc.driverClassName}"/>
<propertyname="url"value="${jdbc.url}"/>
<propertyname="username"value="${jdbc.username}"/>
<propertyname="password"value="${jdbc.password}"/>
</bean>
在applicationContext.xml中寫入以上的配置代碼
新建一個jdbc.properties存放數據源具體信息
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/workloads?useUnicode=true&characterEncoding=utf-8//characterEncoding=utf-8將數據編碼轉換為utf-8
jdbc.username=root//數據登錄名
jdbc.password=123//登錄密碼
在mybatis-config.xml配置需要的數據表
<mappers>
<mapperresource="com/tly/mapping/UserMapper.xml"/>
</mappers>
Ⅷ MyBatis-Plus 多數據源配置
一,引言
在我們實際業務開發中,有時需要同時涉及多個資料庫, 可能一個 API 中所需要的數據,往往是包含了多個資料庫中的數據,這個時候我們就需要在項目運行中,切換數據源。
二,具體實現
步驟一:我們先需要引入maven配置,版本可自選。dynamic-datasource-spring-boot-starter 是一個基於springboot的快速集成多數據源的啟動器。
步驟二:多數據源配置,需要注意的後面都有寫注釋。
步驟三:步驟三就可以直接使用啦,真的是太方便了, @DS 可以註解在方法上或類上, 同時存在就近原則 方法上註解 優先於 類上註解 。
官方建議:
1,本框架只做 切換數據源 這件核心的事情,並不限制你的具體操作,切換了數據源可以做任何CRUD。
2,配置文件所有以下劃線 _ 分割的數據源 首部 即為組的名稱,相同組名稱的數據源會放在一個組下。
3,切換數據源可以是組名,也可以是具體數據源名稱。組名則切換時採用負載均衡演算法切換。
4,默認的數據源名稱為 master ,你可以通過 spring.datasource.dynamic.primary 修改。
方法上的註解優先於類上註解。
5,強烈建議只在service的類和方法上添加註解,不建議在mapper上添加註解。
Ⅸ mybatis怎麼實現兩種資料庫的兼容
方法:在系統運行過程中,針對不同資料庫類型區分載入不同文件路徑下的sqlmap配置。留給開發人員做的事依舊是快樂地編寫原始資料庫語句,而不再為多資料庫兼容問題撓頭。
分析問題:
1、解決ibatis多資料庫兼容的問題,實際上就是讓ibatis可以自動選擇不同資料庫sqlmap配置文件。
2、打開ibatis源碼工程並進行代碼跟蹤,最終定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java處,系統中運行的sqlmap節點均從這里統一轉化載入的。
3、很明顯SqlMapConfigParser源碼中的addSqlMapNodelets負責解析「/sqlMapConfig/sqlMap」路徑,即也就是sqlmap文件路徑。
4、要實現「多資料庫兼容」,這里改造下這個方法即可。
解決方法:
1、首選我們在<setting>節點新增一個「DBProctName」用於判斷資料庫種類。當然通過java.sql.DatabaseMetaData也可以獲得,但這太依賴於jdbc驅動,還是手動配置保險。
2、重構SqlMapConfigParser的addSqlMapNodelets方法。
" 1)首選獲得單個sqlmap文件的位置,如 sqlmap主目錄\XXX.xml;
2)依據上面設置的DBProctName屬性值獲得資料庫類型;
3)將sqlmap的文件路徑重定位到運行資料庫類型文件下。如 sqlmap主目錄\mysql\XXX.xml,代表程序當前運行於msql資料庫上,並載入系統mysql資料庫對應的 sqlmap文件"
4、ok,現在ibatis支持「多資料庫兼容」了(完整源碼見附件)。
使用方法:
1、編譯SqlMapConfigParser.java生成可運行文件SqlMapConfigParser.class(見附件),並將其覆蓋添加到ibatis.jar中。
2、在系統sqlmap配置文件存放主目錄如src\conf\mapping添加多資料庫兼容支持的子目錄,如src\conf\mapping\mysql,src\conf\mapping\oracle等
3、以實際項目需要編寫多資料庫sqlmap配置文件。注意:不同資料庫類型需要確保具有相同的sqlmap配置文件名和sql節點名
4、在ibatis主配置文件(如sql-map-config.xml)中,<setting>指定當前程序運行資料庫類型
Ⅹ springboot、mybatis-plus、Druid多數據源環境搭建
Java單體項目里,我們一般是只需配置一個資料庫,這時代碼里的層都是只對一個資料庫操作;但有時候我們的數據可能在2個或者3個資料庫,這時就需要配置更多數據源,進行資料庫直連操作,下面以MySQL的兩個庫為例(Oracle也就換個驅動類與連接串)。
(本文閱讀大概花費兩分鍾)
技術條件:
springboot 2.5.3 (即springframework 5.3.9)
MySQL 5.7
mybatis-plus 3.5.0
dynamic-datasource 3.5.0
druid 1.2.9
idea開發工具、maven 3.3.9
1、導入相關依賴
2、建立兩個資料庫mydb(表 user)、db2(表t_class),並分別建一張表
3、編寫application.yaml配置文件
4、編寫po類、層、一個介面測試類
其中,在的類加上對應的數據源標識符,使用此註解com.baomidou.dynamic.datasource.annotation.DS
5、啟動項目,查看結果
至此,多數據源環境集成成功;當然這里只使用了查詢功能,對應事務相關的下一回合文章再做討論啥。