Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心。
1、parameterType:指定输入映射参数的类型,可以是基本类型、也可是是定义的实体类。
#{}与${}:
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。如:
使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,
如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称
${}和#{}不同,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:
如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很
多。再比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:ORDER BY ${columnName},如果使用#{}将无法实现此功能
这时候你就会发现一个问题,无论使用selectOne()还是使用selectList()方法,只能穿进去一个参数,那么多条件查询、分页的又怎么去处理呢?因为mybatis的输
入映射参数主持pojo,那么我们就可以自定义一个有关参数的pojo,然后把需要的属性封装到pojo对象中当做参数写入方法中,就能够查询了。例子如下:
mapper.xml
自定义的pojo
public class QueryUserVo {
//可能要包括很多pojo类型作为它的属性
//用户信息
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
在dao实现类的方法写入方法中即可
2、resultType:指定输出结果映射类型,确切的理解是指定单条记录所映射的类型,可以是pojo、基本类型、hashmap..
(1):输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
(2):返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
(3):返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List
(4):输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。
resultMap:resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。
如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。
resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
由于resultMap中内容比较重要,而且表之间一对多、多对多、一对一都是在这里面设置的,因此后面会有一个专题,这里先说这些