首页 > 技术文章 > MyBatis 常见操作/错误

ruhuanxingyun 2019-03-25 20:33 原文

一、常用操作

  1. 批量操作

    批量操作:批量查询、批量插入、批量修改、批量删除,批量操作的效率要比for循环高很多。

    在Mybatis中批量操作最多就是批量插入和批量删除。一般采用foreach标签,但是这也与字段数量和条数有关,对于大批量的操作而言,推荐使用ExecutorType.BATCH插入方式。

    参照例如:http://www.pianshen.com/article/215691520/

 

二、常见错误

  1. 现象:MyBatis xml文件中查询的返回类型写成list或java.util.List时,执行sql时报 java.lang.UnsupportedOperationException错误。

   代码:

java:List<Long> findSignId();

xml:<select id="findSignId" resultType="java.util.List">
        select sign_id from group_manage
     </select>

   错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.UnsupportedOperationException

   解决方式:

xml:<select id="findSignId" resultType="long">
        select sign_id from group_manage
     </select>

   详解:返回类型应该是List里面的泛型,而不是List本身。

 

  2. 现象:MyBatis mapper类传递单个参数到xml中if判空,执行sql时报org.mybatis.spring.MyBatisSystemException异常。

   代码:

   错误:

   解决方式:

   详解:MyBatis 有自己的内置对象。

 

  3. 抽象业务代码

复制代码
package com.xingyunliushui.dao;

import java.util.List;

public interface BaseQueryMapper {

    <T> List<T> selectAll(T record);

    <T> T selectOne(T record);

    <T> Integer countSelect(T record);
    
}
复制代码

    调用时会报org.apache.ibatis.binding.BindingException异常,如:

复制代码
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.nsac.xingyunliushui.user.RoleMapper.selectAll
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:225)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
    at com.sun.proxy.$Proxy225.selectAll(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
复制代码

    解决办法:还是要写mapper对应的xml文件。

 

推荐阅读