1. 程式人生 > >mybatis動態表名遇見There is no getter for property named 'tableName' in 'class java.lang.String'

mybatis動態表名遇見There is no getter for property named 'tableName' in 'class java.lang.String'

(1)首先mybatis實現動態表名的sql語句

<select id="getData" resultType="java.util.HashMap" parameterType="String">
        select * from ${tableName} order by Data_Index Desc limit 0,1
    </select>

mvc控制器中傳入sql的表名,從而實現查詢不同表裡的資料。
(2)卻不想,半路掉鏈子了

org.mybatis.spring.MyBatisSystemException: nested exception is
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'tableName' in 'class java.lang.String' at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446
) at com.sun.proxy.$Proxy15.selectOne(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:82) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy16.getData(Unknown Source) at
TestCase.test.test(test.java:37)

There is no getter for property named ‘tableName’ in ‘class java.lang.String’,意思就是String類沒有名為’tableName’的屬性

(3)原因:
Mybatis預設採用ONGL解析引數,所以會自動採用物件樹的形式取string.tableName值,引起報錯。

(4)解決辦法:
再dao層介面中給相應的方法加上引數說明,如下:

這裡寫圖片描述

mybatis對映檔案的sql語句,如下:

這裡寫圖片描述
注意:mybatis中載入sql語句可以分為預編譯和非預編譯,預設預編譯,而 statementType=”STATEMENT”為非預編譯,同時也必須使用${}來獲取傳入的引數值。

Mybatis動態傳入tableName–非預編譯(STATEMENT)

4)執行結果,如下:
測試程式:
package TestCase;

import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import dao.UserMapper;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:spring/ApplicationContext.xml")//,"classpath:mapper/mapper.xml
public class test {
    @Autowired
    UserMapper userMapper;
    @Test
    public void test(){
        try {

            Map<String, Object> paraMap = userMapper.getParametersByModelId(1);
            for(Object key:paraMap.keySet()){
                System.out.println(key+":::"+paraMap.get(key));
            }
            String tableName = (String)paraMap.get("para_url");
            System.out.println("**************"+tableName+"**************************");


            Map<String, Object> dataMap = userMapper.getData(tableName);

            for(Object key:dataMap.keySet()){
                System.out.println("key="+key+",value="+dataMap.get(key));
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

控制檯結果:
這裡寫圖片描述