一、MyBatis之java.lang.UnsupportedOperationException异常解决方案
原因就在于resultType代表的是List中的元素类型,而不应该是List本身,究其原因就在于被dao中的方法声明
切记:resultType返回的是集合中的元素类型,而不是集合本身
二、mybatis模糊查询出现“索引 1 超出范围”
在mapper文件中,把入参的 #{xxx},换成${xxx}
三、Mybatis异常There is no getter for property named 'XXX' in 'class java.lang.String'
1.当入参为 string类型时 (包括java.lang.String.)
我们使用#{xxx}引入参数.会抛异常There is no getter for property named 'XXX' in 'class java.lang.String'
2.解决方法一:把#{xxx}修改为 #{_parameter} 即可
3.解决方法二:可以在方法中提前定义:
public int methodName(@Param(value="state") String state ){
..
}
4.原因:Mybatis默认采用OGNL解析参数,所以会自动采用对象树的形式取 string.xxx 值,如果没在在方法中定义,则会抛异常报错。
四、分页查询的写法
根据输入的key 查询
mapper文件里面的写法:
<select id="searchFile" resultType="com.alibaba.fastjson.JSONObject">
select top ${pageSize}
<include refid="Base_Column_List"/>
from lyg_file
where name like '%${key}%'
and type = 'file'
AND id not in (SELECT top ${begin} id from lyg_file where parentId = #{parentId,jdbcType=INTEGER}
AND type = 'file' ORDER BY createTime DESC)
ORDER BY createTime DESC;
</select>
五 批量查询的写法
xml的方式
1、如果是一个参数的时:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
TestDAO.getItermByList(list);
//DAO的接口:
//public List<HashMap<String,String>> getItermByList(List<Integer> list)
xml中的sql:
<select id="getItermByList" resultType="java.util.HashMap">
SELECT id,display_name as name from t_recommendation_info where id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
2、如果是一个map多个参数的时候:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
HashMap<String,Object> parames = new HashMap<String,Object>();
parames.put("mapList",list);
TestDAO.getItermByList(parames);
//DAO接口:
//public List<HashMap<String,String>> getItermByList(HashMap<String,Object> parames);
xml中的sql:
<select id="getItermByList" resultType="java.util.HashMap">
SELECT id,display_name as name from t_recommendation_info where id in
<foreach item="item" index="index" collection="mapList"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
注意collection给的值
3、如果是一个对象:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//TestModel 的实现
public class TestModel {
private List<Integer> searchList;
public List<Integer> getSearchList() {
return searchList;
}
public void setSearchList(List<Integer> searchList) {
this.searchList = searchList;
}
}
TestModel tm = new TestModel();
tm.setSearchList(list);
TestDAO.getItermByList(tm)
//DAO接口:
//public List<HashMap<String,String>> getItermByList(TestModel parames);
//XML中的sql:
<select id="getItermByList" resultType="java.util.HashMap">
SELECT id,display_name as name from t_recommendation_info where id in
<foreach item="item" index="index" collection="searchList"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
注意collection中的参数和对象的变量是一样的。
注解的方式:
@Select({
"<script>"
+ "SELECT "
+ "orders.orderId, product_sku.productId, product_sku.skuName, "
+ "orders.number, orders.orderPrice,product_sku.skuPrice, "
+ "orders.orderCreate, customer.mobile, shop_keeper.mobile1 as shopKeeperMobile, "
+ "shop.name, orders.shopId, shop.address, shop.cityCode "
+ "FROM orders, product_sku, customer, shop, shop_keeper "
+ "WHERE orders.skuId=product_sku.skuId "
+ "AND orders.customerId = customer.customerId "
+ "<if test='orderStatus != null'>"
+ "AND orders.orderStatus IN "
+ "<foreach item='status' index='index' collection='orderStatus' open='(' separator=',' close=')'>"
+ "#{status} "
+ "</foreach>"
+ "</if>"
+ "AND orders.shopId = shop.shopId "
+ "AND orders.shopId = shop_keeper.shopId "
+ "ORDER BY customer.mobile DESC, orders.shopId DESC ,orders.orderCreate DESC"
+ "</script>"
})
List<Map<String, Object>> selectOrders(@Param(value="orderStatus")List<Short> orderStatus);
@Update({
"<script>"
+ "UPDATE orders SET orderStatus = #{orderStatus} WHERE orderId in "
+ "<foreach item='item' index='index' collection='orderId' open='(' separator=',' close=')'>"
+ "#{item}"
+ "</foreach>"
+"</script>"
})
int updateOrderStatus(@Param("orderStatus") Short orderStatus,@Param("orderId") String[] orderList);
属性说明:
collection: 指定要遍历的集合(三种情况 list,array,map) !!!!在这种使用注解sql的情况下,这里请填写mapper方法中集合的名称
item:将当前遍历出的元素赋值给指定的变量 (相当于for循环中的i)
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是index就是索引,item就是当前值
#{变量名}就能取出变量的值也就是当前遍历出的元素
来源:https://blog.csdn.net/liyantianmin/article/details/50516076
https://blog.csdn.net/weixin_39923425/article/details/79373573