项目搭建之路(中)
首先说明这个项目的的目的和意图,我学java 有两年多了,其中遇到很多的bug,但是从来都没有去总结,或者只是遇到就松松散散的记忆一下,但是随着技术能力的提升,我觉得一个菜鸟从借鉴别人的轮子,到仿造别人的轮子来满足自己或者公司的需求是不够的,
应该自己创造轮子,但是,为什么要自己创造轮子呢,因为别人的肯定不是你想要的呗。或者说不能满足你的需求。
所以我决定用从公司学到的技术来满足自己目前的需求。
这个需求简单的说明就是,每个编程菜鸟在编程的过程中都会遇到很多的bug,但是没有总结就没有成长,这是第一点需求,第二,当菜鸟第二次遇到这个错的时候,可能长时间已经忘了解决方法了,还要从头再百度,再次进行信息的筛选,然后尝试各种可能的方案。
这是个很浪费时间的事情。第三,大多数程序员或者都或多或少的犯一些低级的错误,如果能有火眼金睛则会很快排查到错误代码。不过很多逻辑性的,或者更为隐蔽的bug,是很难找到的。
基于以上需求我在github上建立了一个开源项目:
https://github.com/coderManFans/bugmanager
说明,在我的上一篇博客《项目搭建之路》中说的就是这个项目,当那篇博客完成的时候,刚好我的项目能够启动,然后就开始编写业务层的代码了,其实里面隐藏了两个非常严重的bug,或者说非常粗心的错误,这也让我有时间来反思自己对使用框架的相关知识了解多少,对我能掌握的知识了解多少,或者说在一定程度上这个项目体现了我的个人能力。
这里再次说明一下这个项目的开发环境以及使用的相关技术:
Spring+ spring mvc +maven + mybatis + mysql
项目测试使用的是Junit,
前端使用的是mock mvc.+spring-test框架
当然有几个部分是没有用过的,比如使用的两个前端的测试框架这同样让我成长了不少。
于是在写完大部分业务层的时候,开始进行Controller层的web测试,结果就开始爆发了各种错误,这对于整个项目的初期是非常好的现象,意味着很多代码都将是健康的。对后来的开发会节省很多时间和精力。
我将用到两篇博客来说明我遇到的种种框架的错误,依赖的错误,粗心导致的错误,力求将每个错误都分析到有答案为止,如果有可能这个项目可以帮助更多的编程爱好者少走弯路,毕竟这个世界上的人有很多人都走了不少弯路。才造就了当今少有的捷径。
下面是问题陈述和相关的解决方式和解决指导:
首先是mybatis的框架错误,如果业务繁多的话,对基本业务代码进行覆盖率全面的测试有助于提高生产效率和节约成本,这当然也是我的经验,和读书的经验,我最近在读《人月神话》,有兴趣的可以给我留言,谈论观点。
问题一:
### Error updating database. Cause: java.sql.SQLException: Invalidargument value:
java.io.NotSerializableException
解决方式
sql参数无效,说明,参数需要对象名.属性名,不是单纯的属性名,这里在mapper,对应的接口方法中设置了注解
绑定的参数。比如:
int addBugType(@Param("bugType") BugType bugType);
应该用面向对象的方式进行访问。
解决实例:
<insert id="addBugType" >
insert into t_bugtype (bug_type,bug_introduce) VALUES(#{bugType.bugType},#
{bugType.bugTypeIntroduce})
<selectKey resultType="int"keyProperty="bugTypeId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
问题二:
Caused by:org.apache.ibatis.reflection.ReflectionException: There is no getter forproperty named
'bug_typeid' in 'classcn.com.bugmanger.bugcontent.model.BugContent'
<updateid="updateBugContent">
update t_bugcontent set bug_reason=#{bugContent.bugReason},console_error= #
{bugContent.consoleError},
bug_code=#{bugContent.bugCode},bug_typeid=#{bugContent.bug_typeid},bug_solutionid=#
{bugContent.bugSolutionId}
where bug_contentid = #{bugContent.bugContentId}
</update>
解决指导:
语句中属性名错误,请认真检查sql语句。
学习总结:
sql语句中where 1=1 中表示:
1.用于动态sql,没有查询限制条件,即使查询项为null,也可以让sql语句运行正常
where 1<>1:
1<>1 的用处:
用于只取结构不取数据的场合
问题三:
; bad SQL grammar []; nested exception iscom.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Query
was empty
问题指导:
mapper.xml 没写映射语句。。
问题四:
<select id="getUserListPage"resultType="cn.com.bugmanger.security.model.User">
SELECT * FROM t_buguser
WHERE 1=1
<if test="user.userName != null and user.userName !=''">
AND user_name LIKE concat('%',#{user.userName},'%'),
</if>
<if test="user.email != null and user.email !=''">
AND email LIKE concat('%',#{user.email},'%'),
</if>
<if test="user.userState != null and user.userState!=''">
AND user_state LIKE concat('%',#{user.userState},'%')
</if>
</select>
解决说明:语法错误<if></if>中不允许有,号
当然还有其他方面的错误,我在下一篇博客中会说明。