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注入,#{}不会
标签:map,name,Admin,admin,参数,Mybatis,AdminMapper 来源: https://www.cnblogs.com/qiao88/p/13785230.html