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

Mybatis遇到的一对多,多对多封装问题汇总

程序员文章站 2022-04-24 10:52:17
...

一对多

环境:仅使用mybatis框架配置
  1. 要对pojo类进行配置
    在以往写代码顺手之后忘记配置,最好一下配置好包,省掉一些麻烦
	<typeAliases>
		<package name="com.mybatis.pojo"/>
	</typeAliases>
  1. 对mybatis-config.xml进行配置,这个我特别容易忘,不过一旦报错,进会很容易根据报错找到
    错误信息:Type interface com.mybatis.mappers.Many2ManyMapper is not known to the MapperRegistry.
    示例代码:
<mappers>
		<mapper resource="com/mybatis/mappers/One2OneMapper.xml"/>
		<mapper resource="com/mybatis/mappers/Many2ManyMapper.xml"/>
</mappers>
  1. POJO类是否添加对另一个POJO的封装
    List集合封装一对多的另一个多的POJO类的信息,被封装的类也与下面类似
public class TTeacher {
private Integer id;
private String name;
private List<TStudent> students;
//get/set
//无参(必须有,用以反射),有参,toString
}
  1. Mapper.java的接口中一对多的返回值应该是TTeacher类型或其他可封装的List,Map。
public interface Many2ManyMapper {
	//查询老师1号教了哪些学生
	TTeacher selectTeacherWithStudent(Integer teacherId);
}
  1. Mapper.xml的配置
    命名空间 按 Ctrl+单击 测试是否配置正确。
    column属性应与查询结果对应,切记是与查询结果对应,不是不数据库的列名对应
    我就这个问题弄了半天,所有的结果都对,SQLPLUE也能查来,就是封装不了。后来发现我对查询结果起了别名,与column不能一一对应,造成封装失败,返回null。
<mapper namespace="com.mybatis.mappers.One2ManyMapper" >
	<resultMap type="TStudent" id="TStudentResult">
		<id property="id" column="TSID" />
		<result property="name" column="SNAME" />
	</resultMap>
	<resultMap type="TTeacher" id="TTeacherResult">
		<id property="id" column="id" />
		<result property="name" column="name" />
		<collection property="students" resultMap="TStudentResult"></collection>
	</resultMap>

多对多

多对多与一对多很相似,出错可以照着上面的来排查。

  1. 数据库设计
    要设计两个多对多的关系,要设计三张表,比如老师对学生,出老师表,学生表之外,要再设计一张表存储老师和学生的关系表这样方便查询。

  2. POJO类的设计
    以老师和学生为例,只要设计老师和学生的POJO类即可,同时要分别对应加上相应的List,用于查询结果存储。
    其余与上述一对多相似。另建议使用【嵌套结果】,而非【嵌套查询】,这样会提高一些性能。