这篇文章主要讲 MyBatis 的配置, Spring MVC 的配置,以及 SSM 整合配置。此文章仅涉及常用的基本设置。
本文章是基于我个人的理解和知识水平,通过查阅资料所写下的笔记总结,主要是方便自己记住常用的基本配置。更详细的知识点请参见文末的参考资料。
MyBatis 配置
在工程的 src 文件夹下创建 MyBatis 配置文件SqlMapConfig.xml
一个简单例子如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| <?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" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="admin" /> </dataSource> </environment> </environments>
<mappers> <mapper resource="mapper/Student.xml"/> </mappers> </configuration>
|
各常用便签配置顺序大致如下:
configuration
properties
settings
typeAliases
environments
environment
transactionManager
dataSource
mappers
properties
properties 包含可外部化的,可替换的属性,可以在典型的Java属性文件实例中配置,或通过 properties 元素的子元素传入。例如:
1 2 3 4
| <properties resource="org/MyBatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
|
然后这些属性可以在整个SqlMapConfig.xml
配置文件中使用。
注意加载属性的顺序:先读取 properties 元素的子元素定义的属性。然后读取 properties 元素中 resource 加载的属性,它会覆盖已读取的同名属性。
(一般建议不要在 properties 元素体内定义属性,只将属性定义在 properties 文件中。)
一个常见的例子是,在 db.properties
中配置 dataSource 参数:
1 2 3 4
| jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf-8 jdbc.username = root jdbc.password = admin
|
同时改动 SqlMapConfig.xml
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <properties resource="db.properties"> </properties>
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
|
通过这种方式配置,可以方便对数据库参数的统一管理
settings
settings 可以配置 MyBatis 在运行时的行为方式,比如:开启延迟加载(默认没有开启),开启二级缓存(默认没有开启)等。
1 2 3 4 5 6 7 8 9
| <settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> <setting name="cacheEnabled" value="true"/> </settings>
|
注意:开启二级缓存除了在 settings 中设置,还需要在别的地方设置,这里不多说
typeAliases
typeAliases,指的是类型别名 。
我们在mapper.xml
中给 resultType 或者 parameterType 中指定映射 java 类型时,需要输入类型的全路径。例如:
1 2 3
| <select id="findAuthorById" parameterType="int" resultType="domain.blog.Author"> SELECT * FROM author WHERE id=#{value} </select>
|
我们可以使用类型别名,方便开发。在 SqlMapConfig.xml
中配置:
1 2 3 4 5
| <typeAliases> <typeAlias alias="Author" type="domain.blog.Author"/> <typeAlias alias="Blog" type="domain.blog.Blog"/> <typeAlias alias="Comment" type="domain.blog.Comment"/> </typeAliases>
|
这样,我们在mapper.xml
中就可以使用类型别名:
1 2 3
| <select id="findAuthorById" parameterType="int" resultType="Author"> SELECT * FROM author WHERE id=#{value} </select>
|
我们也可以指定包名,MyBatis 会自动扫描包中的 java beans。
1 2 3
| <typeAliases> <package name="domain.blog"/> </typeAliases>
|
这样,domian.blog
包中的所有 java bean 的类型别名默认就是类名(首字母大小写都可以)。如果某个类中有@Alias
注解,则类型别名是注解中的值。如:
1 2 3 4
| @Alias("myAuthor") public class Author { ... }
|
Mybatis 中有许多内置的针对常用 java 类的类型别名,常见的有:
别名 |
类 |
_long |
long |
_short |
short |
_int |
int |
_double |
double |
_float |
float |
_boolean |
boolean |
string |
String |
byte |
Byte |
long |
Long |
short |
Short |
int |
Integer |
double |
Double |
float |
Float |
boolean |
Boolean |
date |
Date |
map |
Map |
hashmap |
HashMap |
list |
List |
arraylist |
ArrayList |
environments
environments 内可配置事务管理和数据库连接,开头已经给出了一个例子,不多说。
mappers
mappers可配置从哪里加载映射文件,有几种配置方法:
(1) 通过 resource 加载映射文件
1 2 3 4
| <mappers> <mapper resource="mapper/AuthorMapper.xml" /> <mapper resource="mapper/BlogMapper.xml" /> </mappers>
|
(2) 通过 mapper 接口加载映射文件
1 2 3 4 5 6 7 8
| <mappers>
<mapper class="com.anye137.AuthorMapper"/> <mapper class="com.anye137.BlogMapper"/> </mappers>
|
(3) 指定 mapper 接口的包名(推荐)
1 2 3 4 5 6 7 8
| <mappers>
<package name="com.anye137.mapper"/> </mappers>
|
总结
下面是一个配置例子。以后要配置的时候从这里粘贴,再进行小小的改动就行了,哈哈哈。
db.properties
1 2 3 4
| <properties resource="org/MyBatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties>
|
SqlMapConfig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?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> <properties resource="db.properties"> </properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments>
<mappers> <package name="com.anye137.mapper"/> </mappers> </configuration>
|
Spring MVC 配置
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring MVC Application</display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> </web-app>
|
web.xml
文件放在应用程序的 WebContent/WEB-INF
目录下。在初始化 DispatcherServlet
时,Spring MVC 将尝试加载位于该应用程序的 WebContent/WEB-INF
目录中的文件名为 [servlet-name]-servlet.xml 的文件。在上面的例子中,文件名将是springmvc-servlet.xml
。
接下来,url-pattern
标签表明哪些 URLs 将被DispatcherServlet
处理。这里所有以 .jsp 结束的 HTTP 请求将由该DispatcherServlet
处理。
如果不想使用默认文件名和默认位置,可以通过在 web.xml
文件中添加 servlet 监听器 ContextLoaderListener
自定义该文件的名称和位置,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
|
springMVC.xml
文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <mvc:annotation-driven></mvc:annotation-driven> <context:component-scan base-package="com.anye137.Controller" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
|
(1) mvc:annotation-driven
标签默认加载很多的参数绑定方法,包括了默认使用注解的处理器映射器和适配器。
(2) context
标签用于启用 Spring MVC 注释扫描功能,该功能允许使用注释,如 @Controller
和 @RequestMapping
等等。
(3) 上面的视图解析器中配置了 jsp 路径的前后缀。比如说:
1 2
| modelAndView.setViewName("hello"); return modelAndView;
|
这样,一个名称为 hello 的视图将发送给位于 /WEB-INF/jsp/hello.jsp
中实现的视图。
Spring+Spring MVC+MyBatis 整合配置
终于到重头戏部分了!
其实以后应该不怎么单独使用 MyBatis 或者 Spring MVC,如果要用框架的话一般会整合几个框架,例如 SSM。 所以下面讲的配置就是本文的重点了。以后写 SSM 项目的话我就可以直接在这里 copy 配置了。嘻嘻!
这里分三步来整合,即 整合 dao 层(这里是mapper), 整合 service 层 和 整合 Spring MVC。整合完三部分后,再配置web.xml
整合 dao 层
Spring 和 MyBatis 整合,通过 Spring 管理 mapper 接口
src 文件夹下创建数据库配置文件 db.properties
1 2 3 4
| jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf-8 jdbc.username = root jdbc.password = admin
|
src 文件夹下创建 mybatis 文件夹,在里面创建 Mybatis 配置文件SqlMapConfig.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?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> <settings> <setting name="useGeneratedKeys" value="true" /> </settings>
<typeAliases> <package name="com.anye137.pojo"> </typeAliases>
</configuration>
|
注意,这里跟上面提到的SqlMapConfig.xml
配置有所不同。这里没有配置 数据源和 mapper。这两个由applicationContext-dao.xml
配置。此外,该文件还配置了 SqlSessionFactory。
src 文件夹下创建 spring 文件夹,在里面创建
applicationContext-dao.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:property-placeholder location="classpath:db.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="30" /> <property name="maxIdle" value="5" /> </bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> </bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.anye137.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean>
</beans>
|
整合 service 层
通过 Spring 管理 service 接口,以及实现事务控制
src/spring 文件夹内创建 applicationContext-service.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.soecode.lyf.service" />
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> </beans>
|
整合 Spring MVC
这一步跟上面讲到的 Spring MVC 配置类似。
src/spring 文件夹内创建springMVC.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <mvc:annotation-driven></mvc:annotation-driven> <context:component-scan base-package="com.anye137.Controller" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
|
配置 web.xml
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <?xml version="1.0" encoding="utf-8" ?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springMVC.xml</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
|
至此,SSM 整合大功告成!
注意所有配置文件的路径,不要搞错了。
参考资料
(1) MyBatis学习笔记(5)-配置文件
(2) MyBatis Configuration xml
(3) Spring MVC 中文文档
(4) Spring MVC 学习笔记