❶ mybatis 動態sql和參數
動態SQL,就是根據條件拼接的條件吧。
比如:if、where等等條件,都是動態sql的標簽。
參數:就是#$兩個標簽,注意下$可能會導致sql注入的問題就可以了。
❷ mybatis 根據不同的參數運行不同的SQL
<select id="getUserInfo" parameterType="java.util.Map" resultMap="userResult">
SELECT TU.USERID, TU.USERNAME, TU.PASSWORD, TU.GROUPIDEN, TU.ROLEID
, TUI.REALNAME, TUI.GENDER, TUI.BIRTHDAY, TUI.PERSONID, TUI.EMAIL, TUI.MOBILENUMBER
<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">
, TUS.JOBNUMBER, TUS.COMPANYID FROM TAB_USER TU,
TAB_USER_INFO TUI, TAB_USER_STAFF TUS
</if>
<if test="#{group == 'CONSUMER'}">
, TUC.ADDRESS, TUC.AREAID FROM TAB_USER TU,
TAB_USER_INFO TUI, TAB_USER_CONSUMER TUC
</if>
WHERE
<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">
TU.USERID = TUI.USERID AND TU.USERID = TUS.USERID AND TUI.USERID = TUS.USERID AND TU.USERNAME = #{userName}
</if>
<if test="#{group == 'CONSUMER'}">
TU.USERID = TUI.USERID AND TU.USERID = TUC.USERID AND TUI.USERID = TUC.USERID AND TU.USERNAME = #{userName}
</if>
</select>
這樣試試呢?
❸ MyBatis之SQL語句映射文件增刪改查和Java參數如何對應
insert可以使用資料庫支持的自動生成主鍵策略,設置useGeneratedKeys=」true」,然後把keyProperty 設成對應的列,就搞定了。
比如說上面的StudentEntity 使用auto-generated 為id 列生成主鍵.
還可以使用selectKey元素。
使用mysql資料庫nextval('student')為自定義函數,用來生成一個key。
❹ 如何通過MyBatis動態SQL實現增刪改查
你可以把defaultExecutorType值改了。 有三個值: SIMPLE 普通返回。 REUSE 重復。 BATCH 批量更新。 MyBatis發現更新和插入返回值一直為"-2147482646"的錯誤是由defaultExecutorType設置引起的,如果設置為batch,更新返回值就會丟失。
❺ mybatis 怎麼獲取數據並修改數據
MyBatis 是支持普通 SQL 查詢,存儲過程和高級映射的優秀持久層框架。 MyBatis 消除了幾乎所有的 JDBC 代碼和參數的手工設置以及對結果集的檢索。MyBatis 可以使用簡單的XML 或註解用於配置和原始映射,將介面和 Java 的 POJO(Plain Old Java Objects,普通的Java對象)映射成資料庫中的記錄。
❻ mybatis怎麼執行sql語句值
例如在一個 XXMapper.xml 中:
?
1
2
3
<select id="executeSql" resultType="map">
${_parameter}
</select>
你可以如下調用:
?
1
sqlSession.selectList("executeSql", "select * from sysuser where enabled = 1");
或者你可以在 XXMapper.java 介面中定義如下方法:
?
1
List<Map> executeSql(String sql);
然後使用介面調用方法:
?
1
xxMapper.executeSql("select * from sysuser where enabled = 1");
上面這些內容可能都會,下面在此基礎上再復雜一點。
假如像上面SQL中的enabled = 1我想使用參數方式傳值,也就是寫成 enabled = #{enabled},如果你沒有遇到過類似這種需求,可能不明白為什麼要這么寫,舉個例子,要實現一種動態查詢,可以在前台通過配置 SQL,提供一些查詢條件就能實現一個查詢的功能(為了安全,這些配置肯定是開發或者實施做的,不可能讓用戶直接操作資料庫)。
針對這個功能,使用 MyBatis 實現起來相當容易。配置 SQL 肯定要執行,用上面講的這種方式肯定可以執行 SQL,如何提供參數呢?參數就是enabled = #{enabled}中的#{enabled}部分。如果再多一些條件,一個配置好的 SQL 如下:
?
1
2
3
select * from sysuser
where enabled = #{enabled}
and userName like concat('%',#{userName},'%')
這種情況下,該怎麼用 MyBatis 實現呢?
首先 XML 中修改如下:
?
1
2
3
<select id="executeSql" resultType="map">
${sql}
</select>
介面中的方法修改為:
?
1
List<Map> executeSql(Map map);
然後調用方法:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
Map map = new HashMap();
//這里的 sql 對應 XML 中的 ${sql}
map.put("sql", "select * from sysuser "
+ " where enabled = #{enabled} "
+ " and userName like concat('%',#{userName},'%')");
//#{enabled}
map.put("enabled", 1);
//#{userName}
map.put("userName", "admin");
//介面方式調用
List<Map> list = xxMapper.executeSql(map);
//sqlSession方式調用
❼ mybatis中特殊SQL的幾種配置方法
1.in條件for循環
<select id="getBooList" resultMap="java.util.Map" parameterType="java.util.List" >
select booking_no, max(booking_general_seq) max_seq from interface_booking_t where booking_no in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
group by booking_no
</select>
2.insert並且返回主鍵
<insert id="insertAndGetId" parameterType="com.phy.mlisp.management.domain.Document">
<selectKey resultType="long" order="BEFORE" keyProperty="id">
SELECT MLISP_DOCUMENT_SEQ.NEXTVAL as ID from DUAL
</selectKey>
insert into MLISP_DOCUMENT_T (ID, NAME, ALIAS,
FILE_SIZE,CONTENT,STATUS,CREATE_BY,CREATE_DATE,LAST_UPDATE_BY,
LAST_UPDATE_DATE)
values (#{id},#{name,jdbcType=VARCHAR}, #{alias,jdbcType=VARCHAR},#{fileSize,jdbcType=INTEGER},
#{content,jdbcType=BLOB},
#{status,jdbcType=INTEGER},#{createBy,jdbcType=VARCHAR},SYSDATE,
#{lastUpdateBy,jdbcType=VARCHAR},SYSDATE)
</insert>
3.批量insert
<insert id="batchInsert" parameterType="java.util.List">
insert into INTERFACE_BOOKING_CONTA_T (ID, BOOKING_ID, BOOKING_CONTAINER_SEQ,
CONTA_TYPE, CONTA_SIZE, CONTA_QUANTITY,
CONTA_SIZE_TYPE_ISO)
select interface_booking_conta_seq.NEXTVAL,A.* from(
<foreach collection="list" item="item" index="index" separator="UNION ALL" >
(select #{item.bookingId,jdbcType=DECIMAL}, #{item.bookingContainerSeq,jdbcType=DECIMAL},
#{item.contaType,jdbcType=VARCHAR}, #{item.contaSize,jdbcType=VARCHAR}, #{item.contaQuantity,jdbcType=DECIMAL},
#{item.contaSizeTypeIso,jdbcType=VARCHAR} from al)
</foreach>) A
</insert>
4.批量更新
<update id="batchUpdate" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">
UPDATE WCP_DISPATCH_CONTA_T
<set>
<if test="item.dispatchId != null">
DISPATCH_ID = #{item.dispatchId,jdbcType=DECIMAL},
</if>
</set>
WHERE DISPATCH_ID = #{item.dispatchId,jdbcType=DECIMAL}
</foreach>
</update>
❽ mybatis同一個參數在同一條sql中多次使用如何處理或者說在父查詢和子查詢中使用同一個where條件怎麼辦
最簡單的直接設置resultType=「map」,得到的就是一個List<Map<String,Object>>
每一個Map的key就是查詢結果的列名,也就是表的欄位名。當然sql語句中最好as一下
復雜一點可以自定義一個resultMap標簽
<resultMap id="result" type="java.util.Map">
<result property="c1" column="column1"/>
<result property="c2" column="column2"/>
</resultMap>
其中result可以自定義,select標簽中的resultMap="result",和上面的resultMap標簽的id對應
property設置的是自定義的欄位名稱,也就是結果集中每一個Map的key
column設置查詢結果的欄位名稱
然後通過
for(List<Map<String,Object> map:list){
map.get("c1");//獲取c1對應的欄位的值
。。。
}
❾ mybatis 的sql裡面參數如何運算
1.<when test="start == null and limit == null">;
2.WHERE T.sDARowNo BETWEEN 1 AND 100;
3.</when>;
4.<otherwise>;
5.WHERE T.sDARowNo BETWEEN (#{start}+1) AND (#{start}+#{limit});
6.</otherwise>。