MyBatis查詢、新增、更新與刪除操作指南
除錯之控制檯列印SQL
Mybatis的使用流程
先來回顧一下mybatis的使用流程
- 建立mybatis-config.xml 全域性的配置⽂件
- 建立XXXMapper.xml配置⽂件
- 建立SqlSessionFactory
- ⽤SqlSessionFactory建立SqlSession物件
- ⽤SqlSession執⾏增刪改查CRUD
列印sql的配置
內建的⽇志⼯⼚提供⽇志功能,使⽤log4j配置列印sql,新增依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency>
在應⽤的classpath中建立名稱為 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
這樣,我們在執行操作資料庫的時候就會有日誌打印出來
查詢
多個引數
當需要多個引數進行查詢的時候,一般用到取別名,方便識別和使用
<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);
駝峰對映
前面也講到,資料庫欄位是下劃線,java屬性是駝峰,怎麼查詢對映上去
方法: select cover_img as coverImg from video
但是多欄位的時候怎麼辦,每個引數都進行as操作嗎?這裡就用到Mybatis的自帶配置
<!--下劃線⾃動對映駝峰欄位--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
這樣就能夠進行自動對映,例如cover_img會自動對映為coverImg
Mybatis入參parameterType
parameterType 引數型別
可以是基本型別
parameterType="java.lang.Long" parameterType="java.lang.String"
也可以是JAVA集合List或者Map
parameterType="java.util.Map" parameterType="java.util.List"
或者是自定義的物件
parameterType="cn.junko.domain.Video"
取引數值,具體某個欄位的型別,從java型別對映到資料庫型別
例⼦ #{title,jdbcType=VARCHAR}
注意:
- 多數情況不加是正常使⽤,但是如果出現報錯:⽆效的列型別,則是缺少jdbcType;
- 只有當欄位可為NULL時才需要jdbcType屬性
常見的資料庫型別和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("測試資料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批量插⼊多條視訊記錄,⽤於迴圈拼接的內建標籤,常⽤於 批量新增、in查詢等常⻅
包含以下屬性:
collection:必填,值為要迭代迴圈的集合型別,情況有多種
⼊參是List型別的時候,collection屬性值為list
⼊參是Map型別的時候,collection 屬性值為map的key值item:每⼀個元素進⾏迭代時的別名
index:索引的屬性名,在集合陣列情況下值為當前索引值,當迭代物件是map時,這個值是
map的key
open:整個迴圈內容的開頭字串
close:整個迴圈內容的結尾字串
separator: 每次迴圈的分隔符
例子
需要注意的是item別名取值iteam.xxx
<insert id="addVideoList" parameterType="cn.junko.domain.Video" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> INSERT INTO `video`(`title`,`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類⾥⾯的是基本資料型別,還是包裝資料型別
刪除
delete刪除語法
需求:刪除某個時間段之後 且⾦額⼤於 10元的資料
<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查詢、新增、更新刪除操作內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!