SSM项目程序运行到mapper就app停止运行如何解决不运行了不执行SQL也不报错求求大神给个解决办法吧!!!

小弟想学习一下Mybatis于是照着这篇夶神的博文依样画葫芦,但是每一步都几乎相同了最后总会报这个错 最后是测试类,Service里面只有一个方法就不用贴了吧 }
运行测试方法之後就会报错,确实不知道什么地方配置错了或怎么样请各路大神帮忙看看,多谢多谢

整合放在了github上,大家有需要的鈳以去看看接下里也会进行进一步的修改增加功能首先在...

SSM中各层作用及关系 1.持久层:DAO层(mapper层)(属于mybatis模块) DAO层:主要负责与数据库进行茭互设计,用来处理数据的持久化工作 DAO层的设计首先是设计DAO的接口,也就是项目中你看到的Dao包 ...

eclipse/ ...上篇介绍了使用命令行编译打包運行自己的MapReduce程序使用 Eclipse 更加方便。要

先说下问题产生的背景:

最近在莋一个用到MyBatis的项目其中有个业务涉及到关联查询,我是将两个查询分开来写的即嵌套查询,个人感觉这样更方便重用;

因为出现了这個问题在解决的时候一连串又发现了一些其它新的问题,比如关联查询时的效率问题以及映射。通过百度看文档基本解决,做个笔記

现在简单的用学生和年级两个对象来做实验,学生有一个年级属性年级有一个学生集合属性。

先把一些基础的代码贴出来:

加载配置文件获取SqlSession工具类:

先看看产生问题的与学生和年级对应的映射配置:

GradeMapper.xml:动态Sql本意是想如果有一个查询所有年级和根据id来查询年级的业務时就可以使用同一个查询了。

注意这里年级还有一个学生集合没有映射到gradeResult里面如果映射了会循环查询最终导致栈溢出的,后面再说

峩的本意是各自的业务分开来写,我要查询学生时就调用getStudent要查询年级时就调用getGrade,而我要查询学生的同时还要查询其关联的年级这样我吔可以调用getGrade来完成,这样能很好的实现重用

刚开始真的没明白怎么回事,在Integer中找不到id属性?

百度了很久原因是在查询到一条记录的時候就会将id注入,而且不管#{id}的名称就是说你随便写也能查出结果来,第9行代码:

不管输入参数名称是什么mybatis最终会执行:

所以我之前用動态sql时去判断id,其实是不存在id的所以导致那样的错误!!

二、嵌套结果查询导致的循环查询栈溢出

如果这样使用联合查询,其实还存在叧外一个问题:学生下有年级年级下有学生集合,这样查询下去只有栈溢出了....

GradeMapper.xml:注意此时映射了学生集合的第6行代码

这样看来,最终嘟还是要分开写就是说我想查询年级和查询学生时联合查询年级要写两个select才行,并没能达到重用的目的

但是相信程序员都是有强迫症嘚,这样有点不爽我就又百度,看能不能很好的重用结果是没有百度到。

但是在看文档的时候发现了另一个问题:联合查询分开写查询语句是很消耗性能的,明明可以只用执行一次查询却执行了两次甚至更多次。

文档是这样说的:这种方式很简单但是对于大型数據集合和列表将不会表现很好。问题就是我们熟知的“N+1 查询问题”

N+1 查询问题可以是这样引起的:

1. 你执行了一个单独的 SQL 语句来获取结果列表(就是“+1”)

2.对返回的每条记录,你执行了一个查询语句来为每个加载细节(就是“N”)

这个问题会导致成百上千的 SQL 语句被执行这通常不是期朢的。

上面的叫做[关联的嵌套查询]

所以自然有另一种方法----[关联的嵌套结果](文档上这样说的):联合两张表在一起代替了执行一个分离的语呴。

映射的时候是将年级和学生一起映射的这个就叫做嵌套结果映射。然后是sql语句使用的是联合查询。

这里又遇到了几个问题:

1.在之湔写resultMap映射时我是一般不爱将属性映射写出来的,因为mybatis会自动映射的但是这里不行了。

在嵌套结果映射时哪个属性没有映射那么这个徝就是空的,查询出来的结果不会注入到对象中所以必须将所有属性都显示映射出来。

mybatis其实就是使用resultSet.getString("name")这样的方式来获取值的所以联合查询时两张表的字段名不能重复。

或者可以在配置文件中配置好映射和sql语句如下:注意第8、9行代码,重新配置column;以及sql语句但是如果属性过多,sql代码可能就有点长了所以最好还是保持字段名不一样吧。

3.最后是在文档中看到的一个比较重要的问题最好是要显示映射出id。矗接复制原话:

非常重要:在嵌套结果映射中 id 元素扮演了非常重要的角色应该通常指定一个或多个属性,它们可以用来唯一标识结果

實际上就是如果你不使用它(id 元素) ,但是会产生一个严重的性能问题不过 MyBatis 仍然可以正常工作。

选择的属性越少越好它们可以唯一地标识結果。主键就是一个显而易见的选择(即便是联合主键)

刚学完mybatis不久,现在正在做的这个项目(视频教程当练手)本来是struts+spring+ibatis的,我想着ibatis也算是过詓式了恰好前阵刚学了mybatis还没实战过,就把ibatis换成了mybatis

不过只是知道怎么使用,很多细节性的东西还没深入了解所以这篇博客也只是开发Φ遇到的一些问题解决后做个笔记,大部分都属于个人理解有些可能不全面,希望有不同见解的朋友一起交流~~O(∩_∩)O~~

我要回帖

更多关于 app停止运行如何解决 的文章

 

随机推荐