1.在用#{}取值时,可能会遇到两种情况:
1)单参数:mybatis 不会做特殊处理, #{参数名/任意名}:取出参数值。
2)多个参数:mybatis 会做特殊处理。多个参数会被封装成 一个 map,
其中 key:param1...paramN,或者参数的索引也可以
value:传入的参数值
#{}就是从 map 中获取指定的 key 的值;
例子:
在 EmployeeMapper.java 中,当方法为:public Employee getEmpByIdAndLastName(Integer id,String lastName);
在 EmployeeMapping.xml 中
<select id="getEmpByidAndLastName" resultType="com.Mybatis.entity.Employee">
select * from mybatis_employee where id=#{id} and Last_Name=#{Last_Name}
/*取值用:#{id},#{lastName}*/
</select>
在 Mybatis_Test.java 中
@Test
public void Test3() throws IOException {
// 1.获得SqlSessionFactory
SqlSessionFactory sessionFactory = getSessionFactory();
// 2.获得SqlSession
SqlSession openSession = sessionFactory.openSession(true);
// 3.获取接口类对象
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Employee employee = mapper.getEmpByidAndLastName(9, "xiaowen");
System.out.println(employee);
} finally {
openSession.close();
}
}
发现会出现异常,无法正常输出,异常提示为:
导致出现这样结果的原因是什么呢?
之前在前面说了,多个参数的话会被封装成一个 map
这个时候 如果要获得正常结果的话,我们可以采用如下方法
a)直接在 EmployeeMapper.java 中,方法修改为:public Employee getEmpByIdAndLastName(@Param("id")Integer id,@Param("Last_Name")String lastName);
就是在方法参数前面自定义命名,这样就可以正常输出了.
b)在 EmployeeMapping.xml 中 修改#{}中的参数为 Param1....Param N
<select id="getEmpByidAndLastName" resultType="com.Mybatis.entity.Employee">
select * from mybatis_employee where id=#{param1} and Last_Name=#{param2}
</select>
c)Map:如果多个参数不是业务模型中的数据,没有对应的 pojo,不经常使用,为了方便,我们也可以传入 map
`EmployeeMapper.java 中 定义 public Employee getEmpByMap(Map<String,Object> map);'
EmployeeMapping.xml
</select>
<select id="getEmpByMap" resultType="com.Mybatis.entity.Employee">
select * from mybatis_employee where id=#{id} and Last_Name=#{lastname}
</select>
Mybatis_Test.java 中
@Test
public void Test4() throws IOException {
// 1.获得SqlSessionFactory
SqlSessionFactory sessionFactory = getSessionFactory();
// 2.获得SqlSession
SqlSession openSession = sessionFactory.openSession(true);
// 3.获取接口类对象
try {
EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
Map<String,Object> map = new HashMap<>();
map.put("id",1);
map.put("lastname", "xiaoming");
Employee empByMap = mapper.getEmpByMap(map);
System.out.println(empByMap);
} finally {
openSession.close();
}
========================思考================================
public Employee getEmp(@Param("id")Integer id,String lastName);
取值:id==>#{id/param1} lastName==>#{param2}
public Employee getEmp(Integer id,@Param("e")Employee emp);
取值:id==>#{param1} lastName===>#{param2.lastName/e.lastName}
特别注意:如果是 Collection(List、Set)类型或者是数组,也会特殊处理。也是把传入的 list 或者数组封装在 map 中。
key:Collection(collection),如果是 List 还可以使用这个 key(list)数组(array)
public Employee getEmpById(List ids);
取值:取出第一个 id 的值: #{list[0]}
总结:参数多时会封装 map,为了不混乱,我们可以使用 @Param 来指定封装时使用的 key;
#{key}就可以取出 map 中的值
===========================参数值的获取======================================
#{}:可以获取 map 中的值或者 pojo 对象属性的值;
${}:可以获取 map 中的值或者 pojo 对象属性的值;
select * from tbl_employee where id=${id} and last_name=#{lastName}
Preparing: select * from tbl_employee where id=2 and last_name=?
区别:
#{}:是以预编译的形式,将参数设置到sql语句中;PreparedStatement;防止sql注入
${}:取出的值直接拼装在sql语句中;会有安全问题;
大多情况下,我们去参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。。;按照年份分表拆分
select * from ${year}_salary where xxx;
select * from tbl_employee order by ${f_name} ${order}
#{}:更丰富的用法:
规定参数的一些规则:
javaType、 jdbcType、 mode(存储过程)、 numericScale、
resultMap、 typeHandler、 jdbcTypeName、
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于