zoukankan      html  css  js  c++  java
  • MyBatis,动态传入表名,字段名的解决办法

    转载: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执行是预编译的,这显然 

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

    Xml代码  收藏代码
    1. <update id="editIssuedData" parameterType="map" statementType="STATEMENT">  

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

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



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


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

    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时在参数前后加了个单引号,这样就可以了,本人已测试成功!

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

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

  • 相关阅读:
    BZOJ_1221_ [HNOI2001]_软件开发(最小费用流,网络流24题#10)
    POJ_1269_Intersecting_Lines_(计算几何基础)
    BZOJ_2049_[Sdoi_2008]_Cave_洞穴勘测_(LCT/并查集)
    BZOJ_2002_弹飞绵羊_(LCT)
    BZOJ_3282_Tree_(LCT)
    CodeForces_#354_Div.2_2016.5.25(A+B+C)
    BZOJ_1609_[Usaco2008_Feb]_Eating_Together_麻烦的聚餐_(动态规划,LIS)
    BZOJ_1607_ [Usaco2008_Dec]_Patting_Heads_轻拍牛头_(筛数)
    BZOJ_1606_ [Usaco2008_Dec]_Hay_For_Sale _购买干草_(背包)
    2010多校第一题 hdu3440House Man 差分约束系统
  • 原文地址:https://www.cnblogs.com/wenlj/p/4701339.html
Copyright © 2011-2022 走看看