`
luoyu-ds
  • 浏览: 138301 次
  • 性别: 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动态调用表名和字段名的解决方法

    本文将深入探讨如何在Mybatis中实现动态调用表名和字段名。 首先,了解Mybatis中两种参数占位符的区别:`#{}`和`${}`。`#{}`被解析为预编译语句(PreparedStatement)的参数标记符,比如`#{name}`会被解析为`?`,这...

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

    `getParamValue` 方法用于从元对象中获取 `关键字段名` 的值,这里替换为实际的字段名,然后将其添加到表名后面,形成动态表名。 例如,如果执行的 SQL 是针对 `table1`,并且传入的对象中有 `code` 字段,那么...

    MyBatis动态条件通用查询

    Map可以存储键值对,其中键(key)对应于数据库表中的字段名,值(value)则为该字段的查询条件。例如,如果Map包含键`name`和对应的值`John`,那么在生成的SQL语句中,将会包含`name = 'John'`这一条件。 动态SQL...

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

    在循环中,我们通过遍历`dataMap`的key来构造动态的字段名,这将在MyBatis的映射文件中使用。 ```java // 构建动态字段 for (String key : dataMap.keySet()) { lineColumn += key + ","; } // 添加id字段,假设id...

    Mybatis现学现用

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

    美元符实现 动态传入表名称,修改共有字段方法

    然而,当需要动态传入表名或列名时,由于这些通常是字符串常量,不能使用预编译,因此此时就需要使用美元符($)。例如,动态查询多个表的共有字段,可以写成`update ${tableName} set commonField = 'newValue'`,...

    mybatisPlugin2.92

    3. 自动完成:在编写SQL时,插件提供代码补全功能,可以根据已有的表名、字段名等自动填充,减少手动输入的时间。 4. 参数校验:插件可以对传入的参数进行检查,防止因参数为空或错误导致的异常,提高代码的健壮性...

    mybatis-3.4.2

    这些XML映射文件中包含了与数据库交互的详细信息,如表名、字段名以及参数和结果映射。 2. **注解映射**:除了XML,MyBatis也支持注解方式来定义SQL语句,使得代码更加简洁,减少了XML配置文件的使用。 3. **动态...

    mybatis笔记

    - 当查询结果字段名与 Java POJO 类属性名不一致时,需要使用 `&lt;resultMap&gt;` 显式指定映射关系。 #### 十一、动态 SQL - **MyBatis 支持的动态 SQL 元素**: - ****:条件判断。 - **&lt;choose&gt; / &lt;when&gt; / **:...

    mybatis的generator工具

    在配置文件中,我们还可以定制生成的代码模板,包括Java类的注释、字段名的转换规则等。通过修改`&lt;javaClientGenerator&gt;`、`&lt;javaModelGenerator&gt;`和`&lt;sqlMapGenerator&gt;`的属性,可以自定义生成的代码风格。 生成...

    Mybatis3.0.6生成器小Demo

    5. **动态SQL支持**:Mybatis Generator不仅生成基本的CRUD操作,还支持动态SQL,如if标签、choose标签(when/otherwise)、trim标签等,这些在生成的XML文件中可以根据条件生成不同的SQL片段。 通过Mybatis ...

    mybatis-plus代码生成器

    3. **生成逻辑**:在执行代码生成时,MyBatis-Plus会根据数据库中的表信息,如表名、字段名、字段类型等,生成相应的Java代码。对于每个字段,它还会自动添加注解,如`@TableId`、`@TableField`等,以便于MyBatis-...

    mybatis实体对象生成(代码生成器).zip

    同时,你可以通过标签对特定列的属性进行自定义,比如字段名转换、是否为主键等。 接下来,运行“gen.bat”脚本。这是一个批处理文件,通常包含调用MBG命令行工具的指令,传入配置文件路径和生成代码的参数。执行这...

    mybatis自动生成代码分页功能 mysql 数据库

    在IT行业中,MyBatis作为一个流行的Java持久层框架,提供了强大的数据访问能力。它允许开发者通过简单的XML或注解方式来映射SQL语句,从而实现了数据库操作的灵活性。本篇将聚焦于MyBatis的代码自动生成和分页功能,...

    mybatis逆向工程

    Mybatis逆向工程是一种自动化工具,它可以帮助开发者快速生成基于Mybatis框架的Mapper接口、实体类和对应的mapper.xml文件,从而极大地提高了开发效率。在Java开发中,Mybatis是一个轻量级的持久层框架,它提供了...

    Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式.pdf

    在Mybatis排序时,使用#{param}的方式进行动态排序,而不是${param},因为在排序字段上使用$容易导致SQL注入。 综上所述,在实际开发中,为了保证SQL的安全性,推荐使用#{}进行参数绑定。而在某些需要直接传递...

    浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    即使传入的是字段名`id`,也会被转义为`order by "id"`。这种处理方式使得MyBatis能够自动进行预编译,有效地防止SQL注入攻击。因为预编译的SQL语句在执行时,会将参数作为变量处理,而不是作为SQL的一部分,从而...

    浅谈Mybatis #和$区别以及原理

    #号用于参数,$号用于表名和字段名参数。Mybatis会将这些占位符处理成SQL语句,并交给PreparedStatement来执行。 源码分析 在源码中,我们可以看到,Mybatis的执行入口是DefaultSqlSession.selectOne()方法。我们...

    MyBatis中#号与美元符号的区别

    在MyBatis框架中,#号和美元符号($)在动态SQL中的使用有着显著的区别,这些差异直接影响到SQL语句的预编译、类型匹配以及安全性。 首先,#{}是MyBatis的预编译占位符。当使用#{变量名}时,MyBatis会进行预编译处理...

    mybatisDay1

    同时,MyBatis还支持拼接符如`#{}`,它不仅可以防止SQL注入,还能提供字段名和表名的自动转义。 2. Insert语句自增主键返回值: 当表中的主键是自增类型时,MyBatis提供了获取插入后自增主键值的方法。通过在`...

Global site tag (gtag.js) - Google Analytics