Mapper.xml 映射文件中定义了操作数据库的 sql,每个 sql 是一个 statement,映射文件是 mybatis 的核心。

parameterType (输入类型)

通过 parameterType 指定输入参数的类型,可以是简单类型、hashmap、pojo的包装类型。

#{} 实现的是向 prepareStatement中的预处理语句中设置参数值,sql 语句中#{}表示一个占位符即 ?。

<select id="findUserById" parameterType="int" resultType="user">
	select * from user where id = #{id}
</select>

使用占位符 #{} 可以有效防止 sql 注入,在使用时不需要关心参数值的类型,mybatis 会自动进行 java 类型和 jdbc 类型的转换。#{} 可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中可以是 value 或其它名称。

通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,使用 ${} 不能防止sql注入,但是有时会非常方便:

<select id="selectUserByName" parameterType="string" resultType="user">
	select * from user where username like '%${value}%'
</select>

测试代码:

Public void testFindUserByHashmap()throws Exception{
	//获取session
	SqlSession session = sqlSessionFactory.openSession();
	//获限mapper接口实例
	UserMapper userMapper = session.getMapper(UserMapper.class);
	//构造查询条件Hashmap对象
	HashMap<String, Object> map = new HashMap<String, Object>();
	map.put("id", 1);
	map.put("username", "管理员");
	//传递Hashmap对象查询用户列表
	List<User>list = userMapper.findUserByHashmap(map);
	//关闭session
	session.close();
}

resultType(输出类型)

使用 resultType 可以进行输出映射,只有查询出来的列名和 pojo 中的属性名一致,才可以映射成功。如果查询出来的列名和 pojo 中的属性名全部不一致,就不会创建 pojo 对象。但是只要查询出来的列名和 pojo 中的属性有一个一致,就会创建 pojo 对象。

<select id="findUserCount" parameterType="user" resultType="int">
   select count(*) from user
</select>

parameterMap 和 resultMap

resultType 可以指定 pojo 将查询结果映射为 pojo,但需要 pojo 的属性名和sql查询的列名一致方可映射成功。如果 sql 查询字段名和 pojo 的属性名不一致,可以通过 resultMap 将字段名和属性名作一个对应关系 ,resultMap 实质上还需要将查询结果映射到 pojo 对象中。

resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。

数据库列与 POJO 不一致的时候,将输入参数映射到数据库列:

<resultMap type="Book.dao.Book" id="BookResultMap">
	<id column="id" property="id"/>
	<result column="name" property="bookName"/>
	<result column="price" property="bookPrice"/>
</resultMap>
 
<!-- resultMap:resultMap的id ,bookName:resultMap的property,即实体类中的属性 -->
<parameterMap type="Book.dao.Book" id="BookParameterMap">
	<parameter property="bookName" resultMap="BookResultMap" />  
	<parameter property="bookPrice" resultMap="BookResultMap" />  
</parameterMap>

<insert id="saveBook" parameterMap="BookParameterMap">
	insert into BOOK_MANAGE
	(ID,NAME,PRICE)
	values
	(Bookmanage_Seq.Nextval,#{bookName},#{bookPrice})
</insert>

查询的结果与POJO名字不一致的时候,用resultMap来实现映射:

<resultMap type="user" id="userMap">
	<id column="id_" property="id" />
	<result column="username_" property="username" />
</resultMap>
<select id="findUserMapById" parameterType="java.lang.Integer" resultMap="userMap" >
	select id id_,username username_ from user where id = #{id}
</select>