MyBatis查詢、新增、更新與刪除操作指南
調試之控制臺打印SQL
Mybatis的使用流程
先來回顧一下mybatis的使用流程
- 創(chuàng)建mybatis-config.xml 全局的配置⽂件
- 創(chuàng)建XXXMapper.xml配置⽂件
- 創(chuàng)建SqlSessionFactory
- ⽤SqlSessionFactory創(chuàng)建SqlSession對象
- ⽤SqlSession執(zhí)⾏增刪改查CRUD
打印sql的配置
內置的⽇志⼯⼚提供⽇志功能, 使⽤log4j配置打印sql,添加依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
在應⽤的classpath中創(chuàng)建名稱為 log4j.properties 的⽂件
log4j.rootLogger=ERROR, stdout
log4j.logger.cn.junko=DEBUG
#打印更多的TRACE內容
#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ù)
當需要多個參數(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;
- 只有當字段可為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>
獲取自增主鍵,則需要在標簽頭加入這三段,即可自動映射到實體類中
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)拼接的內置標簽,常⽤于 批量新增、in查詢等常⻅
包含以下屬性:
collection:必填,值為要迭代循環(huán)的集合類型,情況有多種
⼊參是List類型的時候,collection屬性值為list
⼊參是Map類型的時候,collection 屬性值為map的key值item:每⼀個元素進⾏迭代時的別名
index:索引的屬性名,在集合數(shù)組情況下值為當前索引值,當?shù)鷮ο笫莔ap時,這個值是
map的key
open:整個循環(huán)內容的開頭字符串
close:整個循環(huán)內容的結尾字符串
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標簽
- 可以選擇性更新⾮空字段
- if test標簽介紹
- if 標簽可以通過判斷傳⼊的值來確定查詢條件,test 指定⼀個OGNL表達式
- 常⻅寫法
//當前字段符合條件才更新這個字段的值 <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>
為什么要轉義字符:
由于MyBatis的sql寫在XML⾥⾯, 有些sql的語法符號和xml⾥⾯的沖突
⼤于等于 <![CDATA[ >= ]]>
⼩于等于 <![CDATA[ <= ]]>
總結
到此這篇關于MyBatis查詢、新增、更新與刪除操作指南的文章就介紹到這了,更多相關MyBatis查詢、新增、更新刪除操作內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot使用logback日志級別打印控制操作
這篇文章主要介紹了spring boot使用logback日志級別打印控制操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03SpringBoot Security安裝配置及Thymeleaf整合
這篇文章主要介紹了SpringBoot Security安裝配置及Thymeleaf整合,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12Spring Boot基礎學習之Mybatis操作中使用Redis做緩存詳解
這篇文章主要給大家介紹了關于Spring Boot基礎學習之Mybatis操作中使用Redis做緩存的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-11-11SpringCloud中的Feign遠程調用接口傳參失敗問題
這篇文章主要介紹了SpringCloud中的Feign遠程調用接口傳參失敗問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼
這篇文章主要介紹了easyexcel讀取excel合并單元格數(shù)據(jù)的操作代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05IntelliJ IDEA中如何調試Java Stream操作
這篇文章主要介紹了IntelliJ IDEA中如何優(yōu)雅的調試Java Stream操作,在強大的IDEA插件支持下,stream的調試其實也沒那么難了,下面就來學習一下在IDEA中如何調試stream操作吧2022-05-05