项目场景:
客户管理系统完成个人表和身份证号表一对一关系的查询,有两种方法可完成:- 嵌套查询(两条sql语句分开查询,也就是子查询方式)
对应的sql语句:
SELECT * FROM person WHERE id=1
SELECT * FROM idcard WHERE id=1
id字段均是两个表的主键 - 嵌套结果(设置两个表的内连接)
对应的sql语句:
SELECT p.*,i.idcode FROM person p,idcard i WHERE p.card_id=i.id AND p.id=1 或
SELECT * FROM person p INNER JOIN idcard i ON p.id=i.id WHERE p.id=#{id}
问题描述:
-
运行嵌套查询时报错
-
执行嵌套查询时报错,错误提示表明是sql语句的错
-
执行嵌套查询时报错,错误是说person实体类中没有card这个字段
-
是否支持懒加载的fetchType属性报错
- 使用第二种嵌套结果方式查询结果为空
原因分析:
原因分析不过多解释,因为有很多都可以通过提示信息找出来,直接看解决方案即可。
解决方案:
- select标签的parameterType属性值单词拼写错误应该是Integer而不是Interger
- sql语句中from关键字后的表名和库里的表名不一致;库里是idcard,应修改为idcard,而不是tb_idcard
- association标签中property属性值错误,应该是card_id
property属性:是执行sql语句返回的类型,应该对应实体类所起的名字 - mapper 文件的文件头内容不对,可能是版本较低导致标签支持的属性较少,更换mapper文件的文件头即可
- 因为是使用的第二种方式嵌套结果而输出语句要输出的内容是对象的某个字段,运行结果自然为空。输出对象的某个字段可通过懒加载的方式实现,但是懒加载只可用于嵌套查询(执行两条sql语句),不可用于嵌套结果,输出结果自然就为空了,将输出语句改为person对象即可
- 通过错误信息可看出是映射文件的错,原因是userID那个字段不应该写在result标签里了,因为在association标签里写了userID,将result标签里的userID去掉即可
还有很多问题在此就不一一列举了,要学会看错误信息。 例如,找不到方法要考虑是否在mybaits-config.xml中配置了mapper映射文件的位置;方法名是否一致;mapper文件中的namaspace属性是否和文件名一致;配置文件的内容等诸多问题。要学会有耐心,仔细检查代码运行步骤。鉴于刚开始写博客,很多还不熟悉,若有问题欢迎私信告知,若需要文档中的某个资源,私信可发