#{}与${}的语法

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}' 传递值%李%

猜你喜欢

转载自blog.csdn.net/lirui1212/article/details/108404379