`
luoyu-ds
  • 浏览: 137310 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

MyBatis,动态传入表名,字段名的解决办法

 
阅读更多

今天做项目,遇到的问题就是需求修改数据表的记录,而且字段名都不是固定的,也就是说是需要通过参数传入的,

本来这也不是什么难题,按照平常的JDBC,或者hibernate里也都好实现,可问题是现在项目用的mybatis这个持久层框架,按照我的刚开始的想法初使sql是这样的,

当我满心欢喜的运行才发现不行,遂百度之,办法种用尽,还是不行,有人给我说需要把字段那一项换成${field},这种办法来取,试之,无果,于是我种蛋疼。

           网上查找半天发现,提出的方法大都不能用,也都差不多,我放弃了。翻了一下电脑里的mybatis文档,在一个不起眼的地方发现update标签有一个属性statementType,一看我就觉得这个属性不简单,资料解释如下:




 看到这,相信会点java的人都知道什么意思了吧
这个statement,preparedstatement,到底什么意思,我这不多做解释,实在不懂请参阅:

http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html

简单说就是一个是预编译的,一个是非预编译的。

如果你要动态传入字段名,表名之类的如果你的sql执行是预编译的,这显然 

是不行的,所以你必须改成非预编译的,也就是这样:

<update id="editIssuedData" parameterType="map" statementType="STATEMENT">

同时sql里的属有变量取值最好都改成${xxxx},而不是#{xxx}

当我改好之后,这是我的完整xml:



 你妹,还是不行,数据库报错说,


这注明一下:三班是我传给sql里变量val的值,仔细一看报的错,是不是感觉有点不一样,对了,就是不一样,是不是感觉三班这个东西少了个引号,其实就是这样的,所以最后一步,需要在java代码里做,如下:

Map<String, Object> map = new HashMap<String, Object>();
		map.put("field", Constant.ISSUED_PLAN_COLUMN_NAME.get(field));
		map.put("val", "'"+value+"'");
		map.put("id", id);

 在往map里put参数时,对应的val我在put时在参数前后加了个单引号,这样就可以了,本人已测试成功!

如果要动态传入表名,与传入字段名相同的。

我发现也有不少人遇到这个问题,这里权当参考,希望可以帮到你!

 

  • 大小: 5.2 KB
  • 大小: 21.2 KB
  • 大小: 6.4 KB
  • 大小: 4.7 KB
分享到:
评论
13 楼 FX夜归人 2016-03-03  
statementType也都是不需要的,直接加"${}"就已是非预编译的了
12 楼 阿萨姆 2014-10-11  
如果表名  也是 动态的 select 改怎么搞???、
11 楼 ivanf8e62 2014-08-29  
这种东西你要一不小心就被 SQL注入了
10 楼 青春的、脚步 2013-03-12  
zzx0421 写道
不是字段使用${},而是值使用${},所以正确的应该写法是:
update analysis_plan set #{filed}=${val} where id=${id}
当然,以上写法id为String类型,如果id为int类型,我们可以写成
update analysis_plan set #{filed}=${val} where id=#{id}

这样翻译成sql语句才会是:
update analysis_plan set A_SECTION='三班' where id='248'

 
9 楼 zzx0421 2013-03-12  
不是字段使用${},而是值使用${},所以正确的应该写法是:
update analysis_plan set #{filed}=${val} where id=${id}
当然,以上写法id为String类型,如果id为int类型,我们可以写成
update analysis_plan set #{filed}=${val} where id=#{id}

这样翻译成sql语句才会是:
update analysis_plan set A_SECTION='三班' where id='248'
8 楼 青春的、脚步 2012-12-28  
$: 直接显示当前值,不会处理的
#:当成字符串处理
7 楼 青春的、脚步 2012-12-28  
like查询没作用
6 楼 青春的、脚步 2012-12-28  
有人给我说需要把字段那一项换成${field},这种办法来取,试之,无果,于是我种蛋疼。
5 楼 yexiufei123 2012-08-24  
luoyu-ds 写道
yexiufei123 写道
zzx0421 写道
你需要理解#{}和${}参数表示法的区别

正解.

请赐教。。。



$: 直接显示当前值,不会处理的
#:当成字符串处理
4 楼 luoyu-ds 2012-08-22  
yexiufei123 写道
zzx0421 写道
你需要理解#{}和${}参数表示法的区别

正解.

请赐教。。。
3 楼 yexiufei123 2012-07-25  
zzx0421 写道
你需要理解#{}和${}参数表示法的区别

正解.
2 楼 zzx0421 2012-05-17  
你需要理解#{}和${}参数表示法的区别
1 楼 aochant 2012-05-10  
执行非预编译sql 会导致sql硬解析,如果这个语句执行的比较频繁  会导致数据库性能下降

相关推荐

    Mybatis动态调用表名和字段名的解决方法

    今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,这种情况下,就需要构建sql来动态传入表名、字段名了,下面给大家介绍mybatis动态调用表名和字段名的解决方法,一起看看吧

    mybatis-plus 表名添加前缀的实现方法

    主要介绍了mybatis-plus 表名添加前缀的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    MyBatis--解决字段名与实体类属性名不相同的冲突--源代码

    在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突,下载源代码调试、分析,学习

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    主要介绍了mybatis使用char类型字段查询oracle数据库时结果返回null问题的解决方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    mybatis拦截器修改执行sql语句

    通过mybatis拦截器将查询语句、更新语句、删除语句、插入语句中指定表明替换为另一个表名

    mybatis 动态sql及参数传递

    在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...

    MyBatis动态条件通用查询

    主要实现向mybatis传入一个表名、map集合、页数、行数,然后实现将map的key作为查询字段名,value作为相应字段值的通用分页查询操作。

    mybatis拦截器实现通用权限字段添加的方法

    主要给大家介绍了关于mybatis拦截器实现通用权限字段添加的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    Mybatis防止sql注入的实例

    本文通过实例给大家介绍了Mybatis防止sql注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    mybatis动态创建数据库表

    mybatis动态创建数据库表,支持数据库表动态创建,数据插入,数据修改

    SpringBoot+Mybatis实现数据源动态切换

    springboot实现数据源动态切换 注意事项: 1. 该demo采用yml配置数据库信息,注意url标签为jdbc-url 2.项目中加了日志输出...3.在Service中应用事务时,自定义的注解将失效,解决办法:可将注解配置到Controller方法中

    mybatis动态SQL语句

    if 、where、set、trim、choose 、foreach等在mybatis中的具体用法,有具体实例可供参考,玩转mybatis

    Mybatis现学现用

    5.$方式一般用于传入数据库对象,例如传入表名.   6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句...

    关于Myeclipse使用mybatis出现Jar包冲突的解决办法

    关于Myeclipse使用mybatis出现Jar包冲突的解决办法,这样操作之后不用每次部署都要删Jar包。(因为我们要使用Mybatis,所以使用Myeclipse里面自带的Mapper功能不全,是1.0.0版,所以我们要下最新一点的Mapper Jar包...

    mybatis动态sql上传

    mybatis动态sql批量增删改查,增强了mybatis的认识。

    mybatis plus 的动态表名的配置详解

    主要介绍了mybatis plus 的动态表名的配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    mysql表名忽略大小写配置方法详解

    下面小编就为大家带来一篇mysql表名忽略大小写配置方法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    修改mybatis-generator源码实现实体类字段上方加上数据库中填写的注释

    修改mybatis-generator源码实现生成后的实体类字段上方加上数据库中填写字段的注释,有使用方法,可以在配置文件generatorConfig.xml中根据自己的需要进行修改

    mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题

    主要介绍了mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    MyBatis动态拼接SQL

    MyBatis动态拼接SQL

Global site tag (gtag.js) - Google Analytics