基本标签属性
resultMap :用来描述获取数据后与对象的映射(数据库字段与对象属性名),通常情况下使用默认的映射(数据库字段与属性名相同),但有时需要进行不同的映射,这时候就需要使用requestMap进行设置在resultType中使用。具体如下:
id:标签,用来标识主键
column:数据库字段属性 property:实体类字段属性
result:标签 ,用于其他列标识
colleaction:标签,用来标识集合属性
property:实体类字段属性
ofType:集合存储数据类型属性
column属性:用于标识查询数据列(会获取对应列数据传入相应的查询语句)
select属性:懒加载执行时调用获取数据的方法(可以调用其他mapper中的方法,通过namespace.id使用)
fetchType:局部懒加载默认fetchType="lazy"深入式 eager侵入式
association:标签,用于标识类属性
property:实体类字段属性
javaType:类型属性(配置数据库数据与java的映射 一般不配置)
column属性:用于标识查询数据列(会获取对应列数据传入相应的查询语句)
select属性:懒加载执行时调用获取数据的方法(可以调用其他mapper中的方法,通过namespace.id使用)
fetchType:局部懒加载默认fetchType="lazy"深入式 eager侵入式
*
resultMap 使用场景
数据库SQL
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `permission`
-- ----------------------------
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL,
`desc` varchar(255) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of permission
-- ----------------------------
INSERT INTO `permission` VALUES ('1', '/select', '查询权限');
INSERT INTO `permission` VALUES ('2', '/insert', '新增权限');
INSERT INTO `permission` VALUES ('3', '/update', '修改权限');
INSERT INTO `permission` VALUES ('4', '/delete', '删除权限');
INSERT INTO `permission` VALUES ('5', '/liuda', '瞎溜达权限');
-- ----------------------------
-- Table structure for `role`
-- ----------------------------
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`rid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`desc` varchar(255) DEFAULT NULL,
PRIMARY KEY (`rid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of role
-- ----------------------------
INSERT INTO `role` VALUES ('1', 'admin', '超级管理员');
INSERT INTO `role` VALUES ('2', 'user', '普通用户');
-- ----------------------------
-- Table structure for `role_permission`
-- ----------------------------
DROP TABLE IF EXISTS `role_permission`;
CREATE TABLE `role_permission` (
`rid` int(11) DEFAULT NULL,
`pid` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of role_permission
-- ----------------------------
INSERT INTO `role_permission` VALUES ('1', '1');
INSERT INTO `role_permission` VALUES ('1', '2');
INSERT INTO `role_permission` VALUES ('1', '3');
INSERT INTO `role_permission` VALUES ('1', '4');
INSERT INTO `role_permission` VALUES ('1', '5');
INSERT INTO `role_permission` VALUES ('2', '1');
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`s_id` int(11) NOT NULL AUTO_INCREMENT,
`s_name` varchar(255) DEFAULT NULL,
`s_sex` varchar(255) DEFAULT NULL,
`s_age` int(11) DEFAULT NULL,
PRIMARY KEY (`s_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '男', '18');
INSERT INTO `student` VALUES ('2', '李四', '女', '28');
INSERT INTO `student` VALUES ('3', '王五', '男', '38');
INSERT INTO `student` VALUES ('4', '赵六', '女', '48');
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123456', '138468885889');
INSERT INTO `user` VALUES ('2', 'lisi', '123456', '1384688888588');
-- ----------------------------
-- Table structure for `user_role`
-- ----------------------------
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
`uid` int(11) NOT NULL,
`rid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user_role
-- ----------------------------
INSERT INTO `user_role` VALUES ('1', '1');
INSERT INTO `user_role` VALUES ('2', '2');
1.为查询结果列与对象不同进行映射
当数据库列与对应的bean属性不一致时,不能使用自动映射,需要书写resultMap进行手动映射配置
<!-- 当数据库列名与对象属性名不匹配时 无法存入对应数据 -->
<!-- 这个时候就不能直接使用resultType进行映射 需要自己定义映射 -->
<!-- id 当前结果集唯一标识 查询语句可以使用resultMap指定对应id的映射 -->
<!-- type 就是结果集需要的映射对象 建议书写全面 防止混淆-->
<resultMap id="my-student" type="javabean.Student">
<!-- id标签用于设置当前对象的主键存储 -->
<!-- javatype jdbctype typehandler 都会自动识别不需要定义 -->
<!-- property用于定义java中id的属性名 -->
<!-- column 用于定义数据结果中对应的列名 -->
<id column="s_id" property="id"/>
<!-- result用于当前对象非主键属性的定义 -->
<result column="s_name" property="name"/>
<result column="s_sex" property="sex"/>
<result column="s_age" property="age"/>
</resultMap>
<!-- 将查询语句的结果改为resultMap=id的形式 -->
<select id="selectAll" resultMap="my-student">
select *
from student
</select>
优点:
1.减少了后台直接对数据库的展示(隐藏数据库实际字段)
2.对已有系统实现兼容(数据库重用)
2.进行一对一查询自定义映射
需要在定义bean对象时将其关系进行定义
与角色一对一关系所以需要先定义角色对象
public class Role implements Serializable {
private int rid;
private String name;
private String desc;
...
}
public class User implements Serializable {
private int uid;
private String username;
private String password;
private Role role;
...
}
<!-- 一对一映射必须使用resultMap进行定义 -->
<resultMap id="user_role" type="javabean.User">
<!-- 先书写当前对象可以直接映射的属性与列映射 -->
<id column="uid" property="uid"/>
<result column="username" property="username"></result>
<result column="password" property="password"></result>
<result column="phone" property="phone"></result>
<!-- 对应当前对象中的自定义属性 可以使用association标签进行标识 -->
<!-- property属性名 就是在对象中定义的属性名称 -->
<association property="role" javaType="javabean.Role">
<!-- 之后书写方式与直接在resultMap书写该属性相同 -->
<id column="rid" property="rid"></id>
<result column="name" property="name"></result>
<result column="desc" property="desc"></result>
</association>
</resultMap>
<select id="selectUser_Role" resultMap="user_role">
select u.*,r.*
from user u
left join user_role ur on u.uid = ur.uid
left join role r on ur.rid = r.rid
</select>
如果设置的映射数据列与属性匹配可以使用autoMapping=“true” 进行自动映射 否则必须书写对应属性
3.进行一对多查询自定义映射
就是在对象中书写集合属性 保存指定对象的集合
public class Permission implements Serializable {
private int pid;
private String purl;
private String pdesc;
....
}
书写角色对象保存权限集合属性
public class Role implements Serializable {
private int rid;
private String name;
private String desc;
private List<Permission> plist;
...
}
方法一
<resultMap id="role_permission" type="javabean.Role">
<id column="rid" property="rid"/>
<result column="name" property="name"/>
<result column="desc" property="desc"/>
<collection property="plist" ofType="javabean.Permission">
<id column="pid" property="pid"/>
<result column="url" property="purl"/>
<result column="pdesc" property="pdesc"/>
</collection>
</resultMap>
<select id="selectRole_Permission" resultMap="role_permission">
select r.*, p.pid, p.url, p.`desc` pdesc
from role r,
role_permission rp,
permission p
where r.rid = rp.rid
and p.pid = rp.pid
</select>
方法二
<resultMap id="role_permission1" type="javabean.Role" autoMapping="true">
<!-- 在进行一对多查询时 需要将多条对应语句存入指定集合 所以如果使用autoMapping -->
<!-- 没有定义主键列的话 可能导致数据的全部赋值(就不会存储至对应集合中了) -->
<!-- 一定要设置id列 -->
<id column="rid" property="rid"/>
<!-- autoMapping数据列与属性相同不用配置 -->
<collection property="plist" ofType="javabean.Permission" autoMapping="true">
</collection>
</resultMap>
<select id="selectRole_Permission1" resultMap="role_permission1">
select r.*, p.pid, p.url purl, p.`desc` pdesc
from role r,
role_permission rp,
permission p
where r.rid = rp.rid
and p.pid = rp.pid
</select>
4.进行一对一对多查询自定义映射
<resultMap id="user_role_permission" type="javabean.User">
<id column="uid" property="uid"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="phone" property="phone"/>
<association property="role" javaType="javabean.Role">
<id column="rid" property="rid"/>
<result column="name" property="name"/>
<result column="desc" property="desc"/>
<collection property="plist" ofType="javabean.Permission">
<id column="pid" property="pid"/>
<result column="url" property="purl"/>
<result column="pdesc" property="pdesc"/>
</collection>
</association>
</resultMap>
<select id="selectUser_Role_Permission" resultMap="user_role_permission">
SELECT
u.*, r.*, p.pid,
p.url purl,
p.`desc` pdesc
from `user` u,
role r,
permission p,
user_role ur,
role_permission rp
where u.uid = ur.uid
AND ur.rid = r.rid
AND r.rid = rp.rid
AND rp.pid = p.pid
</select>
5.懒加载/延迟加载
在进行查询时有时需要根据需求加载对应数据(淘宝详情页,会随着下拉加载)
懒加载的配置有两种
一种是在mybatis全局配置文件中配置全局延迟加载
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
二是在resultmap中使用属性进行全局配置的覆盖
fetchType="lazy"
延迟加载的使用更便于面向对象编程思路的理解,会将查询对应数据的语句放置在对应的xml中进行调用
<mapper namespace="mapper.RoleMapper">
<resultMap id="pp" type="role" autoMapping="true">
<id property="rid" column="rid"/>
<!-- property 保存集合的属性名 -->
<!-- column 指定查询需要的参数 会将当前对应数据传入查询语句 -->
<!-- select可以调用对应空间下查询语句进行结构的查询 -->
<!-- fetchType=lazy 开启懒加载 默认为eager 侵入式查询 会直接调用查询语句执行-->
<collection property="ps" column="rid" select="mapper.PermissionMapper.selectByRid"
fetchType="lazy"/>
</resultMap>
<select id="selectAll" resultMap="pp">
select *
from role
</select>
</mapper>
<mapper namespace="mapper.PermissionMapper">
<select id="selectByRid" resultType="permission">
select rp.rid,p.* from role_permission rp left join permission p on rp.pid=p.pid where rp.rid=#{arg0}
</select>
</mapper>
在对查询结果操作时,只有使用到对应权限数据时才会执行对应的查询将对应角色的权限查询出来