通过以下代码引申到如何去使用#{}和${},以及他们的区别。
//数据库中的语法 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());错误信息:
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>#{}模胡查询 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}' 传递值%李%
