Mybatis框架项目运行
文章主要是对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项目的核心配置文件,主要负责配置数据库访问环境<environments>(即数据库连接的几个要素:驱动、url、用户名、密码)和JavaDao.xml文件的映射配置<mappers>文件,以便使用数据库访问环境连接数据库并通过映射配置找到对应的映射文件JavaDao.xml,在该文件的命名空间下找到对应的数据库访问方法,执行对应的Sql语句访问数据库。
说了这么多,都是零零碎碎的东西,那么,想办法用一条线把上述的这些层和配置文件连接起来,最简单的就是从网页访问开始,看看整个过程怎么走:
用一个查询数据库消息列表的例子作图 ------放图镇楼 :
运行过程
客户在浏览器输入访问地址,系统会根据输入的访问地址在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文件:
<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<servlet-mapping>
<servlet-name>
ListServlet
</servlet-name>
<url-pattern>
/List.action
</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>
ListServlet
</servlet-name>
<servlet-class>
hdu.terence.servlet.ListServlet
</servlet-class>
</servlet>
<login-config>
<auth-method>
BASIC
</auth-method>
</login-config>
</web-app>
Configuratieon.xml文件
<?xml version="1.0"encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value=""/>
</transactionManager>
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--url连接,注意编码方式的指定-->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/micromessage?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--映射配置文件,多个配置文件可以写多个mapper映射-->
<mappers>
<mapper resource="hdu/terence/config/sqlxml/Message.xml"/>
<mapper resource="hdu/terence/config/sqlxml/Command.xml"/>
<mapper resource="hdu/terence/config/sqlxml/CommandContent.xml"/>
</mappers>
</configuration>
JavaDao.xml文件(Message.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!--配置SQL语句提供给SqlSession,使其执行-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Message">
<resultMap type="hdu.terence.bean.Message" id="MessageResult">
<!--存放Dao值-->
<!--type是和数据库对应的bean类名Message-->
<id column="id" jdbcType="INTEGER" property="id" />
<!--主键标签-->
<result column="COMMAND" jdbcType="VARCHAR" property="command" />
<result column="DESCRIPTION" jdbcType="VARCHAR" property="description"
/>
<result column="CONTENT" jdbcType="VARCHAR" property="content" />
</resultMap>
<select id="queryMessageList" parameterType="hdu.terence.bean.Message"
resultMap="MessageResult">
SELECT ID,COMMAND,DESCRIPTION,CONTENT FROMmessage WHERE 1=1
<if test="command!=null and!" ".equals(command.trim())">
and COMMAND=#{command}
</if>
<if test="description!=null and!" ".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</select>
</mapper>
Mybatis项目常见错误
在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)页面传值的编码;
------------------------------------------------------------------------------------------------------------------------------