Mybatis入门笔记(13)——基于注解开发一对一的查询配置
复杂关系映射的注解说明
实体类属性和数据库表中列名不一致的时候,使用@Results()
注解。
举例:
@Select("select * from user")
@Results(id="userMap",
value = {
@Result(id=true,column = "id",property = "id"),
@Result(column = "username", property = "username"),
@Result(column = "sex", property = "sex"),
@Result(column = "address", property = "address"),
@Result(column = "birthday", property = "birthday")
})
下面详细介绍一下@Results()
注解的参数:
@Results:
id:
表示唯一标志,比如userMap。这样下面的查询也可以用到。使用@ResultMap("userMap")
@Result: 代替了<id>标签和<result>标签
id:true,表示主键字段
column:数据库表中的列名
property:实体类属性
one:需要使用的@One 注解( @Result( one=@One)()))
many:需要使用的@Many 注解( @Result( many=@many)())
@One 注解(一对一)
代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:
@Result(column=" ",property="",one=@One(select=""))
@Many 注解(多对一)
代替了<Collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:
聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))
基于注解开发一对一的查询配置
-
添加Account实体类
public class Account implements Serializable { private int id; private int uid; private String money; //从表实体应该包含一个主表实体的对象引用 private User user; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getMoney() { return money; } public void setMoney(String money) { this.money = money; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return "Account{" + "id=" + id + ", uid=" + uid + ", money='" + money + '\'' + '}'; } }
-
编写Account账户的持久层接口并使用注解配置
public interface IAccountDao { /** * @Description: 查询所有账户,采用延迟加载的方式查询账户的所属用户 * @Param: * @return: * @Author: benjamin * @Date: 2019/7/20 */ @Select("select * from account") @Results(id = "accountMap", value = { @Result(id = true, column = "id", property = "id"), @Result(column = "uid", property = "uid"), @Result(column = "money", property = "money"), @Result(column = "uid", property = "user", one = @One(select="com.ben.dao.IUserDao.findUserById", fetchType = FetchType.LAZY) ) } ) List<Account> findAll(); }
-
测试一对一关联及延迟加载
public class AccountTest { private InputStream in; private SqlSession sqlSession; private IAccountDao accountDao; @Before//用于在测试方法执行之前执行 public void init()throws Exception{ //1.读取配置文件,生成字节输入流 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.获取SqlSessionFactory SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in); //3.获取SqlSession对象 sqlSession = factory.openSession(true); //4.获取dao的代理对象 accountDao = sqlSession.getMapper(IAccountDao.class); } @After//用于在测试方法执行之后执行 public void destroy()throws Exception{ //提交事务 sqlSession.commit(); //6.释放资源 sqlSession.close(); in.close(); } //测试查询所有 @Test public void testFindAll(){ List<Account> accounts = accountDao.findAll(); for(Account account : accounts){ System.out.println("----每个账户对应的用户:一对一的关系----"); System.out.println(account); System.out.println(account.getUser()); } } }