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 注解(@Result(aaa@qq.com)()))
many 需要使用的@Many 注解(@Result(aaa@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=""))
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());
}
}
}
上一篇: Arduino流水灯
下一篇: 1028接触C语言程序(实现流水灯)