zoukankan      html  css  js  c++  java
  • Mybatis${}、#{}及使用#{}时指定jdbcType

    一、Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}

    我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这种方式SQL语句是经过预编译的,它是把#{}中间的参数转义成字符串,举个例子:

      select * from student where student_name = #{name} 

    预编译后,会动态解析成一个参数标记符?:

      select * from student where student_name = ?

    而使用${}在动态解析时候,会传入参数字符串

      select * from student where student_name = 'lyrics'

    #{}方式能够很大程度防止sql注入,$方式无法防止Sql注入。$方式一般用于传入数据库对象,例如传入表名或自己拼字符串.,一般能用#的就别用$。

    举个例子:
      select * from ${prefix}ACT_HI_PROCINST where PROC_INST_ID_ = #{processInstanceId}
      hotfolder_name LIKE '%${searchValue}%'

    二、MyBatis 使用${}插入空值时,需要指定JdbcType 

      mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换,在执行SQL时MyBatis会自动通过对象中的属性给SQL中参数赋值,它会自动将Java类型转换成数据库的类型。而一旦传入的是null它就无法准确判断这个类型应该是什么,就有可能将类型转换错误,从而报错。要解决这个问题,需要针对这些可能为空的字段,手动指定其转换时用到的类型。一般情况下,我们没有必要按个字段去识别/判断它是否可以为空,而是将所有的字段都当做可以为空,全部手动设置转换类型。

    <insert id="save"
      parameterType="com.tarena.entity.Cost">
      insert into cost values(
      cost_seq.nextval,
      #{name,jdbcType=VARCHAR},
      #{base_duration,jdbcType=INTEGER},
      #{base_cost,jdbcType=DOUBLE},
      ...
      )
    </insert>

    写成这样就可以了,而不必写成大量
    <if test="name != null">
      #{name}
    </if>
    ...
     
  • 相关阅读:
    基于ZKEACMS的.Net Core多租户CMS建站系统
    使用PowerShell自动部署ASP.NetCore程序到IIS
    在Linux安装ASP.Net Core的运行时(Runtime)
    ASP .Net Core 2.0 修改默认端口
    .Net Core内存回收模式及性能测试对比
    .Net Core配置与自动更新
    Razor TagHelper实现Markdown转HTML
    用Docker自动构建纸壳CMS
    纸壳CMS 2.3,正式加入商城功能
    Linux使用私钥公钥(Public key)登录
  • 原文地址:https://www.cnblogs.com/guanghe/p/9317476.html
Copyright © 2011-2022 走看看