mybatis的select、insert、update、delete語句

一、select

<!-- 查詢學生,根據id -->  
<select id="getStudent" parameterType="String" resultMap="studentResultMap">  SELECT ST.STUDENT_ID,  ST.STUDENT_NAME,  ST.STUDENT_SEX,  ST.STUDENT_BIRTHDAY,  ST.CLASS_ID  FROM STUDENT_TBL ST  WHERE ST.STUDENT_ID = #{studentID}  
</select>  

這條語句就叫做‘getStudent,有一個String參數,并返回一個StudentEntity類型的對象。?
注意參數的標識是:#{studentID}。

select 語句屬性配置細節:

屬性描述取值默認
id在這個模式下唯一的標識符,可被其它語句引用??
parameterType傳給此語句的參數的完整類名或別名??
resultType語句返回值類型的整類名或別名。注意,如果是集合,那么這里填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能并用)??
resultMap引用的外部resultMap 名。結果集映射是MyBatis 中最強大的特性。許多復雜的映射都可以輕松解決。(resultType 與resultMap 不能并用)??
flushCache如果設為true,則會在每次語句調用的時候就會清空緩存。select 語句默認設為falsetrue/falsefalse
useCache如果設為true,則語句的結果集將被緩存。select 語句默認設為falsetrue/falsefalse
timeout設置驅動器在拋出異常前等待回應的最長時間,默認為不設值,由驅動器自己決定正整數未設置
fetchSize設置一個值后,驅動器會在結果集數目達到此數值后,激發返回,默認為不設值,由驅動器自己決定正整數驅動器決定
statementTypestatement,preparedstatement,callablestatement。預準備語句、可調用語句STATEMENT、PREPARED、CALLABLEPREPARED
resultSetTypeforward_only、scroll_sensitive、scroll_insensitive 只轉發,滾動敏感,不區分大小寫的滾動FORWARD_ONLY、SCROLL_SENSITIVE、SCROLL_INSENSITIVE驅動器決定

二、insert

一個簡單的insert語句:

<!-- 插入學生 -->  
<insert id="insertStudent" parameterType="StudentEntity">  INSERT INTO STUDENT_TBL (STUDENT_ID,  STUDENT_NAME,  STUDENT_SEX,  STUDENT_BIRTHDAY,  CLASS_ID)  VALUES   (#{studentID},  #{studentName},  #{studentSex},  #{studentBirthday},  #{classEntity.classID})  
</insert>  

?

insert可以使用數據庫支持的自動生成主鍵策略,設置useGeneratedKeys=”true”,然后把keyProperty 設成對應的列,就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.

<insert id="insertStudent" parameterType="StudentEntity" useGeneratedKeys="true" keyProperty="studentID">

?

推薦使用這種用法。

另外,還可以使用selectKey元素。下面例子,使用MySQL數據庫nextval(‘student’)為自定義函數,用來生成一個key。

<!-- 插入學生 自動主鍵-->  
<insert id="insertStudentAutoKey" parameterType="StudentEntity">  <selectKey keyProperty="studentID" resultType="String" order="BEFORE">  select nextval('student')  </selectKey>  INSERT INTO STUDENT_TBL (STUDENT_ID,  STUDENT_NAME,  STUDENT_SEX,  STUDENT_BIRTHDAY,  CLASS_ID)  VALUES   (#{studentID},  #{studentName},  #{studentSex},  #{studentBirthday},  #{classEntity.classID})      
</insert>  

?

?

insert語句屬性配置細節:

屬性描述取值默認
id在這個模式下唯一的標識符,可被其它語句引用??
parameterType傳給此語句的參數的完整類名或別名??
flushCache如果設為true,則會在每次語句調用的時候就會清空緩存。select 語句默認設為falsetrue/falsefalse
useCache如果設為true,則語句的結果集將被緩存。select 語句默認設為falsetrue/falsefalse
timeout設置驅動器在拋出異常前等待回應的最長時間,默認為不設值,由驅動器自己決定正整數未設置
fetchSize設置一個值后,驅動器會在結果集數目達到此數值后,激發返回,默認為不設值,由驅動器自己決定正整數驅動器決定
statementTypestatement、preparedstatement、callablestatement。預準備語句、可調用語句STATEMENT、PREPARED、CALLABLEPREPARED
useGeneratedKeys告訴MyBatis 使用JDBC 的getGeneratedKeys 方法來獲取數據庫自己生成的主鍵(MySQL、SQLSERVER 等關系型數據庫會有自動生成的字段)。默認:falsetrue/falsefalse
keyProperty標識一個將要被MyBatis設置進getGeneratedKeys的key 所返回的值,或者為insert 語句使用一個selectKey子元素。??

selectKey語句屬性配置細節:

屬性描述取值
keyPropertyselectKey 語句生成結果需要設置的屬性。?
resultType生成結果類型,MyBatis 允許使用基本的數據類型,包括String 、int類型。?
order可以設成BEFORE 或者AFTER,如果設為BEFORE,那它會先選擇主鍵,然后設置keyProperty,再執行insert語句;如果設為AFTER,它就先運行insert 語句再運行selectKey 語句,通常是insert 語句中內部調用數據庫(像Oracle)內嵌的序列機制。BEFORE/AFTER
statementType像上面的那樣, MyBatis 支持STATEMENT,PREPARED和CALLABLE 的語句形式, 對應Statement ,PreparedStatement 和CallableStatement 響應STATEMENT、PREPARED、CALLABLE

批量插入

方法一:

<insert id="add" parameterType="EStudent"><foreach collection="list" item="item" index="index" separator=";">INSERT INTO TStudent(name,age) VALUES(#{item.name}, #{item.age})</foreach>
</insert>

?

上述方式相當語句逐條INSERT語句執行,將出現如下問題:?
1. mapper接口的add方法返回值將是最一條INSERT語句的操作成功的記錄數目(就是0或1),而不是所有INSERT語句的操作成功的總記錄數目?
2. 當其中一條不成功時,不會進行整體回滾。

方法二:

<insert id="insertStudentAutoKey" parameterType="java.util.List">INSERT INTO STUDENT_TBL (STUDENT_NAME,  STUDENT_SEX,  STUDENT_BIRTHDAY,  CLASS_ID)  VALUES   <foreach collection="list" item="item" index="index" separator=",">( #{item.studentName},#{item.studentSex},#{item.studentBirthday},#{item.classEntity.classID})</foreach></insert>

?

三、update

一個簡單的update:

<!-- 更新學生信息 -->  
<update id="updateStudent" parameterType="StudentEntity">  UPDATE STUDENT_TBL  SET STUDENT_TBL.STUDENT_NAME = #{studentName},   STUDENT_TBL.STUDENT_SEX = #{studentSex},  STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},  STUDENT_TBL.CLASS_ID = #{classEntity.classID}  WHERE STUDENT_TBL.STUDENT_ID = #{studentID};     
</update>

?

update語句屬性配置細節:

屬性描述取值默認
id在這個模式下唯一的標識符,可被其它語句引用??
parameterType傳給此語句的參數的完整類名或別名??
flushCache如果設為true,則會在每次語句調用的時候就會清空緩存。select 語句默認設為falsetrue/falsefalse
useCache如果設為true,則語句的結果集將被緩存。select 語句默認設為falsetrue/falsefalse
timeout設置驅動器在拋出異常前等待回應的最長時間,默認為不設值,由驅動器自己決定正整數未設置
fetchSize設置一個值后,驅動器會在結果集數目達到此數值后,激發返回,默認為不設值,由驅動器自己決定正整數驅動器決定
statementTypestatement、preparedstatement、callablestatement。預準備語句、可調用語句STATEMENT、PREPARED、CALLABLEPREPARED

批量更新

情景一:更新多條記錄為多個字段為不同的值?
方法一:

<update id="updateBatch"  parameterType="java.util.List">  <foreach collection="list" item="item" index="index" open="" close="" separator=";">update course<set>name=${item.name}</set>where id = ${item.id}</foreach>      
</update>

?

比較普通的寫法,是通過循環,依次執行update語句。

方法二:

UPDATE TStudent SET Name = R.name, Age = R.age
from (SELECT 'Mary' as name, 12 as age, 42 as idunion allselect 'John' as name , 16 as age, 43 as id
) as r 
where ID = R.id

?

情景二:更新多條記錄的同一個字段為同一個值

<update id="updateOrders" parameterType="java.util.List">update orders set state = '0' where no in<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach></update>

四、delete

一個簡單的delete:

<!-- 刪除學生 -->  
<delete id="deleteStudent" parameterType="StudentEntity">  DELETE FROM STUDENT_TBL WHERE STUDENT_ID = #{studentID}  
</delete>  

?

delete語句屬性配置細節同update

批量刪除:

<!-- 通過主鍵集合批量刪除記錄 --><delete id="batchRemoveUserByPks" parameterType="java.util.List">DELETE FROM LD_USER WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")">#{item}</foreach></delete>

?

五、sql元素

Sql元素用來定義一個可以復用的SQL 語句段,供其它語句調用。比如:

<!-- 復用sql語句  查詢student表所有字段 -->  
<sql id="selectStudentAll">  SELECT ST.STUDENT_ID,  ST.STUDENT_NAME,  ST.STUDENT_SEX,  ST.STUDENT_BIRTHDAY,  ST.CLASS_ID  FROM STUDENT_TBL ST  
</sql>  

?

這樣,在select的語句中就可以直接引用使用了,將上面select語句改成:

<!-- 查詢學生,根據id -->  
<select id="getStudent" parameterType="String" resultMap="studentResultMap">  <include refid="selectStudentAll"/>  WHERE ST.STUDENT_ID = #{studentID}   
</select>  

?

六、parameters

上面很多地方已經用到了參數,比如查詢、修改、刪除的條件,插入,修改的數據等,MyBatis可以使用Java的基本數據類型和Java的復雜數據類型。如:基本數據類型,String,int,date等。

但是使用基本數據類型,只能提供一個參數,所以需要使用Java實體類,或Map類型做參數類型。通過#{}可以直接得到其屬性。

1、基本類型參數

根據入學時間,檢索學生列表:

<!-- 查詢學生list,根據入學時間  -->  
<select id="getStudentListByDate"  parameterType="Date" resultMap="studentResultMap">  SELECT *  FROM STUDENT_TBL ST LEFT JOIN CLASS_TBL CT ON ST.CLASS_ID = CT.CLASS_ID  WHERE CT.CLASS_YEAR = #{classYear};      
</select>  
List<StudentEntity> studentList = studentMapper.getStudentListByClassYear(StringUtil.parse("2007-9-1"));  
for (StudentEntity entityTemp : studentList) {  System.out.println(entityTemp.toString());  
} 

2、Java實體類型參數

根據姓名和性別,檢索學生列表。使用實體類做參數:

<!-- 查詢學生list,like姓名、=性別,參數entity類型 -->  
<select id="getStudentListWhereEntity" parameterType="StudentEntity" resultMap="studentResultMap">  SELECT * from STUDENT_TBL ST  WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')  AND ST.STUDENT_SEX = #{studentSex}  
</select>  
StudentEntity entity = new StudentEntity();  
entity.setStudentName("李");  
entity.setStudentSex("男");  
List<StudentEntity> studentList = studentMapper.getStudentListWhereEntity(entity);  
for (StudentEntity entityTemp : studentList) {  System.out.println(entityTemp.toString());  
}  

?

3、Map參數

根據姓名和性別,檢索學生列表。使用Map做參數:

<!-- 查詢學生list,=性別,參數map類型 -->  
<select id="getStudentListWhereMap" parameterType="Map" resultMap="studentResultMap">  SELECT * from STUDENT_TBL ST  WHERE ST.STUDENT_SEX = #{sex}  AND ST.STUDENT_SEX = #{sex}  
</select>  
Map<String, String> map = new HashMap<String, String>();  
map.put("sex", "女");  
map.put("name", "雪");  
List<StudentEntity> studentList = studentMapper.getStudentListWhereMap(map);
for (StudentEntity entityTemp : studentList) { System.out.println(entityTemp.toString()); } 

4、多參數的實現

如果想傳入多個參數,則需要在接口的參數上添加@Param注解。給出一個實例:?
接口寫法:

public List<StudentEntity> getStudentListWhereParam(@Param(value = "name") String name, @Param(value = "sex") String sex, @Param(value = "birthday") Date birthdar, @Param(value = "classEntity") ClassEntity classEntity);  

?

sql寫法:

<!-- 查詢學生list,like姓名、=性別、=生日、=班級,多參數方式 -->  
<select id="getStudentListWhereParam" resultMap="studentResultMap">  SELECT * from STUDENT_TBL ST  <where>  <if test="name!=null and name!='' ">  ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{name}),'%')  </if>  <if test="sex!= null and sex!= '' ">  AND ST.STUDENT_SEX = #{sex}  </if>  <if test="birthday!=null">  AND ST.STUDENT_BIRTHDAY = #{birthday}  </if>  <if test="classEntity!=null and classEntity.classID !=null and classEntity.classID!='' ">  AND ST.CLASS_ID = #{classEntity.classID}  </if>  </where>  
</select>  

?

進行查詢:

List<StudentEntity> studentList = studentMapper.getStudentListWhereParam("","",StringUtil.parse("1985-05-28"), classMapper.getClassByID("20000002"));  
for (StudentEntity entityTemp : studentList) {  System.out.println(entityTemp.toString());  
}  

?

七、#{}與${}的區別

默認情況下,使用#{}語法,MyBatis會產生PreparedStatement語句中,并且安全的設置PreparedStatement參數,這個過程中MyBatis會進行必要的安全檢查和轉義。?
示例1:?

執行SQL:Select * from emp where name = #{employeeName}?
參數:employeeName=>Smith?
解析后執行的SQL:Select * from emp where name = ??

執行SQL:Select * from emp where name = ${employeeName}?
參數:employeeName傳入值為:Smith?
解析后執行的SQL:Select * from emp where name =Smith

說明:?
1.?#將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #{user_id},如果傳入的值是111,那么解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”.?

2.?$將傳入的數據直接顯示生成在sql中。如:order by ${user_id},如果傳入的值是111,那么解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id.

綜上所述,${}方式會引發SQL注入的問題、同時也會影響SQL語句的預編譯,所以從安全性和性能的角度出發,能使用#{}的情況下就不要使用${}。

${}在什么情況下使用呢?

有時候可能需要直接插入一個不做任何修改的字符串到SQL語句中。這時候應該使用${}語法。

比如,動態SQL中的字段名,如:ORDER BY ${columnName}

<select id="queryMetaList" resultType="Map" statementType="STATEMENT">Select * from emp where name = ${employeeName} ORDER BY ${columnName}
</select> 

由于${}僅僅是簡單的取值,所以以前sql注入的方法適用此處,如果我們order by語句后用了${},那么不做任何處理的時候是存在sql注入危險的。

參考文章:http://limingnihao.iteye.com/blog/781911?
http://www.tuicool.com/articles/zyUjqiJ?
http://blog.csdn.net/szwangdf/article/details/26714603

http://blog.csdn.net/bear_wr/article/details/52386257

?

轉載于:https://www.cnblogs.com/yufeng218/p/6622644.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393369.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

appium java簡單實例_Appium創建一個Note的實例

近來通過Appium&#xff0c;Robotium等幾個框架去了解移動平臺自動化測試。Appium官方實例是使用ContactManager.apk&#xff0c;而Robotium使用的是SDK自帶的Notepad.apk&#xff0c;為了方便比較&#xff0c;在了解Appium的同時把實例修改成跟Robotium一致的Notepad.apk并記錄…

Lync Server 2013無法共享PPT故障排錯處理

前段時間幫助朋友看了一個關于Lync Server 2013無法共享PPT的問題&#xff0c;共享PPT時報如下錯誤&#xff1a; 日志截圖如下&#xff1a; 原因如下前端服務器未關聯Ofice web Application服務器&#xff0c;關聯即可&#xff0c;如下&#xff1a; 關聯完成后&#xff0c;如下…

leetcode733. 圖像渲染(bfs)

有一幅以二維整數數組表示的圖畫&#xff0c;每一個整數表示該圖畫的像素值大小&#xff0c;數值在 0 到 65535 之間。 給你一個坐標 (sr, sc) 表示圖像渲染開始的像素值&#xff08;行 &#xff0c;列&#xff09;和一個新的顏色值 newColor&#xff0c;讓你重新上色這幅圖像…

chrome擴展程序_如何創建Chrome擴展程序

chrome擴展程序by Erika Tan譚詠麟 如何創建Chrome擴展程序 (How to create a Chrome Extension) In this article, I will be teaching you how to make a Chrome Extension of your own. I’m basing it off of lessons learned while creating TalkToMe, a Chrome Extensio…

對‘初學者應該選擇哪種編程語言’的回答——計算機達人成長之路(38)

7、PASCAL語言&#xff08;一&#xff09;一門通&#xff0c;門門通 在計算機學習問題排行版上&#xff0c;有一個問題絕對是穩居榜首&#xff0c;每次提出都能在各大論壇掀起一股頂帖風暴&#xff0c;而各大網站的每個網絡大牛&#xff0c;都會收到無數學院小弟發來弱弱的提問…

leetcode110. 平衡二叉樹(遞歸)

給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a;一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1:給定二叉樹 [3,9,20,null,null,15,7]3/ \9 20/ \15 7 返回 true 。代碼 /*** Defi…

spring配置文件注解方式引入的兩種方式

一、#{beanID[propertiesName]}方式 <bean id"propertyConfigurer" class"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name"fileEncoding" value"utf-8" /><property name&…

vsc 搜索特定代碼_特定問題的通用解決方案:何時編寫代碼以及何時編寫代碼...

vsc 搜索特定代碼by Rina Artstain通過麗娜阿斯特斯坦 特定問題的通用解決方案&#xff1a;何時編寫代碼以及何時編寫代碼 (Generic solutions to specific problems: when to write some code and when to just do it) There is a traditional story that tells of a rabbi w…

java手動編譯jar包_Maven 手動添加第三方依賴包及編譯打包和java命令行編譯JAVA文件并使用jar命令打包...

一&#xff0c;實例:新建了一個Maven項目,在eclipse中通過 build path –> configure path….將依賴包添加到工程中后&#xff0c;eclipse不報錯了。但是用Maven命令 mvn clean compile 時出錯如下&#xff1a;原因是在eclipse中添加了 exteneral jar后&#xff0c;還需要在…

SQL like

確定給定的字符串是否與指定的模式匹配。模式可以包含常規字符和通配符字符。模式匹配過程中&#xff0c;常規字符必須與字符串中指定的字符完全匹配。然而&#xff0c;可使用字符串的任意片段匹配通配符。與使用 和 ! 字符串比較運算符相比&#xff0c;使用通配符可使 LIKE 運…

計劃備份mysql數據庫

1:mysql是我們使用最多的數據庫&#xff0c;如果在日常中正確的對mysql數據進行備份&#xff0c;下面我們就來做這事&#xff0c;通過腳本來實現##########################################################################################################################…

leetcode1333. 餐廳過濾器

給你一個餐館信息數組 restaurants&#xff0c;其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必須使用以下三個過濾器來過濾這些餐館信息。 其中素食者友好過濾器 veganFriendly 的值可以為 true 或者 false&#xff0c;如果為 true 就意味著你…

3.27下午

轉載于:https://www.cnblogs.com/bgd140201228/p/6628194.html

2019春季學期進度報告(十四)

課上花費時間&#xff1a;5h 課下花費時間&#xff1a;6h 學會的新內容&#xff1a;阿里云服務器的購買&#xff0c;websockt入門。 代碼量&#xff1a;200h 轉載于:https://www.cnblogs.com/Aduorisk/p/11056750.html

rxjs 怎么使用_使用RxJS Observables進行SUPER SAIYAN

rxjs 怎么使用I loved DragonBall Z as a kid, and still love it as an adult. 我從小就愛DragonBall Z&#xff0c;但從小到大仍然喜歡它。 Among the ludicrous number of transformations, the original Super Saiyan remains my favorite. 在可笑的轉換數量中&#xff0c…

java編程石頭剪刀布_java 開發的石頭,剪刀,布的游戲 demo

[java]代碼庫/** 創建一個類Game&#xff0c;石頭&#xff0c;剪刀&#xff0c;布的游戲。*/public class Game {/*** param args*/String[] s {"石頭","剪刀","布"};//獲取電腦出拳String getComputer(int i){String computerGuess s[i];retur…

JList的基本操作

1.初始化并添加元素 DefaultListModel leftListModelnew DefaultListModel(); String[] items Model.getPairs(); for (int i0; i<items.length; i) { leftListModel.add(i, items[i]); } JList leftLstnew JList(leftListModel); 2.刪除所有元素 leftListModel.remove…

請求WebApi的幾種方式

請求WebApi的幾種方式目前所了解的請求WebAPI的方式有通過后臺訪問api 和通過js 直接訪問api接口 首先介紹下通過后臺訪問api的方法&#xff0c;可以使用HttpClient的方式也可以使用WebRequest的方式 1、HttpClient的方式 &#xff08;1&#xff09;Get請求 string url "…

Django第三篇

前端反向解析 應用場景&#xff1a;通過訪問a路由&#xff0c;到達a的對應視圖函數&#xff0c;函數到達對應的前端a標簽 a標簽的路徑是b路由&#xff0c;如果我們在后端改變b路由的路徑&#xff0c;那么a標簽便無法訪問 到b路由&#xff0c;只能手動在前端改變a標簽的路徑&…

leetcode792. 匹配子序列的單詞數

給定字符串 S 和單詞字典 words, 求 words[i] 中是 S 的子序列的單詞個數。 示例: 輸入: S “abcde” words [“a”, “bb”, “acd”, “ace”] 輸出: 3 解釋: 有三個是 S 的子序列的單詞: “a”, “acd”, “ace”。 class Solution {public int numMatchingSubseq(Strin…