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類中的方法實現數據庫的操作。

 

以上是我個人以一個初學者的角度進行的總結,邏輯也不是很清晰,學術性更不用說了,只當做是給自己以后忘了的時候看的。以后有學習到新的東西還需要做很多補充。在這里先作為記錄。

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM