文章目录
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}'
传递值%李%