Spring MVC+整合Batis 经过测试版

来源:互联网 发布:男人的丁丁尺寸 知乎 编辑:程序博客网 时间:2024/06/05 08:48

曾经使用过Spring和Spring mvc 但是之后多使用框架开发,渐渐淡忘。为拾起来特写此博文,其中参考了很多文章和例子,也报了很多错误幸亏有互联网让我们能够找到适合自己的答案。(PS:网上很多发布的都没有经过测试,导致各种问题),不多说来来来我们坐下谈谈Spring mvc

        首先我使用的是使用Maven创建的web项目,具体做法“右键--选中Maven Project” 然后创建工程。详情不懂的请参考我的另一篇文章使用Maven创建web项目

创建成功共我们的目录结构总体是这样的


1.第一步 pom.xml

  既然要使用Spring 和 Spring mvc 必须引用相关的JAR文件 (ps:最下面的build几点可以忽略我之所以贴上是保证完整性)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.flower.dujiaohao</groupId>  <artifactId>dujiaohao</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>war</packaging>  <name>dujiaohao</name>  <dependencies>  <!-- spring mvc 相关配置 -->  <dependency>        <groupId>org.springframework</groupId>          <artifactId>spring-tx</artifactId>          <version>4.3.3.RELEASE</version>      </dependency>    <dependency>        <groupId>org.springframework</groupId>          <artifactId>spring-oxm</artifactId>          <version>4.3.3.RELEASE</version>      </dependency>  <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aop</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-beans</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-core</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-context-support</artifactId>          <version>4.3.3.RELEASE</version>      </dependency> <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-expression</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-web</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>          <groupId>org.springframework</groupId>          <artifactId>spring-jdbc</artifactId>          <version>4.3.3.RELEASE</version>      </dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-webmvc</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-beans</artifactId>    <version>4.3.3.RELEASE</version></dependency><dependency>    <groupId>commons-logging</groupId>    <artifactId>commons-logging</artifactId>    <version>1.2</version></dependency><dependency>        <groupId>javax.servlet</groupId>        <artifactId>javax.servlet-api</artifactId>        <scope>provided</scope>        <version>3.0.1</version>    </dependency>    <!-- mybatis配置 --> <dependency>          <groupId>org.mybatis</groupId>          <artifactId>mybatis</artifactId>          <version>3.2.6</version>      </dependency>      <dependency>          <groupId>org.mybatis</groupId>          <artifactId>mybatis-spring</artifactId>          <version>1.2.2</version>      </dependency>  <dependency>    <groupId>javax.annotation</groupId>    <artifactId>javax.annotation-api</artifactId>    <version>1.2</version></dependency><!-- 导入Mysql数据库链接jar包 -->      <dependency>          <groupId>mysql</groupId>          <artifactId>mysql-connector-java</artifactId>          <version>5.1.30</version>      </dependency>      <!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->      <dependency>          <groupId>commons-dbcp</groupId>          <artifactId>commons-dbcp</artifactId>          <version>1.2.2</version>      </dependency>     <dependency>          <groupId>log4j</groupId>          <artifactId>log4j</artifactId>          <version>1.2.17</version>      </dependency>     <!-- 映入JSON -->      <dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-core</artifactId>          <version>2.1.0</version>      </dependency>      <dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-databind</artifactId>          <version>2.1.0</version>      </dependency>      <dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-annotations</artifactId>          <version>2.1.0</version>      </dependency>    </dependencies>        <build>  <plugins>  <!-- 加上这个配置就会规避 pom.xml的war处出现failOnMissingWebXml的错误,且web工程不必使用web.xml -->  <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-war-plugin</artifactId>             <version>2.1.1</version>             <configuration>             <!-- 这段配置为指定项目中web.xml的位置,但我使用了failOnMissingWebXml配置故注释掉此段                 <warSourceDirectory>                       ${basedir}/src/main/webapp                   </warSourceDirectory>                   <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>  -->                              <failOnMissingWebXml>false</failOnMissingWebXml>             </configuration>        </plugin>  </plugins>  </build></project>

2.第二步 配置web.xml。现在有两种配置方法第一种为使用配置文件,另一种使用0配置方式,也就是把配置文件写到代码中进行管理。我们这次就是用最广泛使用的第一种方式进行配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance  http://www.springmodules.org/schema/cache/springmodules-cache.xsd http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"     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_2_5.xsd"     id="WebApp_ID" version="2.5">          <!-- Spring和mybatis的配置文件 -->      <context-param>          <param-name>contextConfigLocation</param-name>          <param-value>classpath:spring-mybatis.xml</param-value>      </context-param>       <!--  编码过滤器  -->     <filter>          <filter-name>encodingFilter</filter-name>          <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>          <async-supported>true</async-supported>        <init-param>              <param-name>encoding</param-name>              <param-value>UTF-8</param-value>          </init-param>      </filter>      <filter-mapping>          <filter-name>encodingFilter</filter-name>          <url-pattern>/*</url-pattern>      </filter-mapping>      <!--Spring监听器  -->     <listener>          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>      </listener>      <!--防止Spring内存溢出监听器  -->    <listener>          <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>      </listener>                      <!-- 配置DispatchcerServlet -->     <servlet>         <servlet-name>springDispatcherServlet</servlet-name>         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>         <!-- 配置Spring mvc下的配置文件的位置和名称 -->         <init-param>             <param-name>contextConfigLocation</param-name>             <param-value>classpath:springconf/springmvc-servlet.xml</param-value>         </init-param>         <load-on-startup>1</load-on-startup>     </servlet>          <servlet-mapping>         <servlet-name>springDispatcherServlet</servlet-name>         <url-pattern>/</url-pattern>     </servlet-mapping>               <servlet-mapping>     <servlet-name>default</servlet-name>     <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping>      <servlet-name>default</servlet-name>      <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping>    <servlet-name>default</servlet-name>     <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping>     <servlet-name>default</servlet-name>     <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping>      <servlet-name>default</servlet-name>      <url-pattern>*.html</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/views/index.html</welcome-file> </welcome-file-list></web-app>

配置的Servlet-mapping可以使我们访问.html文件不必非是.jsp

第三步  配置springmvc-servlet.xml文件

<?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:mvc="http://www.springframework.org/schema/mvc"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">                        <!-- 配置自动扫描的包 -->        <context:component-scan base-package="com.flower.dujiaohao.controllers"></context:component-scan>            <!-- 默认的注解映射的支持 -->    <mvc:annotation-driven />    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  <property name="messageConverters">   <list >    <ref bean="mappingJacksonHttpMessageConverter" />   </list>  </property></bean><!--避免IE执行AJAX时,返回JSON出现下载文件 -->  <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  <property name="supportedMediaTypes">   <list>    <value>text/html;charset=UTF-8</value>   </list>  </property></bean>                                         <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">            <property name = "prefix" value="/views/"></property>            <property name = "suffix" value = ".html"></property>        </bean></beans>

第四步 配置MyBatis和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:mvc="http://www.springframework.org/schema/mvc"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">                        <!-- 自动扫描 -->  <context:component-scan base-package="com.flower.dujiaohao" /> <!-- 引入配置文件 -->  <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">      <property name="location" value="classpath:jdbc.properties" />  </bean>  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">      <property name="driverClassName" value="${driver}" />      <property name="url" value="${url}" />      <property name="username" value="${username}" />      <property name="password" value="${password}" />      <!-- 初始化连接大小 -->      <property name="initialSize" value="${initialSize}"></property>      <!-- 连接池最大数量 -->      <property name="maxActive" value="${maxActive}"></property>      <!-- 连接池最大空闲 -->      <property name="maxIdle" value="${maxIdle}"></property>      <!-- 连接池最小空闲 -->      <property name="minIdle" value="${minIdle}"></property>      <!-- 获取连接最大等待时间 -->      <property name="maxWait" value="${maxWait}"></property>  </bean>  <!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">      <property name="dataSource" ref="dataSource" />      <!-- 自动扫描mapping.xml文件 -->      <property name="mapperLocations" value="classpath:com/flower/dujiaohao/mapping/*.xml"></property>  </bean>  <!-- DAO接口所在包名,Spring会自动查找其下的类 -->  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">      <property name="basePackage" value="com.flower.dujiaohao.dao" />      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>  </bean>  <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">      <property name="dataSource" ref="dataSource" />  </bean>  </beans>

第五步 配置我们的log4j和jdbc.properties

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://1.1.1.1:3306/testusername=123password=456#\u5B9A\u4E49\u521D\u59CB\u8FDE\u63A5\u6570  initialSize=0  #\u5B9A\u4E49\u6700\u5927\u8FDE\u63A5\u6570  maxActive=20  #\u5B9A\u4E49\u6700\u5927\u7A7A\u95F2  maxIdle=20  #\u5B9A\u4E49\u6700\u5C0F\u7A7A\u95F2  minIdle=1  #\u5B9A\u4E49\u6700\u957F\u7B49\u5F85\u65F6\u95F4  maxWait=60000  

log4j.rootLogger=INFO,Console,File#\u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u7684\u5730\u4E3A\u63A7\u5236\u53F0  log4j.appender.Console=org.apache.log4j.ConsoleAppenderlog4j.appender.Console.Target=System.out#\u53EF\u4EE5\u7075\u6D3B\u5730\u6307\u5B9A\u65E5\u5FD7\u8F93\u51FA\u683C\u5F0F\uFF0C\u4E0B\u9762\u4E00\u884C\u662F\u6307\u5B9A\u5177\u4F53\u7684\u683C\u5F0F  log4j.appender.Console.layout = org.apache.log4j.PatternLayoutlog4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  #\u6587\u4EF6\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6  log4j.appender.File = org.apache.log4j.RollingFileAppender#\u6307\u5B9A\u8F93\u51FA\u76EE\u5F55  log4j.appender.File.File = D:/logs/ssm.log#\u5B9A\u4E49\u6587\u4EF6\u6700\u5927\u5927\u5C0F  log4j.appender.File.MaxFileSize = 10MB# \u8F93\u51FA\u6240\u4EE5\u65E5\u5FD7\uFF0C\u5982\u679C\u6362\u6210DEBUG\u8868\u793A\u8F93\u51FADEBUG\u4EE5\u4E0A\u7EA7\u522B\u65E5\u5FD7  log4j.appender.File.Threshold = ALLlog4j.appender.File.layout = org.apache.log4j.PatternLayoutlog4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

这两个配置文件可以自行配置,我这里也是寻找的看着顺眼的代码。

以上配置基本完成,那么我们就该看下我们的java代码如何进行了

HelloWord.java

@Controllerpublic class HellowWord {@Resourceprivate IConsultService consultService; @RequestMapping("/helloword")public String hello(HttpServletRequest request,Model model){System.out.println("aaa");String id = request.getParameter("id");String username = consultService.getUsername(Long.valueOf(id));System.out.println(username+"+++++++++");model.addAttribute("username", username);return "success";}}

ConsultDao.java

public interface ConsultDao {    int deleteByPrimaryKey(Long consultid);    int insert(Consult record);    int insertSelective(Consult record);    Consult selectByPrimaryKey(Long consultid);    int updateByPrimaryKeySelective(Consult record);    int updateByPrimaryKey(Consult record);}

ConsultMapper.xml

<?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.flower.dujiaohao.dao.ConsultDao" >  <resultMap id="BaseResultMap" type="com.flower.dujiaohao.pojo.Consult" >    <id column="consultId" property="consultid" jdbcType="BIGINT" />    <result column="empid" property="empid" jdbcType="BIGINT" />    <result column="payid" property="payid" jdbcType="BIGINT" />    <result column="finish_time" property="finishTime" jdbcType="BIGINT" />    <result column="addtime" property="addtime" jdbcType="BIGINT" />    <result column="status" property="status" jdbcType="TINYINT" />    <result column="userid" property="userid" jdbcType="BIGINT" />    <result column="username" property="username" jdbcType="VARCHAR" />    <result column="userphone" property="userphone" jdbcType="VARCHAR" />  </resultMap>  <sql id="Base_Column_List" >    consultId, empid, payid, finish_time, addtime, status, userid, username, userphone  </sql>  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >    select     <include refid="Base_Column_List" />    from t_lvz_consult    where consultId = #{consultid,jdbcType=BIGINT}  </select></mapper>


IConsultService.java

public interface IConsultService {public String getUsername(Long consultId);}


ConsultServiceImpl.java

@Service("consultService")public class ConsultServiceImpl implements IConsultService{@Resourceprivate ConsultDao dao;public String getUsername(Long consultId) {return dao.selectByPrimaryKey(consultId).getUsername();}}

pojo包不贴了 就是字段和set和get方法没有别的

至此我们访问http://localhost:8088/dujiaohao/helloword?id=38390667235841

好了一个简单mvc+mybatis搭建完成

其中遇到的问题:1.我们在导入mybatis包时pom.xml配置写错 一直抱:

A child container failed during start这个错误  从新配置pom.xml解决

2.

运行报错 No adapter for handler

这个错误也是参考例子中com.fasterxml.jackson.core这个pom引用时没有引用全 ,最后加上一段:
<dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-core</artifactId>          <version>2.1.0</version>      </dependency>      <dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-databind</artifactId>          <version>2.1.0</version>      </dependency>      <dependency>          <groupId>com.fasterxml.jackson.core</groupId>          <artifactId>jackson-annotations</artifactId>          <version>2.1.0</version>      </dependency>

解决。不过这个错误还有很多原因造成这里就不一一解释

哦哦哦还有一个就是我的dao,mapping.xml和pojo都是使用mybatis的一个工具直接生成的因此mapping.xml配置文件中的<mapper namespace="com.flower.dujiaohao.dao.ConsultDao" >配置出错导致mybatis无法找到比配的方法。
好了好了就这么多。
至于那个工具参考文档中有提到这个工具,我这里就不多说了 附上地址:http://blog.csdn.net/zhshulin/article/details/23912615

参考文档:http://blog.csdn.net/gebitan505/article/details/44455235/


1 0
原创粉丝点击