Mybatis遇到的一对多,多对多封装问题汇总
程序员文章站
2022-04-24 10:52:17
...
一对多
环境:仅使用mybatis框架配置
- 要对pojo类进行配置
在以往写代码顺手之后忘记配置,最好一下配置好包,省掉一些麻烦
<typeAliases>
<package name="com.mybatis.pojo"/>
</typeAliases>
- 对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>
- POJO类是否添加对另一个POJO的封装
List集合封装一对多的另一个多的POJO类的信息,被封装的类也与下面类似
public class TTeacher {
private Integer id;
private String name;
private List<TStudent> students;
//get/set
//无参(必须有,用以反射),有参,toString
}
- Mapper.java的接口中一对多的返回值应该是TTeacher类型或其他可封装的List,Map。
public interface Many2ManyMapper {
//查询老师1号教了哪些学生
TTeacher selectTeacherWithStudent(Integer teacherId);
}
- 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>
多对多
多对多与一对多很相似,出错可以照着上面的来排查。
-
数据库设计
要设计两个多对多的关系,要设计三张表,比如老师对学生,出老师表,学生表之外,要再设计一张表存储老师和学生的关系表这样方便查询。 -
POJO类的设计
以老师和学生为例,只要设计老师和学生的POJO类即可,同时要分别对应加上相应的List,用于查询结果存储。
其余与上述一对多相似。另建议使用【嵌套结果】,而非【嵌套查询】,这样会提高一些性能。
推荐阅读
-
关于MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)
-
MyBatis一对多嵌套查询的完整实例
-
Mybatis学习笔记------mybatis的多表查询-一对多
-
Mybatis常用的注解开发CRUD&&复杂关系映射(一对一,一对多)&&mybatis 基于注解的二级缓存
-
【MyBatis系列4】一对一,一对多,多对多查询及延迟加载(N+1问题)分析
-
数据库一对多,多对一, 多对多的问题
-
绝对干货 excel中一对多查找问题解决思路汇总 附公式模型
-
Mybatis一对多和多对一的处理
-
解决mybatis一对多查询resultMap只返回了一条记录问题
-
laravel5一对多的create问题