Mybatis中${param}与#{param}的区别说明

目录
  • ${param}与#{param}的区别
  • Mybatis中#{}与${}使用总结
    • #{ }与${ }的区别
    • 使用总结

${param}与#{param}的区别

${param}表达式主要用户获取配置文件数据,DAO接口中的参数信息,当 $ 出现在映射文件的 SQl 语句中时创建的不是预编译的 SQL ,而是字符串的拼接有可能会导致 SQL 注入的问题,所以一般使用 $ 接收 DAO 参数时,这些参数一般是字段名,表名等.例如 order by {column}

#{param} 表达式主要是用户获取 DAO 中的参数数据,在映射文件的SQL 语句中出现 #{} 表达式,底层会创建预编译的 SQL .性能会相对较好

${} 获取 DAO 参数数据时,参数必须使用 @param 注解进行修饰

#{} 获取 DAO 参数数据时,假如参数个数多于一个,可有选择的使用@param

Mybatis中#{}与${}使用总结

#{ }与${ }的区别

1、#{ }将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 如:

delete from user where name= #{name}

实际相当于一个占位符:

delete from user where name= ?

如果传入的值是123,那么解析成sql时的值为 delete from user where name= 123, 如果传入的值是字符串 Rose,则解析成的sql为delete from user where name= 'Rose'

2、${ }将传入的数据直接显示生成在sql中,即原样拼接。对于

delete from user where name= ${name}

如果传入的值int类型的123,那么解析成sql时的值为

delete from user where name= 123

如果传入的值是字符串Rose,则解析成的sql为

delete from user where name= Rose

这样就是错误的,必须将原来的语句改为

delete from user where name= '${name}'

3、#方式能够防止sql注入;$方式无法防止Sql注入

$方式一般用于传入数据库对象,例如传入表名

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值。这样做很安全,很迅速也是首选做法,有时只是想直接在SQL语句中插入一个不改变的字符串,可以使用${ }。

使用总结

1、#{ }:多用于传递查询的参数;一般用在用户输入值的地方,在sql中:字段 比较符号(=、>、<、!=、<>) #{用户输入的值};

  • 如果传递参数是基本类型(非字符类型),获取参数是原样获取, 如果是字符串,#{}获取时会自动给加一个引号。
  • 对于基本类型和String类型可以在#{ }内任意填写,一半填写对应值。

2、${ }:一般用于传入数据库对象,例如传入表名,如:$(表名);一般用于order by的后面,如:order by $(字段);表名作为变量时,必须使用 ${ };用在我们能够确定值的地方,也就是我们程序员自己赋值的地方;

  • 如果传递是基本类型的阐述,int,String等等。${}只能写value,如${value}

3、如果传递参数是对象:#{}和${}都是ognl表达式来获取 (对象导航语言 属性.属性.属性)

  • 如:
<update id="updateUserByID" parameterType="domain.User">
 update user set username=#{username},sex=#{sex},birthday=#{birthday} where id=#{id}
</update>
  • #{}内的内容必须是User对应的属性值。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    1.#{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 "4,44,514"就会变成" '4,44,514' ": 2.是字符串替换,在处理是字符串替换,MyBatis在处理时,它会将sql中的{}是字符串替换,在处理{ }是字符串替换, MyBatis在处理{ }时,它会将sql中的是字符串替换,在处理是字符串替换,MyB

  • Mybatis中@Param的用法和作用详解

    用注解来简化xml配置的时候,@Param注解的作用是给参数命名,参数命名后就能根据名字得到参数值,正确的将参数传入sql语句中 我们先来看Mapper接口中的@Select方法 package Mapper; public interface Mapper { @Select("select s_id id,s_name name,class_id classid from student where s_name= #{aaaa} and class_id = #{bbbb}")

  • mybatis中${}和#{}取值的区别分析

    mybatis作为一个轻量级的ORM框架,应用广泛,其上手使用也比较简单:一个成熟的框架,必然有精巧的设计,值得学习. 在使用mybatis框架时,在sql语句中获取传入的参数有如下两种方式: ${paramName} #{paramName} 那如何理解这两种传参方式呢?如下带你走近背后的奥义. 先来回顾下原生Jdbc查询: public static void main(String[] args) throws Exception { // sql语句 String sql = "sele

  • Mybatis中@Param注解的作用说明

    目录 @Param注解的作用说明 1.关于@Param 2.原始的方法 3.使用@Param @Param注解和参数使用 1.使用@Param注解 2.不使用@Param注解 @Param注解的作用说明 1.关于@Param @Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳. 2.原始的方法 当只有一个参数时,没什么好说的

  • Mybatis中${param}与#{param}的区别说明

    目录 ${param}与#{param}的区别 Mybatis中#{}与${}使用总结 #{ }与${ }的区别 使用总结 ${param}与#{param}的区别 ${param}表达式主要用户获取配置文件数据,DAO接口中的参数信息,当 $ 出现在映射文件的 SQl 语句中时创建的不是预编译的 SQL ,而是字符串的拼接有可能会导致 SQL 注入的问题,所以一般使用 $ 接收 DAO 参数时,这些参数一般是字段名,表名等.例如 order by {column} #{param} 表达式主要

  • MybatisPlus #{param}和${param}的用法详解

    作用 mybatis-plus接口mapper方法中的注解(如@Select)或者xml(如)传入的参数是通过#{param}或者${param}来获取值. 区别 1.解析方式: #{param}:会进行预编译,而且进行类型匹配,最后进行变量替换,括号中可以添加映射类型如 #{param,javaType=int,jdbcType=NUMERIC} ${param}:只实现字符串拼接,并不进行数据类型匹配 ${param}表达式主要用户获取配置文件数据,DAO接口中的参数信息,当 $ 出现在映射

  • Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • MyBatis中resultMap和resultType的区别详解

    总结 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功.(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系.(高级映射,字段名称可以不一致,通过映射来实现 resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些

  • MyBatis插入Insert、InsertSelective的区别及使用心得

    目录 逆向自动生成的mybatis对应配置Mapper文件里面,有两个方法,分别为insert和insertSelective.这两个方法均是插入对象的方法.为什么会有两个插入方法呢?这里说一下两者的区别. 首先我们看代码如下: insert方法 <insert id="insert" parameterType="demo.pojo.domain.HspMediaInf" > insert into MEDIA_INF (MED_SEQ, EMG_SE

  • Mybatis中<if>和<choose>的区别及“=”判断方式

    目录 <if>和<choose>的区别及“=”判断 正确很好的写法需要引入<choose>标签 <!--错误的写法--> Mybatis选择choose和条件if用法 choose用法 if用法 <if>和<choose>的区别及“=”判断 在项目中xml文件经常会遇到在判断等于某个值时加什么条件不等于某个值的时候加什么条件 比如下面这个例子: <if  test=" name != null">   

  • 解决Mybatis的@Param()注解导致分页失效的问题

    @Param注解导致分页失效-分页拦截器 问题描述 在使用mybatis分页时,使用@Param注解传入了两个对象,分页失效,查询出的总是全部的数据. 出现问题时,分页策略为:分页拦截器实现的分页 [错误写法] service写法: public Page<Entity> getByNidAndEntity(Page<Entity> page,String nid,Entity entity){ entity.setPage(page); page.setList(dao.getB

  • MyBatis @Param注解的实现

    先说结论: 当输入参数只有一个且没有使用@Param注解时,MyBatis会直接传递这个参数:当输入参数多于一个,或者使用了@Param注解时,MyBatis会将参数封装在Map中传递,这时的Map的key分为以下几种可能: Map中会有param1, param2这样的key,其顺序对应输入参数的顺序.无论是否有@Param注解. 对于@Param注解的参数,Map中会保存注解中给定的名字作为key 对于没有用@Param注解的参数,Map中会用1.2.3 ..这样的数字作为key,按顺序保存

随机推荐