zoukankan      html  css  js  c++  java
  • SpringMVC4 + Spring + MyBatis3

    SpringMVC4 + Spring + MyBatis3

    本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建。

    1. web.xml

    我们知道springmvc是基于Servlet: DispatcherServlet来处理分发请求的,所以我们需要先在web.xml文件中配置DispatcherServlet,而Spring的启动则是使用了监听器,所以需要配置spring的监听器:

    复制代码
    <?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">
      <display-name>sp</display-name>
      
      <servlet>
          <servlet-name>dispatcherServlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>classpath:config/spring-mvc.xml</param-value>
          </init-param>
      </servlet>
      <servlet-mapping>
          <servlet-name>dispatcherServlet</servlet-name>
          <url-pattern>/</url-pattern>
      </servlet-mapping>
      
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:config/applicationContext.xml</param-value>
      </context-param>
      
    </web-app>
    复制代码

    servlet下面的init-param中的指定了springmvc的dispatcherServlet的配置文件:config/spring-mvc.xml,所有springmvc相关的都在该文件中进行配置。在DispatcherServlet(其父类)中使用:getServletConfig().getInitParameter("paramName");  可以访问到init-param中指定的参数,从而可以读取到config/spring-mvc.xml文件。load-on-startup值为1指定了dispatcherServlet随servlet容器启动。

    ContextLoaderListener是spring监听servlet容器的启动的,在servlet容器启动时,就初始化bean工厂,对bean进行初始化等等操作。context-param指定了spring的配置文件config/applicationContext.xml,可以使用: getServletContext().getInitParameter("paraName"); 读取到值。

    注意:init-param 和 context-param 的区别,从名字上就可以看得出,后者是相对于整个web应用的,而前者是针对单个servlet的。

    2. springmvc.xml

    下面我们看一下springmvc.xml该如何配置:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
            
        <mvc:annotation-driven />
        <context:component-scan base-package="net.aazj.controller" />
         
         <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
             <property name="prefix" value="/" />
             <property name="suffix" value=".jsp" />
         </bean>
         // ... ...
    </beans>
    复制代码

    启用注解驱动来扫描controller,并指定control的包路径,还有指定了视图解析器,so easy。

    3. applicationContext.xml

    spring中相关bean扫描,事物的配置,以及和mybatis的结合配置如下所示:

    复制代码
    <?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:p="http://www.springframework.org/schema/p"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        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.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="net.aazj.service" />
        <!-- 引入属性文件 -->
        <context:property-placeholder location="classpath:config/db.properties" />
        
        <!-- 配置数据源 -->
        <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
            <property name="url" value="${jdbc_url}" />
            <property name="username" value="${jdbc_username}" />
            <property name="password" value="${jdbc_password}" />
            <!-- 初始化连接大小 -->
            <property name="initialSize" value="0" />
            <!-- 连接池最大使用连接数量 -->
            <property name="maxActive" value="20" />
            <!-- 连接池最大空闲 -->
            <property name="maxIdle" value="20" />
            <!-- 连接池最小空闲 -->
            <property name="minIdle" value="0" />
            <!-- 获取连接最大等待时间 -->
            <property name="maxWait" value="60000" />
        </bean>
        
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <property name="dataSource" ref="dataSource" />
          <property name="configLocation" value="classpath:config/mybatis-config.xml" />
          <property name="mapperLocations" value="classpath*:config/mappers/**/*.xml" />
        </bean>
        
        <!-- Transaction manager for a single JDBC DataSource -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        
        <!-- 使用annotation定义事务 -->
        <tx:annotation-driven transaction-manager="transactionManager" /> 
        
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <property name="basePackage" value="net.aazj.mapper" />
        </bean>
    </beans>
    复制代码

    同样相关service bean也使用基于注解的扫描方式:context:component-scan,事务也使用注解来驱动:tx:annotation-driven,所以需要在serviceImpl相关类上和方法上使用@Transanctional注解类配置事物。

    sqlSessionFactory的配置相当重要,configLocation指定了mybatis的配置文件,如果需要在mybatis配置文件中配置比如<settings>, <typeAliases>, <mappers>则,需要在这里指定,如果不需要就没有必要指定值了。mapperLocations指定了mapper接口映射sql语句的xml文件的位置。MapperScannerConfigurer指定了mapper接口所在的包路径。

    4. mybatis-config.xml

    spring和mybatis的接口,其实可以不需要mybatis-config.xml文件的存在,只有在需要配置<settings>, <typeAliases>, <mappers>(其实mapper也一并也是在applicationContext.xml中进行配置)才需要mybatis-config.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>
    
      <settings>
          <setting name="cacheEnabled" value="true"/>
          <setting name="lazyLoadingEnabled" value="true"/>
          <setting name="multipleResultSetsEnabled" value="true"/>
          <setting name="useColumnLabel" value="true"/>
          <setting name="useGeneratedKeys" value="false"/>
          <setting name="autoMappingBehavior" value="PARTIAL"/>
          <setting name="defaultExecutorType" value="SIMPLE"/>
          <setting name="defaultStatementTimeout" value="25"/>
          <setting name="safeRowBoundsEnabled" value="false"/>
          <setting name="mapUnderscoreToCamelCase" value="false"/>
          <setting name="localCacheScope" value="SESSION"/>
          <setting name="jdbcTypeForNull" value="OTHER"/>
          <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
      </settings>
      <typeAliases>
          <package name="net.aazj.pojo"/>
      </typeAliases>
    </configuration>
    复制代码

    <settings>指定了数据库操作相关的设置,typeAliases指定了可以给数据库表对应的类所在的包路径,可以在sql的xml使用它们的别名:

    复制代码
    package net.aazj.pojo;
    
    import org.apache.ibatis.type.Alias;
    
    @Alias("User")
    public class User {
    
        private Integer id;
    
        private String name;
    
            // ... ...
    
    }
    复制代码

    @Alias("User")注解了该pojo的别名,所以可以在xml文件中使用别名 User 来代替:net.aazj.pojo.User

    复制代码
    <?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="net.aazj.mapper.UserMapper">
         <cache />
         
        <select id="getUser" resultType="User">
            select * from user where id = #{id}
        </select>
    
        <select id="addUser" parameterType="string">
            insert into user(name) values(#{name})
        </select>
    </mapper>
    复制代码

    这里 resultType="User" 不需要使用全限定类名。<cache />启用了基于namespace="net.aazj.mapper.UserMapper"的全局缓存。

    5. generatorConfig.xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
      <classPathEntry location="D:java_libs
    epositorymysqlmysql-connector-java5.1.35mysql-connector-java-5.1.35.jar" />
     
      <context id="MySQLTables" targetRuntime="MyBatis3">
      
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/sy"
            userId="root"
            password="xxxxx">
        </jdbcConnection>
    
        <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
    
        <javaModelGenerator targetPackage="net.aazj.pojo" targetProject="spsrcmainjava">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value="true" />
        </javaModelGenerator>
    
        <sqlMapGenerator targetPackage="config.mappers"  targetProject="spsrcmain
    esources">
          <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
    
        <javaClientGenerator type="XMLMAPPER" targetPackage="net.aazj.mapper"  targetProject="spsrcmainjava">
          <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
    
        <table schema="sy" tableName="tbug" domainObjectName="Bug" >
          <property name="useActualColumnNames" value="false"/>
          <generatedKey column="id" sqlStatement="mysql" identity="true" />
          <!-- 
          <columnOverride column="DATE_FIELD" property="startDate" />
          <ignoreColumn column="FRED" />
          <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
           -->
        </table>
        <table schema="sy" tableName="user" domainObjectName="User" >
          <property name="useActualColumnNames" value="false"/>
          <generatedKey column="id" sqlStatement="mysql" identity="true" />
        </table>
    
      </context>
    </generatorConfiguration>
    复制代码

    上面是Mybatis generator的配置文件:

    1)classPathEntry  指定驱动位置;

    2)jdbcConnection 指定数据库连接信息;

    3)javaModelGenerator 指定生成的pojo类的位置;

    4)sqlMapGenerator 指定指定生成的sql xml文件的位置;

    5)javaClientGenerator 指定 mapper 接口的位置;

    6)table 指定将数据库中哪些表进行处理;<generatedKey column="id" sqlStatement="mysql" identity="true" /> 用于指定主键;

     
  • 相关阅读:
    使用 libevent 和 libev 提高网络应用性能
    An existing connection was forcibly closed by the remote host
    各种浏览器的兼容css
    vs输出窗口,显示build的时间
    sass
    网站设置404错误页
    List of content management systems
    css footer not displaying at the bottom of the page
    强制刷新css
    sp_executesql invalid object name
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4471054.html
Copyright © 2011-2022 走看看