mybatis的sql配置文件
『壹』 mybatis基本配置詳解
中間步驟自行設置
Mysql驅動版本根據自己安裝的MySQL選擇
我把AppTest改成了MybatisTest,不該也無妨;
其中Student類暫時只設置四個欄位:
mapper介面暫時為空
在resources目錄下新建File命名為db.peoperties,配置如下內容:
提示:以上配置適用於MySQL8.X版本,5.X版本按照如下配置:
1、transactionManager:事務管理器;
type 事務管理類型:
JDBC(JdbcTransactionFactory);
MANAGED(ManagedTransactionFactory)
自定義事務管理器:實現TransactionFactory介面.type指定為全類名
2、dataSource:數據源;
type :數據源類型;
UNPOOLED(UnpooledDataSourceFactory); POOLED(PooledDataSourceFactory);
JNDI(JndiDataSourceFactory)
自定義數據源:實現DataSourceFactory介面,type是全類名
<mapper>:注冊一個sql映射文件
1、注冊映射文件
resource:引用類路徑下的sql映射文件
mybatis/StudentMapperpper.xml
url:引用網路路徑或者磁碟路徑下的sql映射文件
file:///var/mappers/AuthorMapper.xml
2、注冊介面
class:引用(注冊)介面,
① 有sql映射文件,映射文件名必須和介面同名,並且放在與介面同一目錄下;
② 沒有sql映射文件,所有的sql都是利用註解寫在介面上;
推薦:
比較重要的,復雜的Dao介面我們來寫sql映射文件
不重要,簡單的Dao介面為了開發快速可以使用註解;
批量注冊
需要在資源路徑下(resources)建立和一樣的文件目錄來存放想xml映射文件,如:com.example.StudentMapperpper.xml
StudentMapper
在resources的mybatis目錄下新建文件夾mapper,新建xml文件StudentMapper.xml
namespace :名稱空間;指定為介面的全類名
id :唯一標識
resultType :返回值類型
#{id} :從傳遞過來的參數中取出id值
resources目錄(MajorMapper.xml暫時不用創建)如下:
『貳』 mybatis-plus日誌輸出sql配置(控制台能輸出sql日誌沒有sql問題)
看下spring boot配置文件中的mybatis部分
一般配置debug級別日誌,基本日誌都能輸出了,之前配置,這個是標準的輸出,控制台正常輸出,但是不會寫到日誌文件中,所以一旦上傳測試或生產,自動過濾sql部分日誌
但是我們也希望在測試環境也能看
改成如下配置
另外日誌級別改為debug,可以直接
就整體都是debug了
如果需要局部控制,可以配置多個level
只要是com.xxxx,com.aaa下的日誌輸出均是debug
『叄』 在spring的配置文件 怎麼載入mybatis的sql配置文件
首先事務不是根據是不是返緩service層而關閉的,而是你開啟的session什麼時候用完 在哪個層用完就關閉。而一般情況下都是漏鏈模在事務配置文件里的前綴方法名 如: 這種在service層調用saveXXX方法時喚氏候 這個方法就被事務管理
『肆』 MyBatis Generator 配置文件詳解 之 table 元素
相關鏈接: MyBatis Generator 配置文件詳解
此篇主要說明 MyBatis Generator 配置文件詳解 中的 table 元素,有關 MyBatis Generator 配置文件詳解 的其他內容請移步: MyBatis Generator 配置文件詳解
table 元素用來配置要通過內省的表。只有配置的才會生成實體類和其他文件。有一個必選屬性(tableName)指定要生成的表名,可以使用SQL通配符匹配多個表。例如要生成全部的表,可以按如下配置:
table 元素包含多個可選屬性:
該元素包含多個可用的<property>子元素,可選屬性為:
除了<property>子元素外,<table>還包含以下子元素:
後面的小節對這4個元素進行詳細講解。
這個元素是可選的,最多可以配置一個。
這個元素用來指定自動生成主鍵的屬性(identity欄位或者sequences序列)。如果指定這個元素,MBG在生成insert的SQL映射文件中插入一個<selectKey>元素。 這個元素 非常重要 ,這個元素包含下面兩個必選屬性:
這個元素還包含兩個可選屬性:
該元素是可選的,最多可以配置一個,使用該元素可以在生成列之前,對列進行重命名。這對那些存在同一前綴的欄位想在生成屬性名時去除前綴的表非常有用。 例如假設一個表包含以下的列:
生成的所有屬性名中如果都包含CUST的前綴可能會讓人不爽。這些前綴可以通過如下方式定義重命名規則:
注意,在內部,MBG使用鎮銷java.util.regex.Matcher.replaceAll方法實現這個功能。 請參閱有關該方法的文檔和在Java中使用正則表達式的例子。
當<columnOverride>匹配一列時,這個元素(<columnRenamingRule>)會被忽略。<columnOverride>優先於重命名的規則。
該元素御賀游有一個必選屬性(searchString):定義將被替換的字元串的正則表達式。
該元素有一個可選屬性(replaceString):這是一個用來替換搜索字元串列每一個匹配項的字元串。如果沒有指定,就會使用空字元串。
關於<table>的<property>屬性useActualColumnNames對此的影響可以查看完整文檔。
該元素可選,可以配置多個。該元素將某些屬性默認計算的值更改為指定的值。
該元素有一個必選屬性(column):要重寫的列名。
該元素有多個可選屬性:
配置示例:
該元素可選,可以配置多個。該元素可以用來屏蔽不需要生成的列。
該元素有一個必選屬性(column):要忽略的列名。
該元素還有一個可選屬性(delimitedColumnName):匹配列名的時候是否區分大小寫。如拍遲果為true則區分。默認值為false,不區分大小寫。
『伍』 mybatis原理
MyBatis 的工作原理:讀取 MyBatis 配置文件、載入映射文件、構造會話工廠、創建會話對象、Executor 執行器、輸入參數映射、輸出結果映射。
mybatis原理具體介紹如下:
1、讀取 MyBatis 配置文件:
mybatis-config.xml 為 MyBatis 的全局配置文件,配置了 MyBatis 的運行環境等信息,例如資料庫連接信息。
2、載入映射文件:
映射文件即 SQL 映射文件,該文件中配置了操作資料庫的 SQL 語句,需要在 MyBatis 配置文件 mybatis-config.xml 中載入。mybatis-config.xml 文件可以載入多個映射文件,每個文件對應資料庫中的一張表。
3、構造會話工廠:
通過 MyBatis 的環境等配置信息謹舉構建會話工廠 SqlSessionFactory。
4、創建會話對象:
由會話工廠創建 SqlSession 對象,該對拿晌哪象中包含了執行 SQL 語句的所有方法。
5、Executor 執行器:
MyBatis 底層定義了一個 Executor 介面來操作資料庫,它將根據 SqlSession 傳遞消碼的參數動態地生成需要執行的 SQL 語句,同時負責查詢緩存的維護。
8、輸出結果映射:
輸出結果類型可以是 Map、 List 等集合類型,也可以是基本數據類型和 POJO 類型。輸出結果映射過程類似於 JDBC 對結果集的解析過程。
『陸』 mybatis配置文件里怎麼格式化sql
第一步:新建一個java項目。
『柒』 Mybatis中如何實現批量數據的插入,請寫出配置文件的配置信息以及Java代碼的源
MyBatis提供用於插入數據的註解有兩個:@insert,@InsertProvider,類似還有:@DeleteProvider@UpdateProvider,和@SelectProvider,
作用:
用來在實體類的Mapper類里註解保存方法的SQL語句
區別:
@Insert是直接配置SQL語句,而@InsertProvider則是通過SQL工廠類及對應的方法生產SQL語句,這種方法的好處在於,我們可以根據不同的需求生產出不同的SQL,搏昌州適用性更好。
使用:
@Insert
@Insert(「insert into blog(blogId,title,author) values(#blogId,#title,#author)」)
public boolean saveBlog(Blog blog);
@InsertProvider
在mapper介面中的方法上使用@InsertProvider註解:
參數解釋:
type為工廠類的類對象,
method為對應的工廠類中的方基蔽法,方法中的@Param(「list」)是因為迅宴批量插入傳入的是一個list,但是Mybatis會將其包裝成一個map。其中map的key為「list」,value為傳入的list。
『捌』 誰能跟我解釋一下Mybatis配置文件中這些語句的含義最好幫我把裡面標簽含義說出來就行了
typeAliases標簽碰告裂 是寫實體類的別笑閉名,寫了之後可以在寫Sql配置文件例如<select>標簽中的屬性就可以不用寫實體的具體路徑直接用別名就可以了,可以簡化代碼給你看個例子:友喚沒有別名這樣寫<select resultType="com.sjh.entity.VoteUser"> 寫了別名就可以這樣寫<select resultType="VoteUsers"> 直接寫別名就可以不用再寫實體的路徑了,VoteUsers就能在任何地方代替「com.sjh.entity.VoteUser」被使用。如果很多屬性涉及到實體類,直接寫別名很方便的。你說你刪了程序照樣跑,寫配置的時候你一定是沒有應用到別名,都寫得實體路徑。希望通過我的一番解釋你能明白這個標簽的用途。
『玖』 mybatis各階段的詳解
比如我們在引入了jdbc的配置文件使用了properties標簽,引入jdbc有什麼好處?,可以在配置文件中統一管理
內容而不是在很多個文件改來改去,而且在核心配置文件中把資料庫連接相關的寫死,顯然是硬編碼的所以我們用配置文件代替 nice!!!
你可能注意到了上面的寫法 用前綴jdbc. 可以很好地將他們與其他的變數區分開,(可以從名字很容易看出是jdbc相關的數據,不至於和同名變數搞混因為username這種可能
不止會出洞虧現在資料庫的連接)
上面的代碼中引入配置文件的部分為
可以從上面看到寫法:
下面這段就是用來設置類的別名:
那麼問題來了,為什麼要有類的別名這種操作??
因為在映射文件中每次都要寫全類名顯然有點麻煩比如下面這樣:納謹神
一個項目是會有很多個映射文件的為了方便,所以類別名就出現了。可以在核心配置文件寫介面類和對應的別名
這樣就可以在映射文件的命名空間里可以直接寫User(對大小沒有要求也可以是user; 其實可以比這更加簡單,也是我們在實際開發中常用的寫法
就是將整個包寫成別名的形式,如果不寫alias屬性默認為類名(不區分大小寫),這樣就容易多了,我們只需一行代碼,便可以在所有的映射文件命名空間
中直接寫對應的類名
引入核心的配置文件
首先需晌兄要思考的這里是映射文件的引入,我們正常的一個項目的資料庫是有很多個表組成的那麼每一張表對應一個mapper介面,每個介面對應一個映射文件,那麼就需要導入大量的映射文件,還容易漏掉-->
上面這種以包的形式的導入非常方便,不用每次新建一個介面就要導入它的映射文件,但是上面這種寫法需要 注意 一些問題:
如果你在映射文件中編寫查詢語句的sql,但是粗心的你忘記了設置返回類型會在控制台拋異常且會看到這樣的說明:
It's likely that neither a Result Type nor a Result Map was specified.
下面只是指定返回類型的一種方式:resultType,還有 resultMap
它們的區別:
查詢的標簽必須指定resultType或resultMap
com.kobe.mybatis 獲取參數的兩種方式:${} 和 #{}
上面是使用了 #{}寫法相當於原生jdbc的佔位符,這個前面已經提到過了所以不多贅述, 需要注意的是#{}裡面的變數名可以是任意的username規范顯然很好,但是aaaa也沒錯因為只是用來佔位的;
還有就是在使用${}時注意''單引號問題,因為${}是字元拼接的方式,所以需要注意!!
傳輸參數時有多個參數時
在測試代碼里通過傳入兩個參數分別為 username和password 但是在上面代碼的(映射文件里的部分代碼)執行失敗,(sql語句未能解析)
報錯:
Cause: org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
可以從錯誤提示的信息不難發現我們的參數在映射文件里未能真正地接受到,可以用[arg1, arg0, param1, param2] 的方式獲取,mybatis將參數放到map容器可以通過建arg0,agr1..的方式
獲取參數(也可以是param1,param2..)
將上面的代碼改動:
需要注意的是:使用${}時需要手動添加''才能正常訪問,因為他的處理方式是字元串的拼接
做了改動之後結果很感人!!
User{id=6, userName='旺財', age=20, password='cwlz'}
可以直接通過鍵訪問相對應的值(通過自己的方式訪問到數據,上面的形式是mybatis默認提供的map和mybatis默認的提取指的方式 arg0,arg2...)
當需要傳多個參數時將他們放到一個map容器,然後將map傳給對應的方法(模擬mybatis的做法,就可以在sql語句中直接通過鍵訪問到值)代碼如下:
映射文件中的部分代碼 :
通過鍵直接獲取值,注意:使用${}時不要忘了單引號!!!!
當參數以實體對象的形式傳參時如何解決?
只需要通過#{}以屬性名的方式訪問!
所以代碼的編寫一定要規范,才能減少這種錯誤!!!
一定要和註解中的參數名一一對應!!!
如果查詢的結果只有一個,也可以通過Map集合接收,欄位名為鍵欄位的值為值:{password=0000, id=3, userName=圖區, age=20}
java.lang.Ingeger --> int ,Integer
int --> _int,_Integer
Map --> map
String --> string
注意:
所以在批量刪除的案例:需要注意的是不能使用#{} 因為它是會自動添加'' 所以在批量刪除的語句中我們要使用${}
若欄位和屬性名不一致 ,則可以通過resultMap設置自定義映射
在mybatis的核心配置文件用下面的代碼將 資料庫中命名的規范 (user_name) 轉換為 java中的命名規范 (userName)
就是手動設置屬性與欄位的映射關系:
如果設置了手動的設置屬性和欄位的映射關系,注意主鍵使用 id 標簽,普通欄位使用 result標簽,就算屬性和欄位名一一對應,只要
用了這種方式就 必須要寫全 !!!
一對多的查詢:
通過分步查詢實現:
多條件的查詢
if 根據標簽中test的屬性所對應的表達式決定標簽中的內容是否拼接到sql語句中
上面的where後面的 1=1 是細節,因為當where後面的條件都為空時就成了 select * from t_user where
顯然這種sql語句是有問題的,還有一種情況就是當userName為null時語句就成了 select * from t_user where and age=#{age}
這也是錯的,所以在where後加一個恆成立的條件不僅不會影響查詢結果,而且沒有會在特定情況時sql語句是會報錯的所以很有必要
where 當where標簽中有內容時,會自動生成where關鍵字,並且將內容前多餘的and 或者or去掉
當where中沒有內容時,此時where標簽沒有任何效果 就是不會生成關鍵字 注意:在寫條件時不能在後面加and or 這個在下一條語句無效時mybatis不會幫你去掉!
相當於 if else
一個案例 -->就是當我們需要批量刪除一些東西時(參數以數組的形式傳入)
sql 片段: 在我們的查詢語句不能在實際開發中也一直寫 *;因為我們要按需查找,不必將不需要的也查詢出來,我們可以將我們平常查詢次數較多的欄位
放在sql片段內,可以在需要查詢時直接進行引用!
緩存,這個術語我們聽過很多次,在web階段時訪問網頁時有緩存機制!
現在sql的查詢時也有緩存機制,有一級緩存,一級緩存是默認開啟的,一級緩存的范圍時sqlSession,將我們查詢到的數據先進行緩存,若下次有相同的查詢時不用重新
訪問資料庫,可以直接從緩存中取出!!!!
手動清空緩存 sqlSession.clearCache();
在mapper配置文件中添加cache標簽可以設置一些屬性:
逆向工程就是不難理解,我們之前都是由實體類到資料庫,而逆向類就是通過資料庫表生成實體類,
『拾』 mybatis中的sql語句完整配置文件怎麼寫
Mybatis 分多個配置文件方法,考慮一個項目會很多模塊,如果團體開發的話用不同模塊在不同的配置文件可以這樣實現: 標簽裡面只能放SQL映射文件 Mybatis配置文件 XML code Spring裡面的配置文件XML code。 當你程序需要執行的時候