在写Mybatis的Mapper映射文件的时候,我们通常用#{}来获取传进来的参数,对于参数的处理其实还是有非常多的规则。
单个参数
对于单个参数,MyBatis不会做参数处理,用#{}取值,里面括号内不管写什么都可以取到值。
//定义接口
public User selectById(int id); //通过id查询
<!-- 单个参数查询-->
<select id="selectById" resultType="User" >
select * from JDBC where id = #{abc}
</select>
结果测试:
@Test
//查询
public void T1() throws Exception {
InputStream in = Resources.getResourceAsStream("Mybatis.xml"); //加载配置文件
SqlSessionFactory SF = new SqlSessionFactoryBuilder().build(in); //创建sqlSession工厂
SqlSession s = SF.openSession(); //创建SqlSession对象
User u = s.selectOne("selectById",1); //调用查询方法 第一个参数是指mapper文件中id为select的sql语句,第二个参数是指对sql语句传入的参数
System.out.println(u); //打印查询到的数据
s.close(); //关闭资源
}
多个参数
MyBatis遇见多个参数会做特殊处理,多个参数会被封装成一个map。#{}就是从map中获取指定key的值。而key是param1、param2…param n。
//定义接口
public User selectByIdAndPassword(int id , String password); //通过id和password查询
如果此时获取参数使用#{id}和#{password}是不能成功绑定的。
<!-- 多个参数查询-->
<select id="selectByIdAndPassword" resultType="User">
select * from JDBC where id = #{id} and password = #{password}
</select>
运行测试代码后会出现下面的错误
所以需要将查询语句中的#{id}和#{password}改为#{param1}和#{param2}
<select id="selectByIdAndPassword" resultType="User">
select * from JDBC where id = #{param1} and password = #{param2}
</select>
但是对于多个参数取值还有一种取值方法,使用@Param注解可明确指定封装map时key的名称和当前名称保持一致。此时可以用#{指定的key值}进行取值
public User selectByIdAndPassword(@Param("id") int id ,@Param("password") String password); //通过id和password查询
<select id="selectByIdAndPassword" resultType="User">
select * from JDBC where id = #{id} and password = #{password}
</select>
如果参数过多,推荐直接传入对象,然后可以根据#{属性名}直接取出该属性的值。
如果传入的多个参数不是一个对象,此时可以将这些参数封装成一个map中,然后传入map即可。
public User selectByMap(Map map);
<!-- 通过Map查询-->
<select id="selectByMap" resultType="User">
select * from JDBC where id = #{id} and password = #{password}
</select>
@Test
public void T1_1() throws Exception {
InputStream in = Resources.getResourceAsStream("Mybatis.xml");
SqlSessionFactory SF = new SqlSessionFactoryBuilder().build(in);
SqlSession s = SF.openSession();
MybatisI mybatisI = s.getMapper(MybatisI.class);
Map<String,Object> map = new HashMap<String, Object>();
map.put("id",1);
map.put("password","111111");
User u = mybatisI.selectByMap(map);
System.out.println(u);
s.close();
}
特殊场景
public User getUser(@Param(“id”) int id, String name);
取值:id==>#{id} / #{param1} name==>#{param2}
public User getUser(int id,@Param(“e”) User user);
取值:id==>#{param1} name==>#{param2.name} / #{e.name}
public User getUser(List ids);
注意:如果是Collection(List、Set)类型或者数组类型也会特殊处理。也是将list或者数组封装到map中。key:Collect类型是(collection),如果是List还可以使用这个key(list);数组的key是(array)。
取值:(取第一个id的值) #{list[0]} / #{collection[0]}