zoukankan      html  css  js  c++  java
  • MyBatis 参数传递小知识(划重点)|划掉 MyBatis 常见小debug

    #{} OR ${}

    MyBatis书写数据库操作接口实现时我们总是不可避免的使用到参数的传递。本人在日常工作中最常接触到的传参方式是#{xxx}。

    我们通过向#{xxx}传递参数实现完成的SQL语句的参数传递,从而实现对数据库的相应操作.我们举个例子:

        <select id="findById" resultMap="baseResultMap">
            SELECT <include refid="sqlColumns" />
              FROM resources
             WHERE resource_id = #{id}
        </select>

    对应的数据库接口将绑定好的参数id传递到SQL语句中,在调用的时候执行相应的操作,获得结果。

    #{xxx}会在参数传递时一律将传递的结果当做字符串来进行解析,所以当上面的#{id}传递参数进来会被相应的解析为:

            SELECT *
              FROM resources
             WHERE resource_id = '传参'

    所以我们在使用#{xxx}进行传参的时候要注意参数中不能存在单引号否则会报错,同时字符串解析也会在一定程度上防止SQL注入的发生。

    还有一种传参的方式是${xxx}

    这种传参与#{xxx}的传参不同,让我们用实例来讲解

            SELECT *
              FROM resources
             WHERE resource_id = ${id}

    传参之后

            SELECT *
              FROM resources
             WHERE resource_id = 传参

    由实例我们可以清楚的得知使用${xxx}传参并不会将传递数据进行字符串解析,这意味着SQL注入的风险(当然在传递参数的时候我们可以自己提前解析一遍参数内容,以防范SQL注入等风险)但是这并不意味着这种传参毫无意义,恰恰相反我们可以用这种参数传递的方式传递一些表名亦或者是字段名。比如:

            SELECT *
              FROM resources
             WHERE resource_id = #{id}
            ORDER BY ${name} DESC

    传值之后:

            SELECT *
              FROM resources
             WHERE resource_id = '参数一'
            ORDER BY 参数二 DESC

    # OR $

    $符是直接拼成sql的 ,#符则会以字符串的形式 与sql进行拼接。

    ----------------------------------------------------------------------------------------------------------------------------------------------------

                      常见bug&常见代码处理细节

    ----------------------------------------------------------------------------------------------------------------------------------------------------

    1、mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串''进行对比判断则会引发异常. 所以在上面的代码中去该该判断, 只保留非空判断就正常了

    报错现场

    控制台截图:Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util

     代 码 场 景:<if test="inspDate!=null and inspDate!=''">AND insp_date = #{inspDate}</if>

     错 误 原 因:时间参数与空字符串发生比较会包异常

     处 理 方 案:<if test="inspDate!=null">AND insp_date = #{inspDate}</if>

    2、MySql中如果发生时间比较,尽可能将时间格式转化为一致后进行比较

    DATE_FORMAT(insp_date,'%Y-%m-%d') = DATE_FORMAT(#{time},'%Y-%m-%d')

    DATE_FORMAT(insp_date,'%Y-%m') = DATE_FORMAT(#{time},'%Y-%m')

    3、Spring MVC 中 使用不确定存在参数

    方法一、String...xxx 该方法只能讲参数放置到参数列表最后面

    这种写法:可能上传的参数有、没有、或者多个参数的情况

    参数使用:xxx[?]  0到xxx整个参数长度的数据

    特点:java的特殊用法

    方法二、不加任何前缀标注

    String xx(ReviewInfo reviewInfo, ModelMap model, Integer id)

    这种写法中三个参数都不是必须存在的参数

    特点:方便

    方法三、Spring 参数注解

    public String review( ReviewInfo reviewInfo, ModelMap model,@RequestParam(value="id", required=false) Integer id) 

    绑定参数、设置为非必须参数

    特点:高端

    new:20180730-mybatis--》collection & association

    collection 的两种使用方式:链接 返回数据是List的形式

    1、

    <collection property="scores" ofType="Score" column="id" select="queryScoresBySID" ></collection>

    2、

    <collection property="scores" javaType="java.util.ArrayList" ofType="Score">
                  <id column="id" property="id" />
                  <result column="num" property="num" />
                  <association property="subject" javaType="Subject">
                       <id column="id" property="id" />
                       <result column="name" property="name" />
                  </association>
              </collection>

    association

    <association property="subject" javaType="Subject" column="subject" select="querySubjectBySubId"></association>
    痛苦预示着超脱
  • 相关阅读:
    数据解压
    子区域数据合并
    数据压缩复制
    将Win10变回Win7/WinXP界面
    通过GP加载卫星云图-雷达图-降雨预报图
    Maven版本与JDK版本
    由输入法随想
    selinux开关
    android studio 配置
    NodeJS 笔记
  • 原文地址:https://www.cnblogs.com/supperlhg/p/8793594.html
Copyright © 2011-2022 走看看