#{}与${}的语法

1.前言

通过以下代码引申到如何去使用#{}和${},以及他们的区别。

//数据库中的语法
INSERT INTO account (aname,alias_name,age) VALUES('玛莎','莎莎',20);
//jdbc中为了防止SQL注入我们使用prepareStatement 
//这种从对象中获取属性值的方式,是通过OGNL对象图表达式语言完成的。
Account account = new Account();
account.setAname("张三")
account.setAlias_name("三")
account.setAge(20)
PreparedStatement pre = connection.prepareStatement("insert into account (aname,alias_name,age) values(?,?,?)");
pre.setString(1,account.getAname());
pre.setString(2,account.getAlias_name());
pe.setString(3,account.getAge());
2.#{}与${}的区别
  • 相同点:都是参数替换
  • 不同点1:#{}会根据参数类型自动的去添加’'而${}只是替换
  • 不同点2:#{}在条件语句中where aid=#{aid}可以直接使用#{},如果是${}则会报错
    下面就具体的代码演示:
   <select id="selectOne" resultType="Account">
        select
        aid,aname,alias_name as aliasname,age
        from
        account
        where aid=${aid}
    </select>

错误信息:

Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘aid’ in ‘class java.lang.Integer’

解决方法:
${}对于int,Integer 数值类型,要求必须传递${value} ,
一旦识别${value}就直接替换,不使用OGNL

为什么说但是${}只是替换 替换什么意思呢?
AccountMapper.xml文件

    <insert id="insert">
        insert
        into
        account(aname,alias_name,age)
        values (${aname},${aliasname},${age})
     </insert>

测试:

@Test
 public void insert(){
     account.setAge(25);
     account.setAliasname("智智");
     account.setAname("李智234789");
     accountMapper.insertAccount(account);
 }

结果:
运行完我们发现sql语句values值没有双引号
SQL: insert into account(aname,alias_name,age) values (李智234,智智,25)
所以数据库不认这条语句但是我们也可以手动去添加''
比如下列操作:

 @Test
    public void insert(){
        account.setAge(25);
        account.setAliasname("'智智'");
        account.setAname("'李智234789'");
        accountMapper.insertAccount(account);
    }

运行完我们发现数据库中添加了这条语句
很显然很繁琐 所以就会出现了#{} 他会帮我们自动的去根据属性的类型去添加''
将上面的配置文件AccountMapper.xml修改一下或者values语句为 values ('${aname}','${aliasname}','${age}')
实质上:就是利用 prepareStatement进行sql的执行

  <insert id="insert">
        insert
        into
        account(aname,alias_name,age)
        values (#{aname},#{aliasname},#{age})
  </insert>
3.模胡查询

#{}模胡查询
AccountMapper.xml文件

  <select id="selectLike" resultType="account">
    select
     aid,aname,alias_name as aliasname,age
    from
     account
     where aname like #{anme}
  </select>

测试:

 @Test
    public void select(){
        List<Account> list = accountMapper.selectLike("%李%");
        System.out.println(JSON.toJSONString(list));
    }

结果:

[{“age”:23,“aid”:19,“aliasname”:“瑞瑞”,“aname”:“李瑞”},{“age”:20,“aid”:21,“aliasname”:“智智”,“aname”:“李智”}]

总结:使用#{}模糊查询传递值使用%李%

#{}模糊查询

 <select id="selectLike" resultType="account">
    select
     aid,aname,alias_name as aliasname,age
    from
     account
     <!-- 
     where aname like '${value}'
      List<Account> list = accountMapper.selectLike("%李%");
     -->
     where aname like ${value}
  </select>
@Test
    public void select(){
        List<Account> list = accountMapper.selectLike("'%李%'");
        System.out.println(JSON.toJSONString(list));
    }

结果:

[{“age”:23,“aid”:19,“aliasname”:“瑞瑞”,“aname”:“李瑞”},{“age”:20,“aid”:21,“aliasname”:“智智”,“aname”:“李智”}]

总结:方式一:使用#{}模糊查询传递值使用'%李%' 且xml文件中使用${value}
方式二:xml文件中直接使用'${value}' 传递值%李%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值