MyBatis查詢(xún)、新增、更新與刪除操作指南
調(diào)試之控制臺(tái)打印SQL
Mybatis的使用流程
先來(lái)回顧一下mybatis的使用流程
- 創(chuàng)建mybatis-config.xml 全局的配置⽂件
- 創(chuàng)建XXXMapper.xml配置⽂件
- 創(chuàng)建SqlSessionFactory
- ⽤SqlSessionFactory創(chuàng)建SqlSession對(duì)象
- ⽤SqlSession執(zhí)⾏增刪改查CRUD
打印sql的配置
內(nèi)置的⽇志⼯⼚提供⽇志功能, 使⽤log4j配置打印sql,添加依賴(lài)
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
在應(yīng)⽤的classpath中創(chuàng)建名稱(chē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
這樣,我們?cè)趫?zhí)行操作數(shù)據(jù)庫(kù)的時(shí)候就會(huì)有日志打印出來(lái)

查詢(xún)
多個(gè)參數(shù)
當(dāng)需要多個(gè)參數(shù)進(jìn)行查詢(xún)的時(shí)候,一般用到取別名,方便識(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ù)庫(kù)字段是下劃線(xiàn),java屬性是駝峰,怎么查詢(xún)映射上去
方法: select cover_img as coverImg from video
但是多字段的時(shí)候怎么辦,每個(gè)參數(shù)都進(jìn)行as操作嗎?這里就用到Mybatis的自帶配置
<!--下劃線(xiàn)⾃動(dòng)映射駝峰字段--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
這樣就能夠進(jìn)行自動(dòng)映射,例如cover_img會(huì)自動(dòng)映射為coverImg

Mybatis入?yún)arameterType
parameterType 參數(shù)類(lèi)型
可以是基本類(lèi)型
parameterType="java.lang.Long" parameterType="java.lang.String"
也可以是JAVA集合List或者M(jìn)ap
parameterType="java.util.Map" parameterType="java.util.List"
或者是自定義的對(duì)象
parameterType="cn.junko.domain.Video"
取參數(shù)值,具體某個(gè)字段的類(lèi)型,從java類(lèi)型映射到數(shù)據(jù)庫(kù)類(lèi)型
例⼦ #{title, jdbcType=VARCHAR}
注意:
- 多數(shù)情況不加是正常使⽤,但是如果出現(xiàn)報(bào)錯(cuò):⽆效的列類(lèi)型,則是缺少jdbcType;
- 只有當(dāng)字段可為NULL時(shí)才需要jdbcType屬性
常見(jiàn)的數(shù)據(jù)庫(kù)類(lèi)型和java列席對(duì)比
| 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 |
插入
編寫(xiě)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)簽頭加入這三段,即可自動(dòng)映射到實(shí)體類(lèi)中
useGeneratedKeys="true" keyProperty="id" keyColumn="id"
測(cè)試
@Test
public void addVideo(){
Video video = new Video();
video.setTitle("測(cè)試數(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查詢(xún)等常⻅
包含以下屬性:
collection:必填,值為要迭代循環(huán)的集合類(lèi)型,情況有多種
⼊參是List類(lèi)型的時(shí)候,collection屬性值為list
⼊參是Map類(lèi)型的時(shí)候,collection 屬性值為map的key值item:每⼀個(gè)元素進(jìn)⾏迭代時(shí)的別名
index:索引的屬性名,在集合數(shù)組情況下值為當(dāng)前索引值,當(dāng)?shù)鷮?duì)象是map時(shí),這個(gè)值是
map的key
open:整個(gè)循環(huán)內(nèi)容的開(kāi)頭字符串
close:整個(gè)循環(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);

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

