MyBatis查詢、新增、更新與刪除操作指南
調(diào)試之控制臺打印SQL
Mybatis的使用流程
先來回顧一下mybatis的使用流程
- 創(chuàng)建mybatis-config.xml 全局的配置⽂件
- 創(chuàng)建XXXMapper.xml配置⽂件
- 創(chuàng)建SqlSessionFactory
- ⽤SqlSessionFactory創(chuàng)建SqlSession對象
- ⽤SqlSession執(zhí)⾏增刪改查CRUD
打印sql的配置
內(nèi)置的⽇志⼯⼚提供⽇志功能, 使⽤log4j配置打印sql,添加依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
在應(yīng)⽤的classpath中創(chuàng)建名稱為 log4j.properties 的⽂件
log4j.rootLogger=ERROR, stdout
log4j.logger.cn.junko=DEBUG
#打印更多的TRACE內(nèi)容
#log4j.logger.cn.junko=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
這樣,我們在執(zhí)行操作數(shù)據(jù)庫的時候就會有日志打印出來

查詢
多個參數(shù)
當(dāng)需要多個參數(shù)進行查詢的時候,一般用到取別名,方便識別和使用
<select id="selectByPointAndTitle" resultType="cn.junko.domain.Video">
select * from video where point = #{point} and title like concat('%',#{title},'%')
</select>
List<Video> selectByPointAndTitle(@Param("point") int point,@Param("title") String title);
駝峰映射
前面也講到,數(shù)據(jù)庫字段是下劃線,java屬性是駝峰,怎么查詢映射上去
方法: select cover_img as coverImg from video
但是多字段的時候怎么辦,每個參數(shù)都進行as操作嗎?這里就用到Mybatis的自帶配置
<!--下劃線⾃動映射駝峰字段--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
這樣就能夠進行自動映射,例如cover_img會自動映射為coverImg

Mybatis入?yún)arameterType
parameterType 參數(shù)類型
可以是基本類型
parameterType="java.lang.Long" parameterType="java.lang.String"
也可以是JAVA集合List或者Map
parameterType="java.util.Map" parameterType="java.util.List"
或者是自定義的對象
parameterType="cn.junko.domain.Video"
取參數(shù)值,具體某個字段的類型,從java類型映射到數(shù)據(jù)庫類型
例⼦ #{title, jdbcType=VARCHAR}
注意:
- 多數(shù)情況不加是正常使⽤,但是如果出現(xiàn)報錯:⽆效的列類型,則是缺少jdbcType;
- 只有當(dāng)字段可為NULL時才需要jdbcType屬性
常見的數(shù)據(jù)庫類型和java列席對比
| JDBC Type | Java Type |
|---|---|
| CHAR | String |
| VARCHAR | String |
| LONGVARCHAR | String |
| NUMERIC | java.math.BigDecimal |
| DECIMAL | java.math.BigDecimal |
| BIT | boolean |
| BOOLEAN | boolean |
| TINYINT | byte |
| SMALLINT | short |
| INTEGER | INTEGER |
| INTEGER | int |
| BIGINT | long |
| REAL | float |
| FLOAT | double |
| DOUBLE | double |
| BINARY | byte[] |
| VARBINARY | byte[] |
| LONGVARBINARY | byte[] |
| DATE | java.sql.Date |
| TIME | java.sql.Time |
| TIMESTAMP | java.sql.Timestamp |
| CLOB | Clob |
| BLOB | Blob |
| ARRAY | Array |
| DISTINCT | mapping of underlying type |
| STRUCT | Struct |
| REF | Ref |
| DATALINK | java.net.URL |
插入
編寫mapper
<insert id="addVideo" parameterType="cn.junko.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO `video`(`title`, `summary`, `cover_img`, `price`, `create_time`, `c_id`, `point`)
VALUES (#{title},#{summary},#{coverImg},#{price},#{createTime},#{cid},#{point});
</insert>
獲取自增主鍵,則需要在標(biāo)簽頭加入這三段,即可自動映射到實體類中
useGeneratedKeys="true" keyProperty="id" keyColumn="id"
測試
@Test
public void addVideo(){
Video video = new Video();
video.setTitle("測試數(shù)據(jù)3");
video.setSummary("nihao.com");
video.setCoverImg("wangyi");
video.setPrice(8777);
video.setCreateTime(new Date());
video.setCid(7);
video.setPoint(5.7);
int rows = videoMapper.addVideo(video);
System.out.println("自增主鍵:"+video.getId());
System.out.println(video.toString());
}

foreach 批量插入
foreach批量插⼊多條視頻記錄,⽤于循環(huán)拼接的內(nèi)置標(biāo)簽,常⽤于 批量新增、in查詢等常⻅
包含以下屬性:
collection:必填,值為要迭代循環(huán)的集合類型,情況有多種
⼊參是List類型的時候,collection屬性值為list
⼊參是Map類型的時候,collection 屬性值為map的key值item:每⼀個元素進⾏迭代時的別名
index:索引的屬性名,在集合數(shù)組情況下值為當(dāng)前索引值,當(dāng)?shù)鷮ο笫莔ap時,這個值是
map的key
open:整個循環(huán)內(nèi)容的開頭字符串
close:整個循環(huán)內(nèi)容的結(jié)尾字符串
separator: 每次循環(huán)的分隔符
例子
需要注意的是item別名取值iteam.xxx
<insert id="addVideoList" parameterType="cn.junko.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
INSERT INTO `video`(`title`, `summary`, `cover_img`, `price`, `create_time`, `c_id`, `point`)
VALUES
<foreach collection="list" separator="," item="video">
(#{video.title},#{video.summary},#{video.coverImg},#{video.price},#{video.createTime},#{video.cid},#{video.point})
</foreach>
</insert>
list.add(video1); list.add(video2); int rows = videoMapper.addVideoList(list); System.out.println(list);

主鍵自增同樣適用
更新
普通的更新比較簡單,這里使用一下if test標(biāo)簽
- 可以選擇性更新⾮空字段
- if test標(biāo)簽介紹
- if 標(biāo)簽可以通過判斷傳⼊的值來確定查詢條件,test 指定⼀個OGNL表達式
- 常⻅寫法
//當(dāng)前字段符合條件才更新這個字段的值
<if test='title != null and id == 87 '> title = #{title}, </if>
<if test="title!=null"> title = #{title}, </if>
代碼
<!-- /*suffixOverrides=","去掉后綴,*/-->
<update id="updateVideo" parameterType="cn.junko.domain.Video">
UPDATE `video`
<trim prefix="set" >
<if test="title != null">`title` = #{title},</if>
<if test="summary != null">`summary` = #{summary},</if>
<if test="coverImg != null">`cover_img` = #{coverImg},</if>
<if test="price != 0">`price` = #{price},</if>
<if test="createTime != null">`create_time` = #{createTime},</if>
<if test="cid != 0">`c_id` = #{cid},</if>
<if test="point > 7.0">`point` = #{point}</if>
</trim>
WHERE `id` = #{id};
</update>
⼀定要看pojo類⾥⾯的是基本數(shù)據(jù)類型,還是包裝數(shù)據(jù)類型
刪除
delete刪除語法
需求:刪除某個時間段之后 且⾦額⼤于 10元的數(shù)據(jù)
<delete id="deleteByCreateTimeAndPrice" parameterType="java.util.Map">
delete from video where create_time <![CDATA[ > ]]> #{createTime}
and price <![CDATA[ >= ]]> #{price}
</delete>
為什么要轉(zhuǎn)義字符:
由于MyBatis的sql寫在XML⾥⾯, 有些sql的語法符號和xml⾥⾯的沖突
⼤于等于 <![CDATA[ >= ]]>
⼩于等于 <![CDATA[ <= ]]>
總結(jié)
到此這篇關(guān)于MyBatis查詢、新增、更新與刪除操作指南的文章就介紹到這了,更多相關(guān)MyBatis查詢、新增、更新刪除操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring-cloud入門之spring-cloud-config(配置中心)
這篇文章主要介紹了spring-cloud入門之spring-cloud-config(配置中心),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
java實現(xiàn)調(diào)用http請求的五種常見方式
在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,本文主要介紹了java實現(xiàn)調(diào)用http請求的四種常見方式,感興趣的可以了解一下2024-07-07
Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Java并發(fā)編程之synchronized底層實現(xiàn)原理分析
這篇文章主要介紹了Java并發(fā)編程之synchronized底層實現(xiàn)原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02
Springboot實現(xiàn)根據(jù)用戶ID切換動態(tài)數(shù)據(jù)源
在很多具體應(yīng)用場景中,我們需要用到動態(tài)數(shù)據(jù)源的情況,比如多租戶的場景,系統(tǒng)登錄時需要根據(jù)用戶信息切換到用戶對應(yīng)的數(shù)據(jù)庫。這篇文章主要介紹了SpringBoot根據(jù)用戶ID實現(xiàn)切換動態(tài)數(shù)據(jù)源的示例代碼,感興趣的可以了解一下2021-12-12
SpringBoot+thymeleaf+ajax實現(xiàn)局部刷新詳情
這篇文章主要介紹了SpringBoot+thymeleaf+ajax實現(xiàn)局部刷新詳情,文章圍繞主題展開詳細的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
詳解Spring Boot讀取配置文件與配置文件優(yōu)先級
這篇文章主要介紹了詳解Spring Boot讀取配置文件與配置文件優(yōu)先級,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
java遞歸實現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例
遞歸算法的代碼比較簡潔,可讀性較好;但是在實際的業(yè)務(wù)處理中會出現(xiàn)多次的重復(fù)調(diào)用,如果處理不好,很容易出現(xiàn)StackOverflowError報錯,這篇文章主要給大家介紹了關(guān)于java遞歸實現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-04-04

