MyBatis XML映射文件
Mapper接口开发方法只需要程序员编写Mapper接口,由Mybatis框架根据接口定义创建接口的动态代理对象。
Mapper接口开发需要遵循以下规范:
- Mapper.xml文件中的namespace与mapper接口的类路径相同。
- Mapper接口方法名和Mapper.xml中定义的每个statement的id相同
- Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
- Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
一、xml文件样式
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xx.mapper.xxxMapper">
、、、 、、、 、、、 、、、
</mapper>
- Mapper接口对应的statement需要放到
<mapper></mapper>
标签之中 - namespace为命名空间,用于隔离sql语句,与mapper接口的类路径相同
二、ResultMap
resultType可以指定pojo将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系,resultMap实质上还需要将查询结果映射到pojo对象中。resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。
<resultMap type="com.xx.domain.Order" id="orderMap" autoMapping="" extends="">
<!-- 订单信息查询结果,和用户和订单明细关联 -->
<id property="id" column="id"></id>
<result property="userId" column="user_id"></result>
<result property="number" column="number"></result>
... ... ... ...
<association property="user" javaType="com.xx.domain.User">
<!-- order和user 一对一对应 需要在Order类中添加User对象 -->
<!-- 这里的id为user的id,如果写上表示给user的id属性赋值 -->
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</association>
<collection property="orderDetails" ofType="com.xx.domian.OrderDetail">
<!-- order和orderDetail 一对多对应 需要在Order类中添加List<OrderDetail> -->
<!-- 一对多是多对多的特例 -->
<id property="id" column="orderdetail_id"/>
<result property="items_id" column="items_id"/>
<result property="items_num" column="items_num"/>
</collection>
</resultMap>
<resultMap>
标签
使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
- id属性:resultMap标签的标识。
- type属性:返回值的全限定类名,或类型别名。
- autoMapping属性:值范围true(默认值)|false,,设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在resultMap内明确注明映射关系才会调用对应的setter方法。
- extends属性:填写其他resultMap的id,可以继承其中的映射关系
子标签
<id></id>
标签,用于设置主键字段与领域模型属性的映射关系<result></result>
标签,用于设置普通字段与领域模型属性的映射关系<association></association>
标签,将关联查询信息映射到一个pojo对象中,
使用场景:
为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
<collection></collection>
标签,将关联查询信息映射到一个list集合中。
使用场景:
为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
如果使用resultType无法将查询结果映射到list集合中。
三、ResultType
简单输出类型也可以使用resultType,输出pojo对象和输出pojo列表在sql中定义的resultType是一样的。
返回单个pojo对象要保证sql查询出来的结果集为单条,内部使用session.selectOne方法调用,mapper接口使用pojo对象作为方法返回值。
返回pojo列表表示查询出来的结果集可能为多条,内部使用session.selectList方法,mapper接口使用List对象作为方法返回值。
四、TypeAliases
Mybatis支持别名:
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
自定义别名
<typeAliases>
<!-- 单个别名定义 -->
<typeAlias alias="user" type="com.xx.domain.User"/>
<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
<package name="com.xx.domain"/>
<package name="其它包"/>
</typeAliases>