组团学

MyBatis注解(多表)

阅读 (737567)

1、多表关系映射说明

1.1、一对一

@One 注解(一对一)

代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

@One 注解属性介绍:

select指定用来多表查询的sqlmapper

fetchType会覆盖全局的配置参数 lazyLoadingEnabled

使用格式:

@Result(column=" “,property=”",one=@One(select=""))

1.2、一对多

@Many 注解(多对一)

代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。

使用格式:

@Result(property="",column="",many=@Many(select=""))

注意:

聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;

2、一对一

2.1、需求分析

查询学生信息,加载该学生的班级信息

2.2、编写Classes.java文件

import java.io.Serializable; public class Classes implements Serializable { private int cid; private String cname; public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCname() { return cname; } public void setCname(String cname) { this.cname = cname; } @Override public String toString() { return "Classes{" + "cid=" + cid + ", cname='" + cname + '\'' + '}'; } }

2.3、修改Students.java文件

private Classes classes; public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; }

2.4、修改IStudentsDao.java文件

@Select("select sid,sname,ssex,sage,cid as c_id from students") @Results(id="studentsMap1",value={ @Result(id=true,column = "sid",property = "sid"), @Result(column = "sname",property = "sname"), @Result(column = "ssex",property = "ssex"), @Result(column = "sage",property = "sage"), @Result(column = "c_id",property = "cid"), @Result(column = "c_id",property = "classes", one=@One(select = "com.tianyi.dao.IClassesDao.findById",fetchType = FetchType.EAGER)) }) List<Students> findAll1();

2.5、编写IClassesDao.java文件

import com.tianyi.javabean.Classes; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; public interface IClassesDao { @Select("select * from classes where cid=#{cid}") @Results(id="classesMap",value={ @Result(id=true,column = "cid",property = "cid"), @Result(column = "cname",property = "cname") }) Classes findById(int cid); }

2.6、修改MbStudentsTest.java测试类

@Test public void findAll1(){ List<Students> list=studentsDao.findAll1(); for (Students s:list) { System.out.println(s); //System.out.println(s+":"+s.getClasses()); } }

3、一对多

3.1、需求分析

完成班级表与学生表的一对多的关系,查询出班级的信息和学生信息,学生信息只有在需要的时候才会显示。

3.2、编写Classes.java文件

private List<Students> studentsList; public List<Students> getStudentsList() { return studentsList; } public void setStudentsList(List<Students> studentsList) { this.studentsList = studentsList; }

3.3、编写IClassesDao.java文件

@Select("select * from classes") @Results(id="classesMap1",value={ @Result(id=true,column = "cid",property = "cid"), @Result(column = "cname",property = "cname"), @Result(column = "cid",property = "studentsList",many = @Many( select = "com.tianyi.dao.IStudentsDao.findById1",fetchType = FetchType.LAZY )) }) List<Classes> findAll();

3.4、修改IStudentsDao.java文件

@Select("select * from students where cid=#{cid}") Students findById1(int cid);

3.5、编写MbClassesTest.java文件

import com.tianyi.dao.IClassesDao; import com.tianyi.dao.IStudentsDao; import com.tianyi.javabean.Classes; 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.IOException; import java.io.InputStream; import java.util.List; public class MbClassesTest { private InputStream in; private SqlSession session; private IClassesDao classesDao; @Test public void findAll(){ List<Classes> list=classesDao.findAll(); for(Classes c:list){ System.out.println(c); } } @Before public void init()throws IOException { in= Resources.getResourceAsStream("SqlMapConfig.xml"); SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); SqlSessionFactory factory=builder.build(in); session=factory.openSession(); classesDao=session.getMapper(IClassesDao.class); } @After public void destroy() throws IOException { session.commit(); session.close(); in.close(); } }

4、二级缓存的开启

4.1、修改SqlMapConfig.xml文件

<!-- 配置二级缓存 --> <settings> <!-- 开启二级缓存的支持 --> <setting name="cacheEnabled" value="true"/> </settings>

4.2、持久层使用二级缓存

@CacheNamespace(blocking = true) public interface IClassesDao { }
需要 登录 才可以提问哦