• springmvc配置mybatis与hibernate的不同点


    相信每个人对springmvc+hibernate或者springmvc+mybatis都不会陌生,拿来一个项目也都会开发。但是自己配置的情况下却很少,即使自己配置过,长时间不写也会忘,在这里记录一下配置的过程以及遇到的问题。以maven项目为例,首先是springmvc+hibernate的pom.xml基本配置:

    <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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>maven-springmvc</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>maven-springmvc Maven Webapp</name>
      <url>http://maven.apache.org</url>
      <!--项目依赖 -->
      <dependencies>
    
        <!-- 添加Hibernate依赖 -->
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-core</artifactId>
          <version>4.3.8.Final</version>
        </dependency>
        <!-- dbcp连接池需要的jar包 -->
        <dependency>
          <groupId>commons-dbcp</groupId>
          <artifactId>commons-dbcp</artifactId>
          <version>1.4</version>
        </dependency>
        <!--日志包-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.21</version>
        </dependency>
        <dependency>
          <groupId>org.javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.19.0-GA</version>
        </dependency>
    
        <!--j2ee相关包 servlet、jsp、jstl-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
    
    
        <!-- 添加oracle jdbc driver -->
        <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>11.2.0.1.0</version>
        </dependency>
    
    
    
        <!--spring相关包-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-oxm</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <!--jackson-->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.7.0</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.7.0</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.7.0</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <!--其他需要的包-->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.4</version>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
        </dependency>
      </dependencies>
      <build>
        <finalName>maven-springmvc</finalName>
        <resources>
          <!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
          <resource>
            <directory>${basedir}/src/main/java</directory>
            <includes>
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
          </resource>
          <resource>
            <directory>${basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
              <url>http://localhost:8080/manager/text</url>
              <server>tomcat7</server>
              <username>tomcat</username>
              <password>tomcat</password>
              <path>/maven-springmvc</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

    主要的依赖包括日志包(log4j),oracle驱动包,spring及springmvc的依赖包,jackson依赖包(转化json),maven的tomcat插件,数据库连接池数据源的jar包(dbcp),文件上传需要的包,以及hibernate的包。这些基本就可以满足springmvc+hibernate的基本需求了。再来看看springmvc+mybatis的配置:

    <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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.example</groupId>
      <artifactId>maven-springmvc</artifactId>
      <packaging>war</packaging>
      <version>1.0-SNAPSHOT</version>
      <name>maven-springmvc Maven Webapp</name>
      <url>http://maven.apache.org</url>
      <!--项目依赖 -->
      <dependencies>
    
        <!-- mybatis依赖-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.4.5</version>
        </dependency>
        <!--整合spring mybatis-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>1.3.0</version>
        </dependency>
        <!-- dbcp连接池需要的jar包 -->
        <dependency>
          <groupId>commons-dbcp</groupId>
          <artifactId>commons-dbcp</artifactId>
          <version>1.4</version>
        </dependency>
        <!--日志包-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.21</version>
        </dependency>
        <dependency>
          <groupId>org.javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.19.0-GA</version>
        </dependency>
    
        <!--j2ee相关包 servlet、jsp、jstl-->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.2</version>
        </dependency>
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>
    
    
        <!-- 添加oracle jdbc driver -->
        <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>11.2.0.1.0</version>
        </dependency>
    
    
    
        <!--spring相关包-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-oxm</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-tx</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-orm</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <!--jackson-->
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.7.0</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.7.0</version>
        </dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.7.0</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-test</artifactId>
          <version>4.3.1.RELEASE</version>
        </dependency>
    
        <!--其他需要的包-->
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.4</version>
        </dependency>
        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.1</version>
        </dependency>
      </dependencies>
      <build>
        <finalName>maven-springmvc</finalName>
        <resources>
          <!--表示把java目录下的有关xml文件,properties文件编译/打包的时候放在resource目录下-->
          <resource>
            <directory>${basedir}/src/main/java</directory>
            <includes>
              <include>**/*.properties</include>
              <include>**/*.xml</include>
            </includes>
          </resource>
          <resource>
            <directory>${basedir}/src/main/resources</directory>
          </resource>
        </resources>
        <plugins>
          <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <configuration>
              <url>http://localhost:8080/manager/text</url>
              <server>tomcat7</server>
              <username>tomcat</username>
              <password>tomcat</password>
              <path>/maven-springmvc</path>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>

    对比两个配置文件,除了mybatis的maven依赖以外,其他的都是一样的(废话)。这里就是注意一下除了mybatis的依赖,还有mybatis整合spring的依赖,如果你也用的是spring+mybatis的话,就需要了。

    然后就是spring的配置文件了,我们知道springmvc需要一个配置文件,首先我们要在web.xml中配置

    <!--配置springmvc DispatcherServlet-->
      <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <!--Sources标注的文件夹下需要新建一个spring文件夹-->
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
      </servlet>
      <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>

    告诉项目我们要用springmvc,将所有请求交给DispatcherServlet再转给springmvc的控制器(controller),接下来就是spring-mvc.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-3.2.xsd
                             http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.2.xsd
                            http://www.springframework.org/schema/mvc
                            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--启用spring的一些annotation -->
        <context:annotation-config/>
    
        <!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
        <!--<context:component-scan base-package="com.example.controller">-->
            <!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
        <!--</context:component-scan>-->
        <context:component-scan base-package="com.example.controller"/>
    
        <!--HandlerMapping 无需配置,springmvc可以默认启动-->
    
        <!--静态资源映射-->
        <!--本项目把静态资源放在了WEB-INF的statics目录下,资源映射如下-->
        <mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>
        <mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>
        <mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>
    
        <!--但是项目部署到linux下发现WEB-INF的静态资源会出现无法解析的情况,但是本地tomcat访问正常,因此建议还是直接把静态资源放在webapp的statics下,映射配置如下-->
        <!--<mvc:resources mapping="/css/**" location="/statics/css/"/>-->
        <!--<mvc:resources mapping="/js/**" location="/statics/js/"/>-->
        <!--<mvc:resources mapping="/image/**" location="/statics/images/"/>-->
    
        <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
    
        <mvc:annotation-driven>
            <mvc:message-converters>
                <ref bean="stringHttpMessageConverter"/>
                <ref bean="mappingJackson2HttpMessageConverter"/>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <bean id="stringHttpMessageConverter"
              class="org.springframework.http.converter.StringHttpMessageConverter"/>
    
        <!--解决IE浏览器json文件下载和json数据中午乱码的问题-->
        <bean id="mappingJackson2HttpMessageConverter"
              class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
        </bean>
    
    
    
        <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
        <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
        <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/WEB-INF/view/"/><!--设置JSP文件的目录位置-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!-- springmvc文件上传需要配置的节点-->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="20971500"/>
            <property name="defaultEncoding" value="UTF-8"/>
            <property name="resolveLazily" value="true"/>
        </bean>
    
    
    
    
    </beans>

    首先我们要配置controller的包,指定哪个包下是控制器,<mvc:resources 是配置静态资源的开头,即配置访问的目录是不通过DispatcherServlet控制器,这样我们就可以访问静态资源。然后就是配置jackson的转换器,使我们在@Responsebody时可以直接返回json格式的数据。<mvc:annotation-driven/>是注解驱动启动,这样就可以通过注解解析控制器了,将写好的converter绑定到其中。然后就是配置视图解析器,指定模板引擎存放的路径以及后缀,最后配置一下spinrgmvc文件上传需要的配置的节点。关于springmvc配置文件的配置,都是一样的(无论是hibernate还是mybatis)

    然后就是spring的配置了,一般情况下spring的配置包含3个部分:

    一个是spring-bean,主要是配置扫描包,主要是dao层,实现依赖注入

    第二个是spring-dao,配置数据连接相关配置,这里mybatis和hibernate有很大不同了,

    第三个是spring-service,主要是配置一些业务逻辑处理(AOP),我们这里先不讨论。

    我这里web.xml的配置只有两个文件(其实如果写一个里面理论也是可以的),web.xml配置

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml,classpath:hibernateConfig.xml</param-value>
      </context-param>

    ContextLoaderListener是spring的监听器,只要用到spring肯定是需要的,器参数contextConfigLocation即是用来加载我们需要的配置文件,我这里只有两个,一个是用来扫描bean的,一个是用来配置数据连接方面的,applicationContext.xml就相当于spring-bean,内容为;

    <?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"
           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">
    
        <!-- 扫描文件(自动将servicec层注入) -->
        <context:component-scan base-package="com.example.dao"/>
    </beans>

    这里我只配置了扫描service包这句,目的是可以让service层可以注入。但在配置mybatis的时候出现了一个问题,之后再说

    然后就是hibernateConfig.xml,就是连接池以及hibernate的配置了

    <?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"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        ">
        <!-- 读取hibernate.properties配置文件 -->
        <context:property-placeholder location="classpath:hibernate.properties" />
    
        <!-- 使用dbcp数据源,Oracle数据库 -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
              destroy-method="close">
            <property name="driverClassName" value="${jdbc.driverClassName}"></property>
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
            <property name="maxActive" value="30"></property>
            <property name="maxIdle" value="10"></property>
            <property name="maxWait" value="1000"></property>
            <property name="defaultAutoCommit" value="true"></property>
        </bean>
    
        <!-- session工厂 -->
        <!-- spring与hibernate整合配置,扫描所有dao -->
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
            <property name="hibernateProperties">
                <props>
                    <!-- 是否根据需要每次自动创建数据库 -->
                    <prop key="hibernate.hbm2ddl.auto">${jdbc.hbm2ddl.auto}</prop>
                    <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                    <!-- 显示Hibernate持久化操作所生成的SQL -->
                    <prop key="hibernate.show_sql">${jdbc.show_sql}</prop>
                    <prop key="hibernate.format_sql">${jdbc.format_sql}</prop>
                </props>
            </property>
            <!-- 扫描单个class-->
            <property name="annotatedClasses">
            <list>
                <value>com.example.pojo.Message</value>
            </list>
            </property>
            <!--&lt;!&ndash;扫描整个package,加载整个包下的class&ndash;&gt;-->
            <!--<property name="packagesToScan">-->
                <!--<list>-->
                    <!--<value>com.example.pojo</value>-->
                <!--</list>-->
            <!--</property>-->
            <!--扫描一个配置文件-->
            <property name="mappingResources">
            <array>
                <value>com/example/dao/orm/Book.hbm.xml</value>
            </array>
            </property>
            <!--<property name="mappingDirectoryLocations">-->
                <!--<list>-->
                    <!--<value>com/example/dao/orm</value>-->
                <!--</list>-->
            <!--</property>-->
        </bean>
    
       <!-- <bean id="bookDao" class="com.example.dao.impl.BookDaoImpl">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>-->
    
        <bean id="transactionManager"
              class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    
        <!-- 对数据源进行事务管理 -->
        <tx:annotation-driven transaction-manager="transactionManager" />
    
    </beans>

    首先要加载一下hibernate的配置文件,hibernate.properties

    #sqlserver
    #jdbc.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
    #jdbc.url=jdbc:sqlserver://192.168.1.60:1408;DatabaseName=test
    #jdbc.username=sa
    #jdbc.password=1111
    
    #mysql
    #jdbc.driverClassName=com.mysql.jdbc.Driver
    #jdbc.url=jdbc:mysql://localhost:3306/test
    #jdbc.username=root
    #jdbc.password=root
    
    #Oracle
    jdbc.dialect=org.hibernate.dialect.Oracle10gDialect
    jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
    jdbc.url=jdbc:oracle:thin:@10.64.68.195:xxxx:orcl
    jdbc.username=xxxxxx
    jdbc.password=xxxxxx
    
    jdbc.hbm2ddl.auto=update
    jdbc.show_sql=true
    jdbc.format_sql=true

    然后就是配置数据连接的连接源,我这里用的是dbcp(还有c3p0和proxool),然后就是配置hibernate的SessionFactory了,这里我使用的是hibernate4,org.springframework.orm.hibernate4.LocalSessionFactoryBean,将数据源配置到sessionFactory中,<property name="annotatedClasses">是将我们生成的实体类加入hibernate中,这样在使用hibernate的hql时,表明就是实体类的类名了,否则hibernate不会识别。使用hibernate的话,实体类可以根据数据库中的表生成实体类,也可以根据实体类生成表。

    如果用实体类生成表的话就需要在sessionFactory中加入<property name="mappingResources">,即把映射文件加入进来,然后修改一下hibernate.hbm2ddl.auto的方式,这里就不多做介绍了。

    然后就是附上一下我的service文件:

    package com.example.dao;
    
    import com.example.pojo.Message;
    
    import java.util.List;
    
    public interface MessageDao {
    
        public Message findMessageById(String id);
    
        public void saveMessage(Message message);
    
        public List<Message> findMessageAll();
    
        public String getMessageName();
    }
    package com.example.dao.impl;
    
    import com.example.dao.MessageDao;
    import com.example.pojo.Message;
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class MessageDaoImpl implements  MessageDao {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        //获取和当前线程绑定的Session
        private Session getSession(){
            return sessionFactory.openSession();
        }
    
        public Message findMessageById(String id) {
            //实例化Configuration,这行代码默认加载hibernate.cfg.xml文件
            //String hql = "FROM  Message where id = ?";
            String hql = "FROM  Message where id = ?";
            Query query = getSession().createQuery(hql).setString(0,id);
            Message message = (Message) query.uniqueResult();
            return message;
        }
        public void saveMessage(Message message) {
            getSession().save(message);
        }
    
        public List<Message> findMessageAll() {
            String hql = " FROM  Message";
            Query query = getSession().createQuery(hql);
            List<Message> messageList = query.list();
            return messageList;
        }
    
        public String getMessageName() {
            String name = "测试消息";
            return name;
        }
    }

    可以看到在我在接口的实现类中通过注入的方式注入了Hibernate的sessionFactory,这里需要注意一下,如果这里采用注入的方式,那么在使用这个service的实现类时,也必须要采用注入的方式引入这个类,否则sessionFactory会是null。再然后需要注意的就是获取session的方式,我这里采用的是sessionFactory.openSession()的方式,我看网上给的好多种都是sessionFactory.getCurrentSession()这个方法,但是如果你使用的是hibernate4的话,getCurrentSession()这个方法就不管用了,注意一下。然后我们就可以通过hibernate的session进行数据库操作了。到此springmvc+hibernate的配置就到此结束了,接下来我们说一下springmvc+mybatis的配置,由于好久都没用了,之前用过也不是springmvc一起用的,所以配置的时候还是忘了好多。

    这里最需要注意的就是mybatis是需要mapper类的,mapper类对应的就是mybatis的sql xml中的方法,有了mapper类我们才能调用mybatis写好的sql方法这里我们看一下web.xml中的配置

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springbeans.xml,classpath:mybatis.xml</param-value>
      </context-param>

    配置文件还是两个,一个bean一个dao,名字不一样而已,我们看一下mybatis.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:mybatis="http://mybatis.org/schema/mybatis-spring"
           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://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <!-- 该包下的类支持注解,表示会被当作{@code mybatis mapper}处理 配置了之后表示可以自动引入mapper类-->
        <mybatis:scan base-package="com.mvc.dao"/>
    
        <!-- 自动扫描注解的bean -->
        <context:component-scan base-package="com.mvc.dao" />
    
        <!--引入属性文件 -->
        <context:property-placeholder location="classpath:mybatis.properties"/>
        <!--数据库连接-->
        <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
            <property name="driverClassName" value="${jdbc.driverClassName}"></property>
            <!--链接池中最大连接数,默认为8-->
            <property name="maxActive" value="30"></property>
            <!--链接池中最大空闲连接数,默认为8-->
            <property name="maxIdle" value="10"></property>
            <!--链接池中最小空闲连接数,默认为0-->
            <property name="minIdle" value="0"></property>
            <!--当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位,毫秒数;默认为-1.表示永不超时-->
            <property name="maxWait" value="1000"></property>
            <property name="defaultAutoCommit" value="true"></property>
    
        </bean>
        <!-- mybatis配置 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="datasource"/>
            <!-- 加载Mybatis全局配置文件 -->
            <property name="configLocation" value="classpath:mapper/SqlMapConfig.xml"/>
        </bean>
    
        <!-- 配置mapper扫描器 -->
        <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 扫描包路径,如果需要扫描多个包中间用半角逗号隔开 -->
            <property name="basePackage" value="com.mvc.dao"></property>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>
    </beans>
    
    
    <!-- 该包下的类支持注解,表示会被当作{@code mybatis mapper}处理 配置了之后表示可以自动引入mapper类-->
        <mybatis:scan base-package="com.mvc.dao"/>
    
        <!-- 自动扫描注解的bean -->
        <context:component-scan base-package="com.mvc.dao" />
    
    

    这两句我不知道有什么不同,目的都是一样,可以注入dao层的类,这里的dao层即是mybatis的mapper层,自动注入方便我们在service中注入mapper。然后是配置mybatis的sqlSessionFactory,对应的类是org.mybatis.spring.SqlSessionFactoryBean,类似hibernate的sessionFactory,将数据源配置进来,然后就是再把mybatis的mapper配置文件加载进来,SqlMapConfig.xml,也叫全局配置文件,<property name="configLocation" value="classpath:mapper/SqlMapConfig.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>
    
        <!-- 将数据库连接数据抽取到属性文件中方便测试 -->
        <!-- <properties resource="/WEB-INF/classes/jdbc.properties"></properties> -->
        <!-- 别名的定义 -->
        <!--<typeAliases>-->
            <!--<typeAlias alias="User" type="cn.jxufe.web.mybatis.User"/>-->
        <!--</typeAliases>-->
        <typeAliases>
            <typeAlias alias="Book" type="com.mvc.pojo.Book"/>
        </typeAliases>
    
        <!-- 数据库连接用数据库连接池 -->
    
        <mappers>
            <!-- 加载映射文件 -->
            <!-- 这里也可以使用class来加载映射文件,前提是:使用mapper代理的方法,遵循规范,
            并且两个文件必须同名且在同一目录
            <mapper class="com.wxisme.mybatis0100.mapper.UserMapper"/>
            基于class加载,可以进行批量加载
            -->
            <!-- 通过扫描包的方式来进行批量加载映射文件 -->
            <!--<package name="com.wxisme.ssm.mapper"/>-->
            <mapper resource="mapper/BookMapper.xml"/>
    
        </mappers>
    </configuration>

    这里面主要两个标签,一个是<typeAliases>,这个标签的作用就是配置实体类别名,这样的话我们在xxMapper.xml中可以使用类的别名,可以单个类加载,也可以整个包加载,另外一个是<mappers>,就是加载我们的映射文件了,这里我写了一个BookMapper.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.mvc.dao.BookMapper">
        <insert id="insertBook" parameterType="Book">
            insert into book values( #{id}, #{bookName}, #{isbn}, #{price}, #{stock})
        </insert>
        <!--  查询单条记录  -->
        <select id="getBookById" parameterType="int" resultType="Book">
            select * from book where id = #{id}
        </select>
    </mapper>

    这里我们看一下,<mapper>标签下 namespace就是对应的mapper类,mapper类中写的方法就是我们映射文件的方法(名称要一致),这里的parameterType就是参数类型了,这里我就用到了之前在配置文件中配置的别名了,resultType就是返回类型了,注意如果没有别的配置,这里的Book里的属性,要和book表中字段一模一样才行。也可以手动配置。

    然后我们再回去看一下mybatis.xml中的配置,配置完sqlSessionFactory后,需要加一个mapper扫描器,这里hibernate是没有的,也是mybatis独有的,因为mybatis才有mapper

    <!-- 配置mapper扫描器 -->
        <!-- DAO接口所在包名,Spring会自动查找其下的类 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 扫描包路径,如果需要扫描多个包中间用半角逗号隔开 -->
            <property name="basePackage" value="com.mvc.dao"></property>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>

    这里又扫描了一次mapper包,然后将sqlSessionFactory配置进来,我觉得mapper扫描器是必须要用的,但配置这块还需要具体研究一下。先记录下来。这样配置就基本结束了。

    然后我们看一下调用,mybatis我们可以直接调用mapper类中的方法,至于为什么不像Hibernate那样需要session,是接下来需要学习的

    public class BookServiceImpl implements BookService {
    
        @Autowired
        private BookMapper bookMapper;
    
        public Book getBook(int id) {
            return bookMapper.getBookById(id);
        }
    
        public void insertBook(Book book) {
            bookMapper.insertBook(book);
        }
    }

    这里直接注意bookMapper,bookMapper的方法就是bookMapper.xml中定义的。然后我们在controller中注入BookServiceImpl就行了。

    这里就出现了一个问题,这里我附上我mybatis项目中springbeans.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"
           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.xsd">
    
        <context:component-scan base-package="com.mvc.service"/>
        <bean id ="userService" class="com.mvc.service.impl.BookServiceImpl"/>
    
    
    </beans>

    我想像之前hibernate项目中时直接用扫描包的方式注入BookServiceImpl时,失败了,这地方还不知道原因,也是先记录一下。还是手动的配置一下这个类,才注入成功的。我们写的时候也是,如果不嫌麻烦,可以一个类一个类手动注入,类似<bean id ="userService" class="com.mvc.service.impl.BookServiceImpl"/>这种。注入时名字就为userService。

    这里我再又看一遍代码后知道问题出在哪里了,配置文件是没有问题的,问题出在我并没有在BookServiceImpl这个接口实现类上加上注入@Component这样的注解,所以不能被spring容器识别,从而没有生成spring管理的bean。加上注解就OK了。从这里我们知道了如果想要通过spring的注解注入bean的话,需要两个步骤。第一点就是要在配置文件将想注入的路径配置进去,然后再在bean的开头根据不同bean的作用使用@Controller,@Component,@Repository,@Service注解。

    最后总结一下hibernate和mybatis配置相同和不同的几个地方。

    相同点:1,都需要配置数据源(dbcp,c3p0,proxool)

        2,都需要个.properties文件,用来保存数据库相关属性(比如是什么数据库,用户名,密码之类的),也可以使用xml文件(hibernate可以,mybatis不太清楚不敢说)

        3,都需要配置sessionFactory,hibernate叫sessionFactory,mybatis叫sqlSessionFactory。

    不同点:1,mybatis是需要mapper层的,mapper层对应mapper的映射文件。

        2,在mybatis的sqlSessionFactory,需要将mybatis的全局配置文件加入,全局配置文件中配置实体类的别名typeAliases和映射文件mappers。

        3,mybatis需要配置mapper扫描器,扫描器将扫描mapper包,然后把sqlSessionFactory配置进来。

        4,实现查询的话,hibernate是利用sessionFactory创建的session进行操作,不需要手动写sql。而mybatis则是写好每个xxMapper.xml然后再写对应的mapper类,然后每次调用的时候利用mapper类中的方法实现数据库的操作。

    以上是我个人以一个初学者的角度进行的总结,逻辑也不是很清晰,学术性更不用说了,只当做是给自己以后忘了的时候看的。以后有学习到新的东西还需要做很多补充。在这里先作为记录。



  • 相关阅读:
    [恢]hdu 2005
    [恢]hdu 2004
    [恢]hdu 1093
    [恢]hdu 1092
    [恢]hdu 2008
    [恢]hdu 1091
    [恢]hdu 2006
    [恢]hdu 1089
    [恢]hdu 1094
    OGRE小记
  • 原文地址:https://www.cnblogs.com/qinglangyijiu/p/7809820.html
Copyright © 2020-2023  润新知