1. 程式人生 > >Java Server 理解與實踐 —— 整合Mybatis到Spring專案

Java Server 理解與實踐 —— 整合Mybatis到Spring專案

引言

既然是Java Server,當然離不開與資料庫互動。而Java與資料庫互動,又永遠繞不開一個話題—— ORM。

物件關係對映(英語:(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式技術,用於實現面向物件程式語言裡不同型別系統的資料之間的轉換

簡單點來說,就是我們要將資料庫裡面的一個個欄位,轉化成為Java裡面的物件的一個個屬性,當然我們可以通過jdbc直接,然後通過讀取結果集,呼叫物件的setter方法來完成這個過程。但是,框架的存在,就是為了減少這些繁雜而重複的工作。Mybatis正是這樣一個ORM框架。

在介紹Mybatis框架之前,再簡單說一下為什麼我會選擇這個框架。

  • 簡單,Mybatis框架的程式碼庫大小隻有1.5M,對比於JPA動輒7-8M的程式碼庫,要輕巧很多,輕巧意味著簡單,意味著能更迅速更深刻地瞭解這個開源框架。

  • 直接,直接通過配置sql的方式設定CURD語句,可以最充分地利用資料庫的索引,提升查詢效能。JPA雖然省去了手寫SQL,但是卻難以生成最佳索引的查詢語句。

  • 可擴充套件。支援編寫外掛。

那麼,接下來就開始Mybatis的介紹吧。這系列的文章將會分成幾部分,首先,我們從如何使用開始。我們將會基於之前文章中的Java Server專案繼續。該專案也已經上傳到github上。

關於Mybatis的使用例子,我們可以從官方文件中迅速地學習,上手,因此關於mapper等mybatis基礎概念,在這裡就不做過多的闡述了。下面主要是如何將Mybatis整合到Spring專案中。

Maven配置

要將Mybatis整合到Spring專案中,我們需要增加以下這幾個依賴。

        <!--spring jdbc 用於管理Spring的事務-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.4.RELEASE</version
>
</dependency> <!-- mybatis 這裡採用3.4.1的版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.1</version> </dependency> <!-- mysql connector 與資料庫建立連線 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- dbcp2 資料庫連線池管理 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <!-- mybatis 與Spring的整合工具 必須採用1.3.1的版本 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency>

上面的配置都是一些基本配置,包括連線資料庫,連線池管理等等。但必須注意但是,mybatis-spring的版本與mybatis的版本必須使用筆者的版本或者更高,否則會因為兩者之間版本不匹配而引發一些問題。

Bean配置

在依賴新增完成之後,我們就可以開始增加我們的Bean配置了。

    <!--將配置檔案寫在配置檔案中,讀取配置檔案 -->
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:/META-INF/jdbc.properties</value>
            </list>
        </property>
    </bean>

    <!--配置dataSource -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
          destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- 配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 啟用mybatis的掃描功能 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="mapper" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

在這裡,因為我們暫時不使用spring的事務管理,因此將事務管理交給mybatis-spring中預設的SpringManagedTransaction去管理。

啟用掃描功能是為了儘量簡化專案的配置,配置了MapperScannerConfigurer之後,我們就可以直接通過註解來定義Mybatis的mapper而不需要再寫額外的xml檔案了。

類使用

首先是Mapper類。

public interface UserMapper {
    @Select("Select account from user where id = #{id}")
    String selectAccountById(@Param("id") int id);
}

這裡面有兩個需要注意的地方。

  • 使用#{param}使用引數傳入的形式。
  • 使用@Param宣告方法引數與sql變數中的繫結關係。

這裡的sql是簡單的select單個變數並且直接返回,我們也可以返回一個物件,只要在物件中有相應的屬性就可以了。另外mybatis也支援在select語句中使用script,比如判斷,比如迴圈。

然後是Service類。

@Service
public class UserService {
    private UserMapper userMapper;

    @Autowired
    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public String getUserAccountById(Integer id) {
        return userMapper.selectAccountById(id);
    }
}

啟用了MapperScan之後,mapper會初始化成為bean,因此可以直接使用autowired進行組裝。

最後,在Controller中進行呼叫成為api暴露出去就可以通過postMan等工具呼叫了。

@RestController
@RequestMapping(value="/noAuth")
public class NoAuthController {

    private UserService userSrv;

    @Autowired
    public NoAuthController(UserService userSrv) {
        this.userSrv = userSrv;
    }

    @RequestMapping(value="/test/{id}")
    public @ResponseBody String test(@PathVariable("id") Integer id) {
        return userSrv.getUserAccountById(id);
    }
}

以上,就是一個最簡單的Mybatis與整合的最簡單例子。

小結

Mybatis是一個簡單的ORM框架,使用者自己定義sql,定義返回的Java物件,然後它進行資料庫查詢,將查詢結果對映到Java物件中。它最大的特色就是簡潔,簡單的事物管理,簡單的快取管理,簡單的物件對映以及語句解析。

這篇文章主要講述瞭如何將Mybatis整合到Spring專案中,關於Mybatis的深入介紹,會在接下來的文章中完成。

關於Mybatis的架構解析,可以參閱這篇文章