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语句写法等等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis基本增删改查、缓存,延迟加
- 下一篇: JAVA面试中问及Hibernate与