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í)候就會有日志打印出來
查詢
多個(gè)參數(shù)
當(dāng)需要多個(gè)參數(shù)進(jìn)行查詢的時(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í)候怎么辦,每個(gè)參數(shù)都進(jìn)行as操作嗎?這里就用到Mybatis的自帶配置
<!--下劃線⾃動(dòng)映射駝峰字段--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
這樣就能夠進(jìn)行自動(dòng)映射,例如cover_img會自動(dòng)映射為coverImg
Mybatis入?yún)arameterType
parameterType 參數(shù)類型
可以是基本類型
parameterType="java.lang.Long" parameterType="java.lang.String"
也可以是JAVA集合List或者M(jìn)ap
parameterType="java.util.Map" parameterType="java.util.List"
或者是自定義的對象
parameterType="cn.junko.domain.Video"
取參數(shù)值,具體某個(gè)字段的類型,從java類型映射到數(shù)據(jù)庫類型
例⼦ #{title, jdbcType=VARCHAR}
注意:
- 多數(shù)情況不加是正常使⽤,但是如果出現(xiàn)報(bào)錯(cuò):⽆效的列類型,則是缺少jdbcType;
- 只有當(dāng)字段可為NULL時(shí)才需要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)簽頭加入這三段,即可自動(dòng)映射到實(shí)體類中
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類型的時(shí)候,collection屬性值為list
⼊參是Map類型的時(shí)候,collection 屬性值為map的key值item:每⼀個(gè)元素進(jìn)⾏迭代時(shí)的別名
index:索引的屬性名,在集合數(shù)組情況下值為當(dāng)前索引值,當(dāng)?shù)鷮ο笫莔ap時(shí),這個(gè)值是
map的key
open:整個(gè)循環(huán)內(nè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);
主鍵自增同樣適用
更新
普通的更新比較簡單,這里使用一下if test標(biāo)簽
- 可以選擇性更新⾮空字段
- if test標(biāo)簽介紹
- if 標(biāo)簽可以通過判斷傳⼊的值來確定查詢條件,test 指定⼀個(gè)OGNL表達(dá)式
- 常⻅寫法
//當(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類⾥⾯的是基本數(shù)據(jù)類型,還是包裝數(shù)據(jù)類型
刪除
delete刪除語法
需求:刪除某個(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寫在XML⾥⾯, 有些sql的語法符號和xml⾥⾯的沖突
⼤于等于 <![CDATA[ >= ]]>
⼩于等于 <![CDATA[ <= ]]>
總結(jié)
到此這篇關(guān)于MyBatis查詢、新增、更新與刪除操作指南的文章就介紹到這了,更多相關(guān)MyBatis查詢、新增、更新刪除操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot使用logback日志級別打印控制操作
這篇文章主要介紹了spring boot使用logback日志級別打印控制操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03SpringBoot Security安裝配置及Thymeleaf整合
這篇文章主要介紹了SpringBoot Security安裝配置及Thymeleaf整合,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Spring Boot整合web層實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Spring Boot整合web層實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot接口調(diào)用之后報(bào)404問題的解決方案
這篇文章主要介紹了SpringBoot接口調(diào)用之后報(bào)404問題的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。2021-06-06Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot基礎(chǔ)學(xué)習(xí)之Mybatis操作中使用Redis做緩存的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧2018-11-11SpringCloud中的Feign遠(yuǎn)程調(diào)用接口傳參失敗問題
這篇文章主要介紹了SpringCloud中的Feign遠(yuǎn)程調(diào)用接口傳參失敗問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼
這篇文章主要介紹了easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05IntelliJ IDEA中如何調(diào)試Java Stream操作
這篇文章主要介紹了IntelliJ IDEA中如何優(yōu)雅的調(diào)試Java Stream操作,在強(qiáng)大的IDEA插件支持下,stream的調(diào)試其實(shí)也沒那么難了,下面就來學(xué)習(xí)一下在IDEA中如何調(diào)試stream操作吧2022-05-05