日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis的select、insert、update、delete语句

發(fā)布時(shí)間:2023/11/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis的select、insert、update、delete语句 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、select

<!-- 查詢學(xué)生,根據(jù)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,有一個(gè)String參數(shù),并返回一個(gè)StudentEntity類型的對象。?
注意參數(shù)的標(biāo)識(shí)是:#{studentID}。

select 語句屬性配置細(xì)節(jié):

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

二、insert

一個(gè)簡單的insert語句:

<!-- 插入學(xué)生 --> <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可以使用數(shù)據(jù)庫支持的自動(dòng)生成主鍵策略,設(shè)置useGeneratedKeys=”true”,然后把keyProperty 設(shè)成對應(yīng)的列,就搞定了。比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.

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

?

推薦使用這種用法。

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

<!-- 插入學(xué)生 自動(dòng)主鍵--> <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語句屬性配置細(xì)節(jié):

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

selectKey語句屬性配置細(xì)節(jié):

屬性描述取值
keyPropertyselectKey 語句生成結(jié)果需要設(shè)置的屬性。?
resultType生成結(jié)果類型,MyBatis 允許使用基本的數(shù)據(jù)類型,包括String 、int類型。?
order可以設(shè)成BEFORE 或者AFTER,如果設(shè)為BEFORE,那它會(huì)先選擇主鍵,然后設(shè)置keyProperty,再執(zhí)行insert語句;如果設(shè)為AFTER,它就先運(yùn)行insert 語句再運(yùn)行selectKey 語句,通常是insert 語句中內(nèi)部調(diào)用數(shù)據(jù)庫(像Oracle)內(nèi)嵌的序列機(jī)制。BEFORE/AFTER
statementType像上面的那樣, MyBatis 支持STATEMENT,PREPARED和CALLABLE 的語句形式, 對應(yīng)Statement ,PreparedStatement 和CallableStatement 響應(yīng)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>

?

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

方法二:

<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

一個(gè)簡單的update:

<!-- 更新學(xué)生信息 --> <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語句屬性配置細(xì)節(jié):

屬性描述取值默認(rèn)
id在這個(gè)模式下唯一的標(biāo)識(shí)符,可被其它語句引用??
parameterType傳給此語句的參數(shù)的完整類名或別名??
flushCache如果設(shè)為true,則會(huì)在每次語句調(diào)用的時(shí)候就會(huì)清空緩存。select 語句默認(rèn)設(shè)為falsetrue/falsefalse
useCache如果設(shè)為true,則語句的結(jié)果集將被緩存。select 語句默認(rèn)設(shè)為falsetrue/falsefalse
timeout設(shè)置驅(qū)動(dòng)器在拋出異常前等待回應(yīng)的最長時(shí)間,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定正整數(shù)未設(shè)置
fetchSize設(shè)置一個(gè)值后,驅(qū)動(dòng)器會(huì)在結(jié)果集數(shù)目達(dá)到此數(shù)值后,激發(fā)返回,默認(rèn)為不設(shè)值,由驅(qū)動(dòng)器自己決定正整數(shù)驅(qū)動(dòng)器決定
statementTypestatement、preparedstatement、callablestatement。預(yù)準(zhǔn)備語句、可調(diào)用語句STATEMENT、PREPARED、CALLABLEPREPARED

批量更新

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

<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>

?

比較普通的寫法,是通過循環(huán),依次執(zhí)行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

?

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

<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

一個(gè)簡單的delete:

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

?

delete語句屬性配置細(xì)節(jié)同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元素用來定義一個(gè)可以復(fù)用的SQL 語句段,供其它語句調(diào)用。比如:

<!-- 復(fù)用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語句改成:

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

?

六、parameters

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

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

1、基本類型參數(shù)

根據(jù)入學(xué)時(shí)間,檢索學(xué)生列表:

<!-- 查詢學(xué)生list,根據(jù)入學(xué)時(shí)間 --> <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實(shí)體類型參數(shù)

根據(jù)姓名和性別,檢索學(xué)生列表。使用實(shí)體類做參數(shù):

<!-- 查詢學(xué)生list,like姓名、=性別,參數(shù)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參數(shù)

根據(jù)姓名和性別,檢索學(xué)生列表。使用Map做參數(shù):

<!-- 查詢學(xué)生list,=性別,參數(shù)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、多參數(shù)的實(shí)現(xiàn)

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

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寫法:

<!-- 查詢學(xué)生list,like姓名、=性別、=生日、=班級,多參數(shù)方式 --> <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>

?

進(jìn)行查詢:

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

?

七、#{}與${}的區(qū)別

默認(rèn)情況下,使用#{}語法,MyBatis會(huì)產(chǎn)生PreparedStatement語句中,并且安全的設(shè)置PreparedStatement參數(shù),這個(gè)過程中MyBatis會(huì)進(jìn)行必要的安全檢查和轉(zhuǎn)義。?
示例1:?

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

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

說明:?
1.?#將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號。如:order by #{user_id},如果傳入的值是111,那么解析成sql時(shí)的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”.?

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

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

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

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

比如,動(dòng)態(tài)SQL中的字段名,如:ORDER BY ${columnName}

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

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

參考文章: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

?

轉(zhuǎn)載于:https://www.cnblogs.com/yufeng218/p/6622644.html

總結(jié)

以上是生活随笔為你收集整理的mybatis的select、insert、update、delete语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。