转载:http://luoyu-ds.iteye.com/blog/1517607

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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

MyBatis,动态传入表名,字段名的解决办法的更多相关文章

  1. [转]MyBatis动态传入表名、字段名参数的解决办法

    一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字段不让用户查询到.这 ...

  2. MyBatis动态传入表名,字段名参数的解决办法---statementType用法

    statementType="STATEMENT" 要实现动态传入表名.列名,需要做如下修改 添加属性statementType="STATEMENT" 同时s ...

  3. MyBatis动态传入表名,字段名参数的解决办法

    原文:http://blog.csdn.net/xichenguan/article/details/50393748 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=& ...

  4. mybatis动态传入表名、列名

    原文:http://luoyu-ds.iteye.com/blog/1517607 要实现动态传入表名.列名,需要做如下修改 添加属性statementType=”STATEMENT” (可省略) 同 ...

  5. MyBatis动态传入表名

    mybatis里#{}与${}的用法: 在动态sql解析过程,#{}与${}的效果是不一样的: #{ } 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符. 如以下 ...

  6. Mybatis中实体类中的字段跟对应表的字段不一致时解决办法

    解决字段名与实体类属性名不相同的冲突 实体类字段: public class Order { private int id; private String orderNo; private float ...

  7. mybatis动态调用表名和字段名

    以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...

  8. 【死磕jeesite源码】mybatis动态调用表名和字段名

    本文转载自夏雪冬日 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用功能.今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,如某张表的某些字 ...

  9. KO ------- 表中字段名和实体类属性名不一致

    -----------------------siwuxie095 KO ------- 表中字段名和实体类属性名不一致 如果数据库表中的字段名和实体类的属性名不一致,那么在查询时, 相应字段的结果就 ...

随机推荐

  1. sublime3 注册码

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F6 ...

  2. [大牛翻译系列]Hadoop(19)MapReduce 文件处理:基于压缩的高效存储(二)

    5.2 基于压缩的高效存储(续) (仅包括技术27) 技术27 在MapReduce,Hive和Pig中使用可分块的LZOP 如果一个文本文件即使经过压缩后仍然比HDFS的块的大小要大,就需要考虑选择 ...

  3. Redis源码研究--双向链表

    之前看的内容,占个位子,以后补上. ----------8月4日--------------- 双向链表这部分看的比较爽,代码写的中规中矩,心里窃喜,跟之前学的<数据结构>这本书中差不多. ...

  4. Oracle bbed 实用示例-----File Header Reset

    一.查看当前环境 1.1 当前控制文件中的SCN号 [oracle@ora10 ~]$ sqlplus /nolog SQL :: Copyright (c) , , Oracle. All righ ...

  5. javascript 数组排序之 sort()

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  6. php新手:XAMMP打开开源php代码

    1.启动XAMPP 打开XAMPP启动 Apache 和 MySql 如果发现默认的80端口被IIS占用了 请参考 这个  如何改变apache被占用的端口 2.将源代码复制到 磁盘(XAMPP安装目 ...

  7. 查看表空间信息SQL集合

    1.查看表空间的名称及大小 SELECT t.tablespace_name as "表空间名", )), ) AS "所占物理空间M" FROM dba_ta ...

  8. Android修改system只读权限

    在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...

  9. Entity Framework4.0 (六) EF4的 增加、删除、更改

    前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...

  10. textview点击后selector的pressed无效果

    原因: 需要配置  android:clickable="true" 这个跟开发环境有关,我之前用的android studio 就不需要这一项,默认可以点击. ********* ...