mybatis动态表名遇见There is no getter for property named 'tableName' in 'class java.lang.String'

18 篇文章 0 订阅
7 篇文章 0 订阅

(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”为非预编译,同时也必须使用${}来获取传入的参数值。

参考博客:mybtis动态表名之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();
        }
    }
}

控制台结果:
这里写图片描述

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值