# 实体类懒加载(一对一)

有两张表

  • 用户表
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);

这样就可以强制查询关联对象了