欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载

程序员文章站 2022-07-12 22:37:05
...
@Results 注解
代替的是标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results{@Result(),@Result()})或@Results@Result())
@Resutl 注解
代替了 <id>标签和<result>标签
@Result 中 属性介绍:
id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Resultaaa@qq.com)()))
many 需要使用的@Many 注解(@Resultaaa@qq.com)()))
@One 注解(一对一)
代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
select 指定用来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。。
使用格式:
@Result(column=" ",property="",one=@One(select=""))
@Many 注解(多对一)
代替了<Collection>标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式:
@Result(property="",column="",many=@Many(select=""))

 

 Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载

 Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载

 

IUserDao

package com.itheima.dao;

import com.itheima.domain.Account;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 */
public interface IAccountDao {

    /**
     * 查询所有账户,并且获取每个账户所属的用户信息
     * 查询所有账户,采用延迟加载的方式查询账户的所属用户
     * @return
     */
    @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(property = "user",column = "uid",aaa@qq.com(select="com.itheima.dao.IUserDao.findById",fetchType= FetchType.EAGER))
    })  /*@One表示多对一的情况 多对一采用饿汉式加载 fetchType= FetchType.EAGER eager:渴望的;急切的 也就是立即加载,LAZY 则表示延迟加载*/
    /**
     * 以上 相当于association延迟加载:
     * <!-- 定义封装account和user的resultMap -->
     *     <resultMap id="accountUserMap" type="account">
     *         <id property="id" column="id"></id>
     *         <result property="uid" column="uid"></result>
     *         <result property="money" column="money"></result>
     *
     *        <!-- 一对一的关系映射:配置封装user的内容
     *         property:表示要封装哪个类 的类名 ,javatype表示 要封装的类型(sqlmapconfig取了别名 所以不用写全限定类名
     *         select属性指定的内容:查询用户的唯一标识:填写我们要调用的 select 映射的 id
     *         column属性指定的内容:用户根据id查询时,所需要的参数的值 填写我们要传递给 select 映射的参数
     *         -->
     *         <association property="user" column="uid" javaType="user" select="com.itheima.dao.IUserDao.findById"></association>
     *     </resultMap>
     */
     List<Account> findAll();

    /**
     * 根据用户id查询账户信息
     * @param userId
     * @return
     */
    @Select("select * from account where uid = #{userId}")
    List<Account> findAccountByUid(Integer userId);
}

 

IUserDao

package com.itheima.dao;

import com.itheima.domain.User;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;

import java.util.List;

/**
 * @author 黑马程序员
 * @Company http://www.ithiema.com
 * 在mybatis中针对,CRUD一共有四个注解
 *  @Select @Insert @Update @Delete
 */
@CacheNamespace(blocking = true)//开启二级缓存 相当于在xml中写</cache> useCache="true 
public interface IUserDao {

    /**
     * 查询所有用户
     * @return
     */
    @Select("select * from user")
    @Results(id="userMap",value={
            @Result(id=true,column = "id",property = "userId"),
            @Result(column = "username",property = "userName"),
            @Result(column = "address",property = "userAddress"),
            @Result(column = "sex",property = "userSex"),
            @Result(column = "birthday",property = "userBirthday"),
            @Result(property = "accounts",column = "id",
                    many = @Many(select = "com.itheima.dao.IAccountDao.findAccountByUid",
                                fetchType = FetchType.LAZY))
    })/*一对多 采用@Many fetchType = FetchType.LAZY延迟加载
    相当于xml:
     <!-- 配置user对象中accounts集合的映射 -->
        <collection property="accounts" ofType="account" select="com.itheima.dao.IAccountDao.findAccountByUid" column="id"></collection>
    </resultMap>*/
    List<User> findAll();

    /**
     * 根据id查询用户
     * @param userId
     * @return
     */
    @Select("select * from user  where id=#{id} ")
    @ResultMap("userMap")//标准写法有多个时 @ResultMap(value={"userMap","..."}
    User findById(Integer userId);

    /**
     * 根据用户名称模糊查询
     * @param username
     * @return
     */
    @Select("select * from user where username like #{username} ")
    @ResultMap("userMap")
    List<User> findUserByName(String username);


}

 

测试一对一关联及立即加载
package com.itheima.test;

import com.itheima.dao.IAccountDao;
import com.itheima.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;
import java.util.List;

/**
 * 测试一对一关联及延迟加载
 */
public class One2OneTest {
    private InputStream in;
    private SqlSessionFactory factory;
    private SqlSession session;
    private IAccountDao accountDao;

    @Before
    public  void init()throws Exception{
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        factory = new SqlSessionFactoryBuilder().build(in);
        session = factory.openSession();
        accountDao = session.getMapper(IAccountDao.class);
    }

    @After
    public  void destroy()throws  Exception{
        session.commit();
        session.close();
        in.close();
    }

    /**
     * //每个账户对应一个用户(多对一,mybatis将多对一当作只有一对一处理) 采用了立即加载
     */
    @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());
        }
    }



}

 

 

 

相关标签: Mybatis mybatis