1. 程式人生 > >Mybatis-Generator插件的使用與Spring集成Mybatis的配置

Mybatis-Generator插件的使用與Spring集成Mybatis的配置

Mybatis Mybatis-Generator插件 Spring集成Mybatis 持久層框架 SSM

Mybatis-Generator插件

Mybatis-Generator是一個用於自動生成dao層接口、pojo以及mapper xml的一個Mybatis插件,該插件有三種用法:命令行運行、Eclipse插件、maven插件。個人覺得maven插件最方便,可以在eclipse/intellij idea等ide上通用,本文也是介紹在maven中配置並使用這個插件。

現在我mysql中有一個school數據庫,該數據庫有student、cls兩張表格,表結構如下:

student表:
技術分享圖片

cls表:
技術分享圖片

首先在工程中的pom.xml文件,配置如下依賴及插件:

    ...
    <dependencies>
        ...
        <!-- mybatis3 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!-- mysql驅動包依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>mybatis-05</finalName>
        <plugins>
            <!-- Mybatis-Generator插件,自動生成代碼 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
                    <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

在工程的resources目錄下,創建一個屬性配置文件:datasource.properties,配置內容如下:

db.driverLocation=E:\\MavenClassFile\\mysql\\mysql-connector-java\\5.1.45\\mysql-connector-java-5.1.45.jar   // mysql驅動包的本地路徑,這個jar包的版本要和pom.xml裏配置的版本一致
db.driverClassName=com.mysql.jdbc.Driver  // 驅動類的包名
db.url=jdbc:mysql:///school?characterEncoding=utf-8   // 連接數據庫的url
db.username=root   // 用戶名
db.password=your_password   // 密碼

然後繼續在resources目錄下,創建Mybatis-Generator插件的配置文件: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>
    <!--導入屬性配置-->
    <properties resource="datasource.properties"/>

    <!--指定特定數據庫的jdbc驅動jar包的位置-->
    <classPathEntry location="${db.driverLocation}"/>

    <!-- 選擇運行的mybatis版本 -->
    <context id="default" targetRuntime="MyBatis3">

        <!-- optional,旨在創建class時,對註釋進行控制 -->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!--jdbc的數據庫連接 -->
        <jdbcConnection
                driverClass="${db.driverClassName}"
                connectionURL="${db.url}"
                userId="${db.username}"
                password="${db.password}">
        </jdbcConnection>

        <!-- 非必需,類型處理器,在數據庫類型和java類型之間的轉換控制-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- Model模型生成器,用來生成含有主鍵key的類,記錄類 以及查詢Example類
            targetPackage     指定生成的model生成所在的包名
            targetProject     指定在該項目下所在的路徑
        -->
        <javaModelGenerator targetPackage="org.zero01.pojo" targetProject="./src/main/java">
            <!-- 是否允許子包,即targetPackage.schemaName.tableName -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否對model添加 構造函數 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否對類CHAR類型的列的數據進行trim操作 -->
            <property name="trimStrings" value="true"/>
            <!-- 建立的Model對象是否不可改變  即生成的Model對象不會有 setter方法,只有構造方法 -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>

        <!--mapper xml映射文件生成所在的目錄 為每一個數據庫的表生成對應的SqlMap文件 -->
        <sqlMapGenerator targetPackage="mappers" targetProject="./src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- 客戶端代碼,生成易於使用的針對Model對象和XML配置文件 的代碼
                type="ANNOTATEDMAPPER",生成Java Model 和基於註解的Mapper對象
                type="MIXEDMAPPER",生成基於註解的Java Model 和相應的Mapper對象
                type="XMLMAPPER",生成SQLMap XML文件和獨立的Mapper接口
        -->

        <!-- targetPackage:dao層mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="org.zero01.dao" targetProject="./src/main/java">
            <!-- enableSubPackages:是否讓schema作為包的後綴 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <!-- 配置表格映射 -->
        <table tableName="student" domainObjectName="Student" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
        <table tableName="cls" domainObjectName="Cls" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

完成以上配置之後,點擊右邊的Maven Projects窗口,雙擊插件進行運行:
技術分享圖片

運行成功:
技術分享圖片

生成的dao層接口、pojo類以及mapper xml文件如下:
技術分享圖片

有了這個自動生成的插件之後,就不需要自己手動去創建dao接口、pojo類以及mapper xml文件了,大大提高了開發效率。


在Spring中集成Mybatis

現在後端開發都流行使用SSM框架,而SSM分別指的是Spring、SpringMVC、Mybatis,那麽我們就會需要在Spring中集成Mybatis,這樣就可以使用Spring容器來進行統一的管理了。想要在在Spring中集成Mybatis需要用到一個包:MyBatis-Spring。

什麽是MyBatis-Spring?

  • MyBatis-Spring 會幫助你將 MyBatis 代碼無縫地整合到 Spring 中。 使用這個類庫中的類,Spring 將會加載必要的 MyBatis 工廠類和 session 類。 這個類庫也提供一個簡單的方式來註入 MyBatis 數據映射器和 SqlSession 到業務層的 bean 中。 而且它也會處理事務, 翻譯 MyBatis 的異常到 Spring 的 DataAccessException 異常(數據訪問異常)中。最終,它並不會依賴於 MyBatis,Spring 或 MyBatis-Spring 來構建應用程序代碼。

MyBatis-Spring誕生動機:

  • 正如第二版那樣,Spring 3.0 也僅支持 iBatis2。那麽,我們就想將 MyBatis3 的支持添加到 Spring3.0(參考 Spring Jira 中的問題)中。而不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方發布前就結束了。 因為 Spring 開發團隊不想發布一個基於非發布版的 MyBatis 的整合支持,那麽 Spring 官方的支持就不得不繼續等待了。想要在 Spring 中支持 MyBatis,MyBatis 社區認為現在應該是自己團結貢獻者和有興趣的人一起來開始將 Spring 的整合作為 MyBatis 社區的子項目的時候了。
要求:
MyBatis-Spring要求Java5及以上版本還有下面列出的MyBatis和Spring版本:
MyBatis-Spring MyBatis Spring
1.0.0 或 1.0.1 3.0.1 到 3.0.5 3.0.0 或以上
1.0.2 3.0.6 3.0.0 或以上
1.1.0 3.1.0 或以上 3.0.0 或以上

官方文檔地址如下:

http://www.mybatis.org/spring/zh/index.html


介紹完MyBatis-Spring之後,我們就來實際動手操作、配置吧。首先在pom.xml文件中,配置如下依賴:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- 集成mybatis到Spring的包 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.45</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.4</version>
    </dependency>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20171018</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
        <!--<scope>runtime</scope>-->
    </dependency>
</dependencies>

在我們之前創建的datasource.properties文件中,增加配置內容如下:

db.initialSize = 20
db.maxActive = 50
db.maxIdle = 20
db.minIdle = 10
db.maxWait = 10
db.defaultAutoCommit = true
db.minEvictableIdleTimeMillis = 3600000

然後在resources目錄下創建Spring的配置文件:applicationContext-datasource.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:tx="http://www.springframework.org/schema/tx"
       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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 開啟註解包掃描 -->
    <context:component-scan base-package="org.zero01" annotation-config="true"/>

    <!-- 加載屬性文件 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="2"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:datasource.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="utf-8"/>
    </bean>

    <!-- 配置數據庫連接池 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driverClassName}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.username}"/>
        <property name="password" value="${db.password}"/>
        <!-- 連接池啟動時的初始值 -->
        <property name="initialSize" value="${db.initialSize}"/>
        <!-- 連接池的最大值 -->
        <property name="maxActive" value="${db.maxActive}"/>
        <!-- 最大空閑值.當經過一個高峰時間後,連接池可以慢慢將已經用不到的連接慢慢釋放一部分,一直減少到maxIdle為止 -->
        <property name="maxIdle" value="${db.maxIdle}"/>
        <!-- 最小空閑值.當空閑的連接數少於閥值時,連接池就會預申請去一些連接,以免洪峰來時來不及申請 -->
        <property name="minIdle" value="${db.minIdle}"/>
        <!-- 最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制 -->
        <property name="maxWait" value="${db.maxWait}"/>
        <!--#給出一條簡單的sql語句進行驗證 -->
        <!--<property name="validationQuery" value="select getdate()" />-->
        <property name="defaultAutoCommit" value="${db.defaultAutoCommit}"/>
        <!-- 回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中 -->
        <!--<property name="removeAbandoned" value="true" />-->
        <!-- 數據庫連接過多長時間不用將被視為被遺棄而收回連接池中 -->
        <!--<property name="removeAbandonedTimeout" value="120" />-->
        <!-- #連接的超時時間,默認為半小時。 -->
        <property name="minEvictableIdleTimeMillis" value="${db.minEvictableIdleTimeMillis}"/>

        <!--# 失效檢查線程運行時間間隔,要小於MySQL默認-->
        <property name="timeBetweenEvictionRunsMillis" value="40000"/>
        <!--# 檢查連接是否有效-->
        <property name="testWhileIdle" value="true"/>
        <!--# 檢查連接有效性的SQL語句-->
        <property name="validationQuery" value="SELECT 1 FROM dual"/>
    </bean>

    <!-- 集成mybatis -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath*:mappers/*Mapper.xml"/>
    </bean>

    <!-- 掃描dao層接口 -->
    <bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="org.zero01.dao"/>
    </bean>

    <!-- 使用@Transactional進行聲明式事務管理需要聲明下面這行 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
    <!-- 事務管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="rollbackOnCommitFailure" value="true"/>
    </bean>
</beans>

接著再創建一個主配置文件:applicationContext.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="org.zero01" annotation-config="true"/>

    <!-- 導入子配置文件 -->
    <import resource="applicationContext-datasource.xml"/>

</beans>

以上我們就已經完成了在spring集成mybatis的配置了,但是ssm框架中現在只完成了兩個框架的配置,還有一個SpringMVC沒配置呢,所以還需要在WEB-INF的web.xml中,增加如下內容來配置SpringMVC:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 編碼過濾器 -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- web容器啟動/停止監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

    <!-- web容器與spring上下文整合的監聽器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- spring配置文件路徑 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- 配置springmvc的前端控制器:dispatcherServlet -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

然後在WEB-INF下創建一個dispatcherServlet-servlet.xml文件,該文件作為SpringMVC的配置文件,內容如下:

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
       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
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 開啟註解包掃描 -->
    <context:component-scan base-package="org.zero01" annotation-config="true"/>

    <mvc:annotation-driven>
        <!-- 信息轉換器 -->
        <mvc:message-converters>
            <!-- 配置字符串轉換器 -->
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/plain;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
            <!-- 配置json轉換器 -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
</beans>

到此為止,我們就已經把SSM框架都搭建好了,接下來就是測試環節,看看我們的工程能否跑通。創建一個用作測試的控制器類,代碼如下:

package org.zero01.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zero01.dao.ClsMapper;
import org.zero01.dao.StudentMapper;
import org.zero01.pojo.Cls;
import org.zero01.pojo.Student;

import java.util.HashMap;
import java.util.Map;

@RestController
public class TestController {

    @Autowired
    private ClsMapper clsMapper;
    @Autowired
    private StudentMapper studentMapper;

    @RequestMapping("test.do")
    public Map<String, Object> test() {

        Student student = studentMapper.selectByPrimaryKey(1);
        Cls cls = clsMapper.selectByPrimaryKey(student.getCid());

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("student", student);
        map.put("cls", cls);

        return map;
    }
}

配置並啟動Tomcat服務器,訪問test.do接口,返回結果如下:
技術分享圖片

可以看到,正常返回了期望的數據,那麽就代表我們的工程能夠正常跑通的,接下來就可以愉快的coding了。

Mybatis-Generator插件的使用與Spring集成Mybatis的配置