mybatis查询方法传入参数
1)、单个参数
基本类型:
- 取值:#{随便写}
2)、多个参数
public Employee getEmpByIdAndEmpName(Integer id,String empName);
- 取值:#{参数名}是无效了
Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found.
Available parameters are [arg1, arg0, param1, param2]
可用:arg1,arg2(参数的索引)或者是param1,param2(第几个参数paramN)
原因:只要是传入了多个参数;mybatis会自动将这些参数封装在map中;、
封装时用的key就是参数的索引或者是参数的第几个表示
Map<String, Object> map = new HashMap<>();
map.put("1",传入的值);
map.put("2",传入的值);
#{key}就是从这个map中取值
3)@Param:为参数指定key;命名参数;我们以后也推荐这么做
可以告诉mybatis,封装参数map的时候别乱配,使用我们指定的key(使用@Param)
例如:
public Employee getEmpByIdAndEmpName(@Param("id") Integer id,@Param("empName") String empName);
4)、pojo(JavaBean)
- 取值#{pojo的属性名}
5)、传入map:将多个要使用的参数封装起来
xml中的sql语句的编写
<select id="getEmpReturnMap" resultType="map">
select * from t_employee where id=#{id}
</select>
/**
* 通过传入map来进行查询
*/
@Test
public void testMap() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.getSqlSession();
EmployeeDao mapper = sqlSession.getMapper(EmployeeDao.class);
Map<String, Object> map = new HashMap<>();
map.put("id", 1);
map.put("empName", "admin");
map.put("tableName", "t_employee");
Employee employee = mapper.getEmployeeByIdAndEmpName(map);
System.out.println(employee);
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.commit();
sqlSession.close();
}
}
扩展:多个参数:自动封装map;
method01(@Param("id")Integer id , String empName , Employee employee);
Integer id ->#{id}
String empName->#{param2}
Employee employee(取出这个里面的email) -> #{param3.email}
无论传入什么参都要能正确的取出值
#{key/属性名}
1)#{key}取值的时候可以设置一些规则;
id=#{id,jdbcType=INT}
javaType、jdbcType、mode. numericScale、resultMap、typeHandler、jdbcTypeName、expression
只有jdbcType才可能是要被指定的
默认不指定jdbcType:mysql没问题,Oracle也没有问题;
万一传入的数据是null,mysql插入null值没有问题,
【Oracle不知道null是什么类型】