笔记六(项目总结)

        本次项目的实践过程是为了熟悉mybatis的sql编写操作以及其熟悉其组成部分,并且熟悉ftl文件的编写,以及各种联动操作的实现。

mybatis部分

        熟悉mybatis中的基本标签,本次项目中所使用到的标签包括<sql>/<insert>/<delete>/<update>/<select>、这些作为基本的查询使用的,还有用于动态拼接SQL语句的几个标签<where>/<if>/<foreach>,这三个是使用到的,还有没用到的<choose><set>标签。还有一个可以设置返回类型的转换<resultMap>标签。而在动态拼接SQL的几个标签中肯定需要多条件判断,但是这里的判断不能使用“&&/||”字符来连接,只能够使用“and/or”的方式来连接。

        mybatis中的事务控制并不是非常的严格,如笔记一中描述的,即使切入的方法不存在也不会报错,只是不能在该方法出错之后进行数据库的回滚操作。但是对于其数据源的以及事务管理的<bean>配置确实不太清楚其为什么要这么配置,也可能是对于Spring中的<bean>注入不太明白。

        mybatis中存在有对象关系间的配置,但是这样的配置需要在<resultMap>标签中进行编写,比如一对一管理<association>还有一对多管理使用<collection>来进行配置,这也是多表查询的一种方式。

       每种框架都会设置有自己相对应的注解开发模式,mybatis也不例外。它也可以使用注解模式来进行开发,这里附一个例子

package cn.mldn.szq.mapper.book;

import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import cn.mldn.szq.model.Book;

public interface IBookDAO {
	
	@Insert("INSERT INTO b_book (bookid,booktitle,bookprice,bookauthorid,booktypeid,bookpubdate,bookintro) "
            + " VALUES(mo_sq.nextval,#{bookTitle},#{bookPrice},#{bookAuthorId},#{bookTypeId},to_date(#{bookPubdate},'yyyy-MM-dd'),#{bookIntro})")
	public void doCreate(Book vo);
	
	
	@Select("<script>"
			+ "SELECT b.bookid AS bookId,b.booktitle AS bookTitle,b.bookprice AS bookPrice, b.bookauthorid AS bookAuthorId,b.booktypeid AS bookTypeId, to_char(b.bookpubdate,'yyyy-MM-dd') AS bookPubdate,b.bookintro AS bookIntro, "
			+ "a.authorid AS "+"\"bookAuthor.authorId\" "
			+" ,a.authorname AS "+" \"bookAuthor.authorName\""
			+",to_char(a.authorbirth,'yyyy-MM-dd') AS "+"\"bookAuthor.authorBirth\" "
			+", t.bktypeid AS "+"\"bookType.bkTypeId\""
			+", t.bktypetitle AS "+" \"bookType.bkTypeTitle\""
			+" FROM b_book b,b_author a,b_booktype t "  
			+" WHERE b.bookauthorid=a.authorid AND b.booktypeid=t.bktypeid"
			+ "  <if test='null != bookId and 0 != bookId'> AND b.bookid=#{bookId} </if>"
			+ " <if test='null != bookAuthorId and -1 != bookAuthorId'> AND b.bookauthorid=#{bookAuthorId}</if>"
			+ " <if test='null != defaultcolumn and defaultcolumn != 0'> AND b.booktitle LIKE '%${bookTitle}%' OR a.authorname LIKE '%${bookAuthorName}%'</if>"
			+ " <if test='null != bookTitle and \"\" != bookTitle and defaultcolumn == 0'> AND b.booktitle LIKE '%${bookTitle}%'</if>"
			+ " <if test='null != bookTypeId and -1 != bookTypeId'> AND b.booktypeid=#{bookTypeId}</if>"
			+ " <if test='null != bookAuthorName and \"\" != bookAuthorName and defaultcolumn == 0'> AND a.authorname LIKE '%${bookAuthorName}%'</if>"
			+ "</script>")
	public List<Book> findAll(Book vo);
}


        在注解方式下可以看出,他只适合于简单的SQL语句,如果进行动态的SQL还是使用配置文件的方式比较方便。通过观察可以发现:

        ①注解模式下如果要动态拼接SQL,首先需要在语句的开始和结尾加入“<script></script>”标签才可以生效。
        ②因为其本身就是字符串的拼接,所以当单双引号重复出现的时候需要转义才可以。
        ③在进行模糊查询的时候,为了取指方便而不需要动态拼串,所以此处使用“${}”来取值是比较合适的

        综合来看,注解模式有其优势之处,当存在一些简单的查询或者更新操作,或者删除操作时,完全可以使用注解方式来完成,也省去了配置文件的建立,但是如果进行复杂查询的时候,这样的注解反而 有些鸡肋了,因为他的拼接字符串的过程都超过了在配置文件中的书写,而且正确性也很难保证。

ftl(FreeMarker)部分

       之前使用的一直都是jsp来作为前台页面信息展示,而ftl更是闻所未闻的名词,只是听闻它属于一种静态页面,而jsp属于一种动态页面。但是并没有体会到它们两者之间到底有什么区别。同为展示页面,都需要从动态显示从后台获取到的数据,都需要动态的设置项目名称的配置,比如:

jsp与ftl对比
对比内容 jsp ftl
获取项目名称 <%=request.getContextPath()%> <assign base=request.contextPath>/${base}
输出空值 ${}本就判断空值 ${}和#{}在数据后面加“!’
if判断 <c:if test="${hero.heroType==1 }">selected</c:if> <#if vo.bookStatus == 1>checked</#if>
循环 <c:forEach items="${list }" var="h"></c:forEach> <#list allBooks as vo></#list>
调用方法 <c:if test="${hero.heroSkill.contains('1') }">checked</c:if> <#if vo.bookLabel?contains('1')>checked</#if>

描述:
①jsp中使用<%=request.getContextPath()%>来指定文件的项目名称前缀,而ftl则使用用<assign base=request.contextPath>方式。
②在展示数据方面,jsp与jstl和el标签结合,其中有很多的标签库<c:if>/<c:foreach>,而到了ftl页面中使用的是<#list><#if>。
③jsp中的el表达式${}本很就有判断空值的功能,如果为空就不展示内容,而到了ftl页面中${}和#{}判断空值需要使用“!’来进行修饰。
④jsp中的el表达式判断按照<c:if test="${hero.heroType==1 }">selected</c:if>方式,在ftl中:“<#if vo.bookStatus == 1>checked</#if>”。
⑤jsp中调用方法<c:if test="${hero.heroSkill.contains('1') }">checked</c:if>,ftl中:“<#if vo.bookLabel?contains('1')>checked</#if>”。
⑥jsp中循环的方式<c:forEach items="${list }" var="h"></c:forEach>,ftl中:<#list allBooks as vo></#list>

扫描二维码关注公众号,回复: 2345678 查看本文章

        为了更好的展示并且练习这些内容,接下来会将这种单一的前台页面,改用为前台框架进行展示。前台框架会使用easyui,easyui中的布局以及相关组件都非常的简化了前台内容的编写,所以后续的练习中,加入easyui框架。

附录:项目压缩包


       

猜你喜欢

转载自blog.csdn.net/xiaoxiaoqiang666/article/details/81126576
今日推荐