spring5 mvc+mybatis+maven 整合
第一步:创建maven项目
需要注意的地方:
1.这里不用勾选
2.此处过滤输入webapp
3.groupId (包名)、artifactId (项目名)
4. 项目中index.jsp报错
缺少servlet-api和jsp-api,可以通过下面任意一种方式解决
a.可以在pom.xml中添加Servlet的依赖
b.也可以在构建路径中添加Tomcat的jar包
5.缺少 src/main/java
构建路径中,重新编辑下JRE System Library,选择workspace default jre就可以了。
6.修改web.xml的版本
鼠标对着项目右键,点击Properties,找到Project Facets中的Dynamic Web Module 选项
然后把 Dynamic Web Module 的勾选去掉,点击apply,如下图:(如果直接选择版本会报错,不要问为什么)
接下来选择Dynamic Web Module的版本,然后点击下方的Further configuation available...
修改Content directory
最后把web.xml的头信息改过来,更新maven
<?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_1.xsd" id="WebApp_ID" version="3.1"> </web-app>
第二步:配置pom.xml
<dependencies> <!-- Spring MVC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.1.RELEASE</version> </dependency> <!-- 日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.3</version> </dependency> <!-- mysql --> <!-- <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.26</version> </dependency> --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.11</version> </dependency> <!-- jackson --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.2</version> </dependency> <!-- JSON In Java --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency> <!-- 上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.1</version> </dependency> <!-- Swagger --> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-models</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.wordnik</groupId> <artifactId>swagger-annotations</artifactId> <version>1.3.11</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>15.0</version> </dependency> <dependency> <groupId>com.fasterxml</groupId> <artifactId>classmate</artifactId> <version>1.1.0</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies>
第三步:引入配置文件
需要引入的文件列表:
1.applicationContext.xml (spring的核心文件,负责数据源和事物管理)
<?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 配置要扫描的包 --> <context:component-scan base-package="com.qthh.flyl.app.*.service" /> <!-- 加载属性文件 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:jdbc.properties</value> </list> </property> </bean> <!-- 配置数据源,使用 druid --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 基本属性 url、user、password --> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- sqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mybatis/*.xml" /> <property name="typeAliasesPackage" value="com.qthh.flyl.app.*.model" /> </bean> <!-- 自动扫描mapper --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.qthh.flyl.app.*.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> </bean> <!--配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 事物管理 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" read-only="false" /> <tx:method name="update*" propagation="REQUIRED" read-only="false" /> <tx:method name="delete*" propagation="REQUIRED" read-only="false" /> <tx:method name="query*" propagation="SUPPORTS" read-only="true" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <!-- 配置哪些类的方法进行事务管理:定义在service包或者子包里的任意方法的执行 --> <aop:pointcut id="transactionPointcut" expression="execution(* com.qthh.flyl.app.*.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" /> </aop:config> </beans>
2.spring-mvc.xml (DispatcherServlet,spring实现mvc就靠这个)
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd"> <!-- 自动扫描Controller --> <context:component-scan base-package="com.qthh.flyl.app.*.controller" /> <!-- 启动注解 spring 3.1 及之后替代 </mvc:annotation-driven> 的配置方式 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> </list> </property> </bean> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd" /> </bean> </property> </bean> </property> </bean> <!-- 视图解析 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 配置静态资源 --> <mvc:resources mapping="/swagger/**" location="/WEB-INF/swagger/"/> <mvc:resources mapping="/upload/**" location="/upload/" /> <!-- 加入swagger配置 --> <bean class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" /> <!-- 配置文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8" /> <property name="maxUploadSize" value="21474836480"/> <property name="maxInMemorySize" value="40960" /> </bean> <!-- <bean id="multipartResolver" class="com.always.util.upload.CustomMultipartResolver"> <property name="defaultEncoding" value="utf-8" /> <property name="maxUploadSize" value="10485760000" /> </bean> --> </beans>
3.mybatis-config.xml (mybatis的配置文件)
<?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> <!-- 使延迟加载生效,必须配置下面两个属性 lazyLoadingEnabled 和 aggressiveLazyLoading --> <!-- 全局性设置懒加载,默认ture --> <setting name="lazyLoadingEnabled" value="true"/> <!-- 当设置为false时,每个属性才会按需加载,否则懒加载的对象可能被任何懒属性全部加载 ,默认为true--> <setting name="aggressiveLazyLoading" value="false"/> <!-- 配置使全局的映射器启用或禁用缓存,默认ture --> <setting name="cacheEnabled" value="true"/> <!-- 是否允许单条语句返回多个数据集(取决于驱动需求),默认为true --> <setting name="multipleResultSetsEnabled" value="true"/> <!-- 是否使用列标签代替列名称,默认为true --> <setting name="useColumnLabel" value="true"/> <!-- 是否允许JDBC生成主键,默认为false --> <setting name="useGeneratedKeys" value="false"/> <!-- 指定mybatis是否并且如何来自动映射数据表字段与对象的属性,可选值:PARTIAL:默认值,自动映射简单的,没有嵌套的结果;FULL:自动映射所有复杂的结果;NONE:什么都不做,即不映射; --> <setting name="autoMappingBehavior" value="PARTIAL"/> <!-- 配置执行器,可选值:SIMPLE:默认值,无特别之处;REUSE:可以重复使用预处理(Prepared Statemnets)语句;BATCH:可以重复执行语句和批处理语句 --> <setting name="defaultExecutorType" value="SIMPLE"/> <!-- 设置一个时限,以决定让驱动器等待数据库回应的多长时间为超时,格式为正整数 --> <setting name="defaultStatementTimeout" value="5000"/> <!-- 指定log4j日志实现 --> <setting name="logImpl" value="LOG4J"/> </settings> <plugins> <!-- PageHelper4.1.1 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <property name="dialect" value="mysql"/> <property name="offsetAsPageNum" value="false"/> <property name="rowBoundsWithCount" value="false"/> <property name="pageSizeZero" value="true"/> <property name="reasonable" value="true"/> <property name="supportMethodsArguments" value="false"/> <property name="returnPageInfo" value="none"/> </plugin> </plugins> </configuration>
4.log4j.properties (日志配置文件)
#log4j.rootLogger=DEBUG,A1,R log4j.rootLogger=INFO,A1,R # ConsoleAppender 输出 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n # File 输出 一天一个文件,输出路径可以定制,一般在根路径下 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File=D:/log/api/log.txt log4j.appender.R.MaxFileSize=500KB log4j.appender.R.MaxBackupIndex=10 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n #log4j.logger.org.springframework=OFF #log4j.logger.org.apache.struts2=OFF #log4j.logger.com.opensymphony.xwork2=OFF #log4j.logger.com.ibatis=OFF #log4j.logger.org.hibernate=OFF #3 druid log4j.logger.druid.sql=INFO log4j.logger.druid.sql.DataSource=info log4j.logger.druid.sql.Connection=info log4j.logger.druid.sql.Statement=info log4j.logger.druid.sql.ResultSet=info #4 mybatis 显示SQL语句部分 log4j.logger.org.mybatis=INFO #log4j.logger.cn.tibet.cas.dao=DEBUG #log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG# #log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG# #log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG# #log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql=INFO log4j.logger.java.sql.Statement=INFO log4j.logger.java.sql.ResultSet=INFO log4j.logger.java.sql.PreparedStatement=INFO
5.jdbc.properties (属性配置文件)
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.1.200:3306/web?useUnicode=true&characterEncoding=UTF-8 jdbc.username=root jdbc.password=123456
以上配置文件需放在resource目录下
第四步:配置web.xml
<!-- Spring启动监听 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- spring MVC --> <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-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- UTF-8编码过滤 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
配置文件中的路径根据实际情况修改
另外,如下图:
这条配置是让spring自动扫描mybatis的mapper.xml文件,位置是resource目录下的mybatis文件夹中。所以这个需要自己创建一个mybatis文件夹,
然后将一个空的mapper文件放进去,否则项目会报错。目录结构如下图:
然后在提供一个空的mapper文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qthh.flyl.app.test.mapper.TestMapper"> </mapper>