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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等

發布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.當實體類中的屬性名和表中的字段名不一樣?

解決辦法①:?
通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致?
<select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>?
select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};?
</select>?
解決辦法②:?
通過<resultMap>來映射字段名和實體類屬性名的一一對應的關系?
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>?
<!–用id屬性來映射主鍵字段–>?
<id property=”id” column=”order_id”>?
<!–用result屬性來映射非主鍵字段–>?
<result property = “orderno” column =”order_no”/>?
<result property=”price” column=”order_price” />?
</reslutMap>

2、 要使用like語句該怎么寫? 有兩種使用like的方法。(推薦使用)第一種方法是,在Java代碼中添加sql通配符。?

示例一:?
01.string wildcardname = “%smi%”;?
02.list<name> names = mapper.selectlike(wildcardname);

01.<select id=”selectlike”>?
02. select * from foo where bar like #{value}?
03.</select>

第二種方式是在sql語句中拼接通配符。?
這種方法相對來說安全性要低一些,因為可能會被sql注入攻擊。?
示例二:?
01.string wildcardname = “smi”;?
02.list<name> names = mapper.selectlike(wildcardname);

01.<select id=”selectlike”>?
02. select * from foo where bar like ‘%’ || ‘${value}’ || ‘%’?
03.</select>

重要提示: 請注意兩種方式中 $ 和 # 的使用!

3、如何執行批量插入?

首先,創建一個簡單的insert語句:?
01.<insert id=”insertname”>?
02. insert into names (name) values (#{value})?
03.</insert>

然后在java代碼中像下面這樣執行批處理插入:?
01.list<string> names = new arraylist();?
02.names.add(“fred”);?
03.names.add(“barney”);?
04.names.add(“betty”);?
05.names.add(“wilma”);?
06.?
07.// 注意這里 executortype.batch?
08.sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch);?
09.try {?
10. namemapper mapper = sqlsession.getmapper(namemapper.class);?
11. for (string name : names) {?
12. mapper.insertname(name);?
13. }?
14. sqlsession.commit();?
15.} finally {?
16. sqlsession.close();?
17.}

4、如何獲取自動生成的(主)鍵值?

insert 方法總是返回一個int值 - 這個值代表的是插入的行數。?
而自動生成的鍵值在 insert 方法執行完后可以被設置到傳入的參數對象中。?
示例:?
01.<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>?
02. insert into names (name) values (#{name})?
03.</insert>

01.name name = new name();?
02.name.setname(“fred”);?
03.?
04.int rows = mapper.insertname(name);?
05.// 完成后,id已經被設置到對象中?
06.system.out.println(“rows inserted = ” + rows);?
07.system.out.println(“generated key value = ” + name.getid());

5、在mapper中如何傳遞多個參數?

java的反射機制并不能讓框架獲取到參數的名字(方法簽名中只有參數類型,?
可以說是為了優化,也可以說設計就是如此,總之名字無意義), 所以mybatis默認的命名為: param1,param2……?
如果想給他們指定名稱,可以使用 @param 注解:?
01.import org.apache.ibatis.annotations.param;?
02.public interface usermapper {?
03. user selectuser(@param(“username”) string username,?
04. @param(“hashedpassword”) string hashedpassword);?
05.}

然后,就可以在xml像下面這樣使用(推薦封裝為一個map,作為單個參數傳遞給mapper):?
01.<select id=”selectuser” resulttype=”user”>?
02. select id, username, hashedpassword?
03. from some_table?
04. where username = #{username}?
05. and hashedpassword = #{hashedpassword}?
06.</select>

6.mybatis基礎: #{…} 和 ${…} 的區別?

a)mybatis將 #{…} 解釋為jdbc prepared statement 的一個參數標記。?
而將 ${…} 解釋為字符串替換。?
比如,我們不能在表名(table name)的位置使用參數標記。?
b)假設有下面的代碼:?
01.map<string, object> parms = new hashmap<string, object>();?
02.parms.put(“table”, “foo”); // 表名?
03.parms.put(“criteria”, 37); // 查詢過濾條件?
04.list<object> rows = mapper.generalselect(parms);

01.<select id=”generalselect” parametertype=”map”>?
02. select * from ${table} where col1 = #{criteria}?
3. 03.</select> mybatis生成的sql語句(prepared statement)

如下所示: 01.select * from foo where col1 = ??
重要提示: 請注意,使用$ {…} (字符串替換)時可能會有sql注入攻擊的風險。?
另外,字符串替換在處理復雜類型也可能常常發生問題,如日期類型。

由于這些因素,我們建議您盡可能地使用 #{…} 這種方式。

總結

以上是生活随笔為你收集整理的mybatis常见问题处理:批量操作,传递多个参数,like语句写法等等的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。