mybatis配置详解---XXXMapper.xml

来源:互联网 发布:外包淘宝客服多少钱 编辑:程序博客网 时间:2024/06/01 15:04

一:功能

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

二:主要的属性

1、parameterType:指定输入映射参数的类型,可以是基本类型、也可是是定义的实体类。

#{}与${}:

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

<select id="findUserById" parameterType="int" resultType="user">select * from user where id=#{id}</select><span style="font-family: 宋体; background-color: rgb(255, 255, 255);"></span>

使用占位符#{}可以有效防止sql注入,在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,

如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称

${}和#{}不同,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单

类型值,${}括号中只能是value。使用${}不能防止sql注入,但是有时用${}会非常方便,如下的例子:

<select id="findUserByName" parameterType="string" resultType="cn.itcast.mybatis.po.User">select * from user where username like '%${value}%'</select>
如果本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,如果采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便很

多。再比如order by排序,如果将列名通过参数传入sql,根据传的列名进行排序,应该写为:ORDER BY ${columnName},如果使用#{}将无法实现此功能

这时候你就会发现一个问题,无论使用selectOne()还是使用selectList()方法,只能穿进去一个参数,那么多条件查询、分页的又怎么去处理呢?因为mybatis的输

入映射参数主持pojo,那么我们就可以自定义一个有关参数的pojo,然后把需要的属性封装到pojo对象中当做参数写入方法中,就能够查询了。例子如下:

mapper.xml

<select id="findUserList" parameterType="queryUserVo" resultType="user">select id,username,birthday from user  where #{user.username} and sex={user.sex}</select>
自定义的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<pojo>对象作为方法返回值。

(4):输出pojo对象可以改用hashmap输出类型,将输出的字段名称作为map的key,value为字段值。

resultMap:

resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

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

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

由于resultMap中内容比较重要,而且表之间一对多、多对多、一对一都是在这里面设置的,因此后面会有一个专题,这里先说这些

三:总结

主要写了输入输出的映射类型,后面会有一个动态sql、resultMap(一对一,多对一,多对多,一对多)的专题。详细介绍这两个



1 0
原创粉丝点击