Mybatis动态传入字段名、表名
以下以字段名为例,此功能是用以实现传入数据库中的字段名和此字段名对应的值,将数据库中对应的记录都取出来
在Dao中
map = new ConcurrentHashMap<String,String>();
map.put("zdm",zdm);//
zdm代表的是数据库中字段的名称:如v_dwid
map.put("value",value);//
value代表的是数据库中zdm所代表字段的值,如v_dwid对应的值
list = this.getSqlSession().selectList("Business.selectDwxx",map);
对应的配置文件中的写法
<!-- 查询单位信息 -->
<select id="selectDwxx" parameterType="Map" resultMap="dwxxBean" resultType="List"
statementType="STATEMENT">
select v_dwid,v_dwjc,v_dwqc from xt_dwb where
${zdm} = ${value}
</select>
注意:配置文件这里有一个属性statementType=”STATEMENT”,而且where后面只能${zdm} = ${value},不能写成#{zdm} = #{value}
第一步先介绍statementType:
这个属性有3个值,分别是STATEMENT,PREPARED和CALLABLE,这3个值对应的分别就是statement(非预编译的),preparedstatement(预编译的),和CallableStatement
下面请参阅了解statement和preparedstatement的区别
http://wenku.baidu.com/view/ccb9da020740be1e650e9abc.html
如果你要动态传入字段名,表名之类的如果你的sql执行是预编译的,这显然
是不行的,所以你必须改成非预编译的,也就是这样:
所以这里的必须写成
<select id="selectDwxx" parameterType="Map" resultMap="dwxxBean" resultType="List" statementType="STATEMENT">
如果不写statementType="STATEMENT"默认就会是预编译的
statementType="PREPARED"
第二步介绍${zdm} = ${value}
这里面使用的是${},而不是#{}。在一般情况下,大家基本都是使用#{}的,所以呢说下这两个的区别
${} 为原样输出,你传什么,sql里就填入什么。比如有引号它也会原样填到sql里。
#{} 会使用 PreparedStatement,变量处用 ? 代替。
例如value=’你好’,则${value}在SQL语句中就是’你好’,但是在#{value}中就是会将’你好’转换成?传入已经预编译过的SQL语句中
上面如果将where后面的${zdm} = ${value}
写成${zdm} = #{value}或者#{zdm} = #{value},#{zdm} = ${value},都会出现异常
对于${zdm} = #{value}异常为
SQL:select v_dwid,v_dwjc,v_dwqc where v_dwid = ?
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
以上就能实现动态传入字段名,可是上面的方法因为使用的是非预编译的方法,所以如果操作频繁的话,会使得操作数据库效率较低,而且不是较为安全。
分享到:
相关推荐
注意,由于使用了`${}`,你需要确保传入的表名和字段名是安全的,并且在传入字段名时,如果它是字符串,记得在传入参数前加上单引号,以避免SQL注入问题,例如`String columnName = "'" + columnName + "'"`。...
在循环中,我们通过遍历`dataMap`的key来构造动态的字段名,这将在MyBatis的映射文件中使用。 ```java // 构建动态字段 for (String key : dataMap.keySet()) { lineColumn += key + ","; } // 添加id字段,假设id...
`getParamValue` 方法用于从元对象中获取 `关键字段名` 的值,这里替换为实际的字段名,然后将其添加到表名后面,形成动态表名。 例如,如果执行的 SQL 是针对 `table1`,并且传入的对象中有 `code` 字段,那么...
Map可以存储键值对,其中键(key)对应于数据库表中的字段名,值(value)则为该字段的查询条件。例如,如果Map包含键`name`和对应的值`John`,那么在生成的SQL语句中,将会包含`name = 'John'`这一条件。 动态SQL...
5.$方式一般用于传入数据库对象,例如传入表名. 6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句...
然而,当需要动态传入表名或列名时,由于这些通常是字符串常量,不能使用预编译,因此此时就需要使用美元符($)。例如,动态查询多个表的共有字段,可以写成`update ${tableName} set commonField = 'newValue'`,...
3. 自动完成:在编写SQL时,插件提供代码补全功能,可以根据已有的表名、字段名等自动填充,减少手动输入的时间。 4. 参数校验:插件可以对传入的参数进行检查,防止因参数为空或错误导致的异常,提高代码的健壮性...
这些XML映射文件中包含了与数据库交互的详细信息,如表名、字段名以及参数和结果映射。 2. **注解映射**:除了XML,MyBatis也支持注解方式来定义SQL语句,使得代码更加简洁,减少了XML配置文件的使用。 3. **动态...
在配置文件中,我们还可以定制生成的代码模板,包括Java类的注释、字段名的转换规则等。通过修改`<javaClientGenerator>`、`<javaModelGenerator>`和`<sqlMapGenerator>`的属性,可以自定义生成的代码风格。 生成...
- 当查询结果字段名与 Java POJO 类属性名不一致时,需要使用 `<resultMap>` 显式指定映射关系。 #### 十一、动态 SQL - **MyBatis 支持的动态 SQL 元素**: - ****:条件判断。 - **<choose> / <when> / **:...
5. **动态SQL支持**:Mybatis Generator不仅生成基本的CRUD操作,还支持动态SQL,如if标签、choose标签(when/otherwise)、trim标签等,这些在生成的XML文件中可以根据条件生成不同的SQL片段。 通过Mybatis ...
同时,你可以通过标签对特定列的属性进行自定义,比如字段名转换、是否为主键等。 接下来,运行“gen.bat”脚本。这是一个批处理文件,通常包含调用MBG命令行工具的指令,传入配置文件路径和生成代码的参数。执行这...
3. **生成逻辑**:在执行代码生成时,MyBatis-Plus会根据数据库中的表信息,如表名、字段名、字段类型等,生成相应的Java代码。对于每个字段,它还会自动添加注解,如`@TableId`、`@TableField`等,以便于MyBatis-...
使用MBG时,我们需要配置一个XML文件,指定数据库连接信息、表名以及生成的代码样式。一旦配置完成,只需运行生成器,就可以得到与数据库表对应的实体类、Mapper接口和XML文件,减少手动编写这些基础代码的工作量。 ...
Mybatis逆向工程是一种自动化工具,它可以帮助开发者快速生成基于Mybatis框架的Mapper接口、实体类和对应的mapper.xml文件,从而极大地提高了开发效率。在Java开发中,Mybatis是一个轻量级的持久层框架,它提供了...
在Mybatis排序时,使用#{param}的方式进行动态排序,而不是${param},因为在排序字段上使用$容易导致SQL注入。 综上所述,在实际开发中,为了保证SQL的安全性,推荐使用#{}进行参数绑定。而在某些需要直接传递...
即使传入的是字段名`id`,也会被转义为`order by "id"`。这种处理方式使得MyBatis能够自动进行预编译,有效地防止SQL注入攻击。因为预编译的SQL语句在执行时,会将参数作为变量处理,而不是作为SQL的一部分,从而...
#号用于参数,$号用于表名和字段名参数。Mybatis会将这些占位符处理成SQL语句,并交给PreparedStatement来执行。 源码分析 在源码中,我们可以看到,Mybatis的执行入口是DefaultSqlSession.selectOne()方法。我们...
因此,使用${}的方式应当谨慎,通常只适用于传入数据库对象,如表名等静态信息。 MyBatis的SQL语句是由开发者手工编写的,这就需要我们关注SQL注入的问题。在定义Mapper时,我们可以指定输入参数类型...
同时,MyBatis还支持拼接符如`#{}`,它不仅可以防止SQL注入,还能提供字段名和表名的自动转义。 2. Insert语句自增主键返回值: 当表中的主键是自增类型时,MyBatis提供了获取插入后自增主键值的方法。通过在`...