Mybatis-5
一.MyBatis的参数处理
1.单参数处理
1)接口
AdminMapper {
Admin selectAdminByName(String name);
}
2)映射文件
SELECT FROM admin WHERE name=#{name}
3)测试内容
testSingleParam()
{
SqlSession sqlSession=MyBatisUtil.();
AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.);
Admin admin=adminMapper.selectAdminByName();
.info(admin);
MyBatisUtil.(sqlSession);
}
4)观察控制台效果

通过控制台的观察,大家发现输出的SQL语句使用了占位的方式,JDBC中SQL如果要输入参数有两种方式
4.1)可以通过拼接SQL语句方式来完成
4.2)通过?占位的方式来完成
如果在MyBatis中你使用了#{}的方式,那么它就是占位的方式
#{key}这个key的内容,如果是单参数,MyBatis限制的很宽松,只要类型一样的就行了,不管名称取成什么都是可以的
2.多参数处理
2.1 通过@Param方式来指定参数名称
如果写的多个参数,这个时候发现并没有找到


MyBatis的规定,如果是多个参数,这个时候,可以使用 arg0,arg1,arg2.....argN或者param1,param2,param3...paramN
如下所示就可以了
<select id="selectAdminByNameAndAge" resultType="admin">
SELECT * FROM admin WHERE name LIKE concat('%',#{arg0},'%') AND age>#{arg1}
</select>
<select id="selectAdminByNameAndAge" resultType="admin">
SELECT * FROM admin WHERE name LIKE concat('%',#{param1},'%') AND age>#{param2}
</select>
如上的这个规定时间上太死板了,不灵活,如果程序员自己要定义名称,需要通过@Param的注解来完成自己设置名称,如下所示

2.2 通过实体对象来传值
AdminMapper {
Admin selectAdminByName(String name);
Admin selectAdminByNameAndAge(() String name, () age);
Admin selectAdminByEntity(Admin admin);
Admin selectAdminByMap(Map<String,Object> map);
}
SELECT FROM admin WHERE name LIKE concat('%',#{name},'%') AND age>#{age}
testMultiParam2()
{
SqlSession sqlSession=MyBatisUtil.();
AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.);
Admin entity=Admin();
entity.setName();
entity.setAge();
Admin admin=adminMapper.selectAdminByEntity(entity);
.info(admin);
MyBatisUtil.(sqlSession);
}
通过实体对象来传值,实际上#{key} key的值是和实体对象中的属性名要保持一致的
2.3 通过Map集合来传值
AdminMapper {
Admin selectAdminByName(String name);
Admin selectAdminByNameAndAge(() String name, () age);
Admin selectAdminByEntity(Admin admin);
Admin selectAdminByMap(Map<String,Object> map);
}
<select id="selectAdminByMap" resultType="admin">
SELECT * FROM admin WHERE name LIKE concat('%',#{},'%') AND age>#{}
</select>
@Test
public void testMultiParam3()
{
SqlSession sqlSession=MyBatisUtil.createSession();
AdminMapper adminMapper=sqlSession.getMapper(AdminMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put(","s");
map.put(,33);
Admin admin=adminMapper.selectAdminByMap(map);
logger.info(admin);
MyBatisUtil.closeSession(sqlSession);
}
如果你使用的map作为参数的话,那么#{key} key的值是和map中的键的值是相同的,这样就能绑定到一起了
如上三种方式来处理参数的传值的问题,实际上底层都使用map集合
这三种在实际开发中都有用途
一般参数不超过三个的请使用第一种,那么如果参数超过3个以上可以使用实体或者使用map都可以
上机练习:使用上一次建立商品表,现在完成如下操作,查询商品价格在200-700元之间,并且商品中有“机”的商品
要求:分别使用三种多参数处理的方式
二.关于${}和#{}取值问题
#{}这是就是JDBC中的预处理操作,PreparedStatement来完成预处理语句的执行操作,在预处理操作中使用?来占位,后续在赋值
${}这种方式JDBC中的拼接方式来完成
在使用${}完成查询的过程中,需要注意就是必须要在接口方法中参数前面带@Param(不管是一个参数还是多个参数)
在使用${}过程中会出现SQL注入,安全性低下,使用#{}不会出现SQL注入问题
两种方法都可以使用的情况下,我建议大家使用#{}的方式
1)例如排序不支持占位就不能使用#{},只能使用${}
2) 例如在分表操作中就不能使用#{},只能使用${}
3) ${}也可以完成#{}相同的功能,进行参数传递,只不过它需要外面带单引号('')
注意:${}可能会引发SQL注入,#{}不会

浙公网安备 33010602011771号