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>