文章主要是对Mytatis框架项目的运行思路加以总结,比较浅显,适合不懂的或者初学者,对Mybatis有一定研究的可直接跳过。
讲Mybatis框架配置运行之前先说一下常用到的Servlet、Service、Dao层的层次分工:
Servlet负责接受页面的值,向页面传值,若有相应的逻辑需要处理,则需要运用Service层。
Service层负责接受Servlet传递过来的值,并对该值进行处理,做一定的操作、算法等,比如说,若页面传过来的集合的值不符合Dao层的需要,则需要将其转化成需要的数据或数据格式。若有需要,则继续调用相应的Dao层。
Dao层负责完成和数据库的交互。在Mybatis中Dao层通过配置文件命名空间下的配置方法执行相应的Sql语句访问数据库,完成与数据库的交互。
知道了这三层的基本职责,再唠叨一下各种配置文件。
一个Mybatis的配置文件有log4j.xml web.xml Configuration.xml JavaDao.xml 其中:
log4j.xml文件: 通过此配置用以输出项目的运行日志,可根据此输出调试项目。日志文件配置详解见该篇章。
web.xml 文件:用来配置Servlet以及Servlet映射。
JavaDao.xml 文件:主要在命名空间下,配置数据库数据和JavaBean对象的映射关系,以及使用ognl标签灵活的拼接Sql语句,提供给SqlSession会话,使其执行。
Configuration.xml 文件:是Mybatis项目的核心配置文件,主要负责配置数据库访问环境
说了这么多,都是零零碎碎的东西,那么,想办法用一条线把上述的这些层和配置文件连接起来,最简单的就是从网页访问开始,看看整个过程怎么走:
用一个查询数据库消息列表的例子作图 ------放图镇楼 :
运行过程
客户在浏览器输入访问地址,系统会根据输入的访问地址在web.xml配置文件里找到映射的Servlet,然后根据该Servlet定义的Class,找到对应的Servlet.java类(上图橙色大方框中的配置内容)。
进入到Servlet层:Servlet.java接受页面传递过来的参数值(根据需要决定是否保存该值),将Servlet的处理结果传回给视图View层展示。(如果有业务逻辑需要处理,则调用Service层处理业务逻辑。)
进入到Service层:Service.java对象接受Servlet传递过来的值,并对该值进行处理,做一定的操作、算法等,比如说,若页面传过来的集合的值不符合Dao层的需要,则需要将其转化成需要的数据或数据格式。若有需要,则继续调用相应的Dao层。
进入到Dao层:Dao层使用核心配置文件Configuration.xml访问数据库的配置项初始化一个数据库访问会话SqlSession,利用SqlSession下访问数据库的方法SqlSession(”Message.queryMessageList”,messag)带入参数,调用Configuration.xml文件映射的JavaDao.xml配置文件,找到该文件命名空间(Message)下的对应方法(queryMessageList),执行ognl语言拼写的sql语句访问底层的数据库DataBase,将执行结果返回给Dao层。
Dao层将结果返回给Service层,Service层将结果返回给Servlet层,Servlet层通过页面重定向或页面转发将结果展示在View视图层。
附带配置文件:
Web.xml文件:
index.jsp
ListServlet
/List.action
ListServlet
hdu.terence.servlet.ListServlet
BASIC
Configuratieon.xml文件
JavaDao.xml文件(Message.xml)
在Mybatis项目中经常会遇到各种错误,有很多错误并不会在预编译阶段提示,经常让人头疼,因此,笔者觉得有必要将一些常见错误一一列出,借此敲个警钟:
1.获取自增主键值
2.找不到namespace.id的异常效果
Cause: java.lang.IllegalArgumentException: Mapped Statements collectiondoes not contain value for Message.queryMessageList
3.排查SQL语法错误
### Error querying database. Cause:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQLsyntax; check the manual that corresponds to your MySQL server version for theright syntax to use near 'message WHERE 1=1' at line 1
4.不要过度使用${}
5.乱码问题
------------------------------------------------------------------------------------------------------------------------------
(1)文件本身的编码(程序文件编码)
(2)数据库编码、建表编码、列属性编码
(3)Jsp页面编码;
(4)读取数据库连接对象url的编码;
<propertyname="url"value="jdbc:mysql://127.0.0.1:3306/micromessage?useUnicode=true&characterEncoding=UTF- 8&zeroDateTimeBehavior=convertToNull"/>
(5)页面传值的编码;
------------------------------------------------------------------------------------------------------------------------------