• 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" /> 用于指定主键;

     
  • 相关阅读:
    Javascript 返回上一页
    html中link和import方式导入CSS文件的区别
    Leecode no.76 最小覆盖子串
    Leecode no.344 反转字符串
    Leecode no.167 两数之和 II 输入有序数组
    Leecode no.567 字符串的排列
    遍历目录和文件信息
    JAVASCRIPT显示农历的日历
    asp.net上传图片加水印(c#)
    asp.net XML操作类
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4471054.html
Copyright © 2020-2023  润新知