SpringMVC+MyBatis项目总结(二)
2015-06-05 19:30
1031 查看
以前用SSH框架做项目,感觉说不上复杂,也不算容易,重复性工作不少,这次换了SpringMVC和Mybatis,由于是第一次这么写,中间碰到了不少麻烦,首先是Mybatis的一对多,多对多关系的配置,真的挺麻烦的,一会用resutType,一会用resultMap,中间好几次写了resultMap='int',然后一点一点查问题。之前又没有用过,出了异常经常都找不到问题,还得网上各种查。。。。。。
这次自己手动写SQL语句,遇到了不少麻烦,原本以为HQL换成了SQL语句灵活性大了很多,确实是这样,但是这只是写分页之前,分页部分折腾我一天,查了好多资料,最后还是用临时表解决了分页问题。
先说一下Mapper文件的配置
直接就以图书的Mapper配置文件来说吧,扩展类对应的配置文件
这个多表联合条件查询+分页真的把我恶心到了,开始没有用这种方式写,就是多表直接连接,然后加上条件,最后直接limit,结果就是查出来的数据有问题,因为作者和图书是多对多关系,Mybatis吧多条数据合并成list了,显示结果就出问题了。
想过解决办法,开始想用3层查询,先查出来结果(id),然后查询id位于第一次查询的结果并且分页,最后查询所有字段,in分页的结果,然后mysql无情的提示我limit和in不能同时使用,瞬间崩溃。
然后就考虑使用N+1的方式,第一次只查询图书,类型,出版社相关信息,作者做2次查询,结果也碰到了问题,就是作者查询不知道怎么传递参数了(嵌套查询貌似只能试用之前查出来的结果,不能用外面传进来的参数?这个以后继续研究。。。),最后没办法,只好放弃了。。
今天网上查了查limit和in共同使用的方法,没想到很意外,竟然找到了,原来再多做一次嵌套查询,就可以避免in和limit的冲突关系了~
话说这个问题解决后,真的发现hibernate做的强大!!!setFirstResult,SetMaxResult就直接搞定了,管你条件查询,多对多关系,通吃!
分页部分我把之前SSH中分页标签插件直接改了个拿来没想到竟然可以直接使用~喜出望外~~~
另外找到了一个MybatisPageHelper分页插件,用了拦截器,貌似还是简单的可以直接使用,麻烦点的貌似还是不成,回头在研究研究~
这次自己手动写SQL语句,遇到了不少麻烦,原本以为HQL换成了SQL语句灵活性大了很多,确实是这样,但是这只是写分页之前,分页部分折腾我一天,查了好多资料,最后还是用临时表解决了分页问题。
先说一下Mapper文件的配置
直接就以图书的Mapper配置文件来说吧,扩展类对应的配置文件
<mapper namespace="cn.edu.bjut.zj.tims.mapper.BookMapperExtend" > <resultMap id="BaseResultMap" type="cn.edu.bjut.zj.tims.entity.BookExtend" > <id column="BOOKID" property="bookid" jdbcType="INTEGER" /> <result column="TYPEID" property="typeid" jdbcType="INTEGER" /> <result column="PUBLISHERID" property="publisherid" jdbcType="INTEGER" /> <result column="BOOKNAME" property="bookname" jdbcType="VARCHAR" /> <result column="NUM" property="num" jdbcType="INTEGER" /> <result column="ISBN" property="isbn" jdbcType="VARCHAR" /> <result column="PRICE" property="price" jdbcType="INTEGER" /> <result column="PUBLISHERNAME" property="publishername" javaType="string" /> <result column="TYPENAME" property="typename" javaType="string" /> <result column="PRICE" property="price" jdbcType="INTEGER" /> <collection property="alist" ofType="cn.edu.bjut.zj.tims.entity.Author"> <id column="AUTHORID" property="authorid" jdbcType="INTEGER" /> <result column="AUTHORNAME" property="authorname" jdbcType="VARCHAR" /> </collection> </resultMap> <select id="queryAllBook" parameterType="cn.edu.bjut.zj.tims.entity.BookVo" resultMap="BaseResultMap"> SELECT b.BOOKID, b.TYPEID, b.PUBLISHERID, b.BOOKNAME, b.NUM, b.ISBN, b.PRICE, p.PUBLISHERNAME, t.TYPENAME, a.AUTHORNAME, a.AUTHORID FROM t_author a INNER JOIN t_abref r ON a.AUTHORID = r.AUTHORID INNER JOIN t_book b ON r.BOOKID = b.BOOKID INNER JOIN t_publisher p ON p.PUBLISHERID = b.PUBLISHERID INNER JOIN t_type t ON t.TYPEID = b.TYPEID WHERE b.BOOKID IN (SELECT bookid FROM ( SELECT BOOKID FROM t_book WHERE bookid IN (SELECT t_book.BOOKID FROM t_author INNER JOIN t_abref ON t_author.AUTHORID = t_abref.AUTHORID INNER JOIN t_book ON t_abref.BOOKID = t_book.BOOKID INNER JOIN t_publisher ON t_book.PUBLISHERID = t_publisher.PUBLISHERID INNER JOIN t_type ON t_book.TYPEID = t_type.TYPEID <where> <if test="typeid!=0"> and t_book.TYPEID=#{typeid} </if> <if test="bookname!=null and bookname !=''"> and bookname like #{bookname} </if> <if test="authorid!=0"> and t_author.authorid=#{authorid} </if> </where> )LIMIT #{page.firstResult},#{page.maxResults}) AS tb) </select> </mapper>
这个多表联合条件查询+分页真的把我恶心到了,开始没有用这种方式写,就是多表直接连接,然后加上条件,最后直接limit,结果就是查出来的数据有问题,因为作者和图书是多对多关系,Mybatis吧多条数据合并成list了,显示结果就出问题了。
想过解决办法,开始想用3层查询,先查出来结果(id),然后查询id位于第一次查询的结果并且分页,最后查询所有字段,in分页的结果,然后mysql无情的提示我limit和in不能同时使用,瞬间崩溃。
然后就考虑使用N+1的方式,第一次只查询图书,类型,出版社相关信息,作者做2次查询,结果也碰到了问题,就是作者查询不知道怎么传递参数了(嵌套查询貌似只能试用之前查出来的结果,不能用外面传进来的参数?这个以后继续研究。。。),最后没办法,只好放弃了。。
今天网上查了查limit和in共同使用的方法,没想到很意外,竟然找到了,原来再多做一次嵌套查询,就可以避免in和limit的冲突关系了~
话说这个问题解决后,真的发现hibernate做的强大!!!setFirstResult,SetMaxResult就直接搞定了,管你条件查询,多对多关系,通吃!
分页部分我把之前SSH中分页标签插件直接改了个拿来没想到竟然可以直接使用~喜出望外~~~
另外找到了一个MybatisPageHelper分页插件,用了拦截器,貌似还是简单的可以直接使用,麻烦点的貌似还是不成,回头在研究研究~
相关文章推荐
- SQL中的三值逻辑
- SQL Server 作业批量停止
- 结束SQL阻塞的进程
- 动态生成SQL Server视图作业
- SQL Server 语句操纵数据库
- SQL(结构化查询语句)
- oracle sql日期比较
- linux快速部署mysql服务器
- more、less 和 most 的区别
- sql 存储过程分页
- 在WINXP系统上安装SQL Server企业版的方法
- 通过批处理调用SQL的方法(osql)
- SQL Server 存储过程的分页
- ASP程序与SQL存储过程结合使用详解
- SQL SERVER编写存储过程小工具
- 防御SQL注入攻击时需要注意的一个问题
- PostgreSQL教程(十九):SQL语言函数
- SQL Server复制需要有实际的服务器名称才能连接到服务器