#{}与${}的语法

tech2026-02-09  1

文章目录

1.前言2.#{}与${}的区别3.模胡查询

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)