mybatis 动态更换表名,用以动态访问不同表的数据(#{} 、${})

1月快结束了啦~~~~~~ 时间好快~~~

首先说下使用前景:是这样的,这周有个任务,其中有个部分就是根据一个标识,去判断使用哪一张表的数据,于是就要使用动态的表名,也就是将表名当成一个参数传给mybatis。一开始,认为很简单,不就是传参吗?三下五除二,我就写了出来,结果当然是错误的。后面花了将一下午才将这个sql写出来。

首先,分享成功的代码:

1. controller代码

String table = "";		
if("0".equals(delFlag)) {
	  table= "tb_plan_result_detail";		 
  }else if("1".equals(delFlag)){
	  table= "tb_plan_result_detail_history";
}
planResultDeatil.setTable(table);
List list = planResultDeatilService.findPlanResultDetailInfo(errorTypeList.get(x));

当del_flag 为 "0" 时,使用 tb_plan_result_detail 表,当del_flag 为 "1" 时,使用 tb_plan_result_detail _history表

2.接口代码

	public List findPlanResultDetailInfo(PlanResultDeatil planResultDeatil);

3.mybatis 代码

或者

贴个图片,方便查看重点:

mybatis 动态更换表名,用以动态访问不同表的数据(#{} 、${})_第1张图片

 或者:

mybatis 动态更换表名,用以动态访问不同表的数据(#{} 、${})_第2张图片

看了上面,大家就应该要猜到我等下要说什么了,我再贴下我之前的问题代码:

错误代码一:

1.所有参数都用  #{}

错误原因:错误的关键就在于  #{table}  ,其实本质还是  #{}   和  ${} 的区别

简单理解就是  #{} 会给 你的实参加个 单引号 ,所以 表名就变成了   'tb_plan_result_detail',然后你执行sql:

SELECT a.error_detail as "errorDetail",a.only_id AS "onlyId" from  'tb_plan_result_detail' a  肯定就会出错了

所以表名 必须使用   ${table}。但是你若是 在条件参数中使用 $,就要加 单引号,因为 ${} 不会默认加个单引号,如上面的

a.tablename ='${tableName}'

 

错误代码二:

这个错误是关于 接口的,直接看代码:

public List findPlanResultDetailInfo(@Param("planResultDetail") PlanResultDeatil planResultDetail);

我加这个注解,planResultDetail , 但我 xml中,直接使用的是 planResultDetail类中它的属性,比如#{tableName},其实不使用

@Param("planResultDetail") 反而不会出错,使用了@Param("planResultDetail") ,就一定得在 xml中表明你使用的参数,不然xml无法识别它,因为你声明的是@Param("planResultDetail") ,你凭什么直接使用 #{tableName}。

正解就是  #{planResultDetail.tableName}

 

总结:

其实,这些都是非常基础的问题,但由于以习惯去认识问题,浪费了很多时间。要多总结,才能多多进步啊~

 

 

 

 

 

你可能感兴趣的:(上班,sql)