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=""))

基于注解开发一对一的查询配置

  1. 添加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 + '\'' +
                    '}';
        }
    }
    
    
  2. 编写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();
    }
    
  3. 测试一对一关联及延迟加载

    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());
            }
        }
    }
    
posted @ 2019-07-20 15:33  伊万夫斯基  阅读(683)  评论(0编辑  收藏  举报