向MyBatis的映射SQL语句传递参数使用的是selectList、insert等等方法中的第二个参数来完成的,可以传入Map或者对应的JavaBean,小例子:
XML:
<select id="selectFoodById" resultType="java.util.Map">
select * from food where FOODID = #{foodId}
</select>
XML:
SqlSession session = getSession();
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("foodId", 2);
System.out.println(session.selectList("Food.selectFoodById", map));
使用#{key}的方式,实际上是JDBC中 ? 作为占位符的方式传递的,能够防止SQL注入。还有一种是用 ${key},EL表达式的形式:
<select id="selectFoodByName" resultType="java.util.Map">
select * from food where FOODNAME like '%${foodName}%'
</select>
这种方式就是传统的SQL语句拼接,不过这种方式可以使用 like 模糊查询,类似上面这样的值传递方式使用 #{key}要做模糊查询只能在传递的值上拼接百分号...
。
对比一下两种方式:
#{Key} : 使用?占位符预编译SQL,能够防止SQL注入,字符串类型会自动加 ' ' 单引号
${Key} : 直接使用对应的值来替换对应的键,如果是字符串需要手动添加单引号
再贴一个insert的小例子:
<insert id="insertFood">
insert into food values(FOOD_SEC.NEXTVAL , #{foodName} , #{price})
</insert>
SqlSession session = getSession();
Food food = new Food();
food.setFoodName("鼎湖上素");
food.setPrice("55");
session.insert("Food.insertFood" , food);
session.commit(); // 需要手动提交事务