# 实体类懒加载(一对一)
有两张表
- 用户表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL auto_increment COMMENT 'ID',
`username` varchar(255) default NULL COMMENT '用户名',
`state` tinyint(4) default NULL COMMENT '状态',
`isdel` bit(1) default NULL COMMENT '是否删除',
`remark` text COMMENT '备注',
`add_time` datetime default NULL COMMENT '添加时间',
`money` decimal(10,2) default NULL COMMENT '金额',
`left_money` float default NULL COMMENT '剩下的钱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='用户表'
- 用户信息表
CREATE TABLE `user_info` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(11) NOT NULL COMMENT 't_user对应主键',
`address` varchar(100) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
假设在查询user_info
表时懒加载关联t_user
表,实体类对应如下:
/**
* 表名:t_user
* 备注:用户表
*/
@Table(name = "t_user")
public class TUser {
/** ID, 数据库字段:id */
private Integer id;
/** 用户名, 数据库字段:username */
private String username;
/** 状态, 数据库字段:state */
private Byte state;
// getter setter
}
t_user对应的实体类常规方式,不变。
@Table(name = "user_info")
public class UserInfo {
/** 数据库字段:id */
private Integer id;
/** t_user外键, 数据库字段:user_id */
private Integer userId;
// 一对一配置,这里的user_id对应TUser主键
// 触发懒加载时,会拿user_id的值去查询t_user表
// 即:SELECT * FROM t_user WHERE id={user_id}
@Column(name = "user_id", lazyFetch = true)
private TUser user;
/** 地址, 数据库字段:address */
private String address;
// getter setter
}
user_info对应的实体类,本来user_id部分变成
@Column(name = "user_id", lazyFetch = true)
private TUser user;
- 测试用例:
@Autowired
UserInfoMapper mapper;
@Test
public void testGet() {
UserInfo userInfo = mapper.getById(2);
System.out.println(userInfo.getAddress());
// 这里触发懒加载,将会执行
// SELECT t.`id` , t.`username` , t.`state` , t.`isdel` , t.`remark` , t.`add_time` , t.`money` , t.`left_money` FROM `t_user` t WHERE `id` = ? AND t.isdel = 0 LIMIT 1
// 可将下面两句注释查看sql执行情况
TUser user = userInfo.getUser();
System.out.println(user);
}
# 懒加载忽略逻辑删除字段
有时候懒加载的对象是已经被删除了的,这个时候需要强制查询出来,默认情况下是不会被查询到。 可以设置
mybatis.ignoreLogicDeleteWithAssociation=true
或者
FastmybatisConfig config = new FastmybatisConfig();
config.setIgnoreLogicDeleteWithAssociation(true);
这样就可以强制查询关联对象了