Spring集成MyBatis框架

    Java在寫數據庫查詢時,我接觸過四種方式:html

    一、純Java代碼,引用對應的數據庫驅動包,本身寫鏈接與釋放邏輯(能夠用鏈接池)java

    這種模式實際上性能是很是不錯的,可是使用起來並非很是方便:一是要手工爲Connection作獲取與釋放,大量的冗餘代碼也容易出錯;另外一個是,複雜的SQL用字符串寫起來簡直不可維護(換行、可視長度、參數都是問題)。mysql

    二、使用Spring JdbcTemplateweb

    這個其實仍是挺不錯的,配置比較簡單,功能豐富上比手工管理Connection要舒服多了,並且代碼也比較簡潔。突出的問題就是SQL維護仍是挺麻煩的。spring

    三、使用Hibernate框架sql

    一句話,配置很麻煩,用起來仍是挺不錯的。可是有一個致命缺陷,它並不能像單表查詢同樣能夠幫咱們完成多表的查詢。若是有複雜的多表查詢或查詢條件,仍是得用SQL去查,這對於一些業務邏輯複雜或者會常常變動的業務來講,後期維護就是災難,改到想哭(由於真的是很混亂,必定要開始就規劃好)。數據庫

    四、使用MyBatis框架mybatis

    這個是當前我所作項目最喜歡用的數據庫持久化框架了,它經過XML配置能夠很是簡單直觀地幫你完成各類條件、判斷、多表的綜合查詢,實現方式比Java代碼拼SQL要舒服太多了,在這方面更是甩Hibernate一條街。要說易用性,其實也挺容易用的,可是配置上也要對一些數據作映射,不過相對而言更加靈活。它的實體類並不必定要是數據庫物理表,而能夠是任意查詢出來的數據集(相似數據傳輸對象DTO)。mvc

   

    簡單總結一下:app

    配置容易程度:1 > 2 > 4 > 3

    使用便捷程度:2 > 3 > 4 > 1

    查詢靈活程度:4 > 1 = 2 > 3

    下面將開始介紹Spring集成MyBatis的配置和使用,項目基於Maven構建,鏈接Mysql數據庫:

 

1、Maven配置

 1         <!-- Spring Base -->
 2         <dependency>
 3             <groupId>org.springframework</groupId>
 4             <artifactId>spring-beans</artifactId>
 5             <version>4.2.5.RELEASE</version>
 6         </dependency>
 7         <dependency>
 8             <groupId>org.springframework</groupId>
 9             <artifactId>spring-context</artifactId>
10             <version>4.2.5.RELEASE</version>
11         </dependency>
12         <dependency>
13             <groupId>org.springframework</groupId>
14             <artifactId>spring-jdbc</artifactId>
15             <version>4.2.5.RELEASE</version>
16         </dependency>
17         <!-- MySql -->
18         <dependency>
19             <groupId>mysql</groupId>
20             <artifactId>mysql-connector-java</artifactId>
21             <version>5.1.39</version>
22         </dependency>
23         <dependency>
24             <groupId>com.mchange</groupId>
25             <artifactId>c3p0</artifactId>
26             <version>0.9.5.2</version>
27         </dependency>
28         <dependency>
29             <groupId>org.mybatis</groupId>
30             <artifactId>mybatis</artifactId>
31             <version>3.4.1</version>
32         </dependency>
33         <dependency>
34             <groupId>org.mybatis</groupId>
35             <artifactId>mybatis-spring</artifactId>
36             <version>1.3.0</version>
37         </dependency>

    關於Spring的包引用,我這裏的引用只做爲參考,其它web、mvc的包視各業務來引用。若是不用Maven,就本身乖乖引jar包,或者使用其它包管理吧。

 

2、Spring配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 4 
 5     <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 6         <property name="driverClass" value="com.mysql.jdbc.Driver" />
 7         <property name="jdbcUrl" value="jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxdb" />
 8         <property name="user" value="lekko" />
 9         <property name="password" value="xxx" />
10         <property name="minPoolSize" value="2" />
11         <property name="maxPoolSize" value="100" />
12     </bean>
13 
14     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
15         <property name="mapperLocations" value="classpath:mapper/**/*Mapper.xml" />
16         <property name="dataSource" ref="myDataSource" />
17     </bean>
18  
19     <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
20         <property name="basePackage" value="lekko.code.**.dao" />
21     </bean>
22 
23 </beans>

    這裏的配置比較關鍵。

    一、myDataSource是一個ComboPooledDataSource類型的實例bean,它實現了數據庫鏈接池的功能。

    二、sqlSessionFactory是MyBatis用於創建查詢的工廠實例,它包括了一個mapperLocations定位,以及dataSource數據庫鏈接來源。

            - mapperLocations指定了MyBatis將會搜索的路徑,支持Ant風格路徑。在指定的路徑下,MyBatis會把讀取其中的xml查詢,並將用於後面的dao映射。

            - dataSource是來源數據庫,這裏直接就是前面的鏈接池。

    三、mapperScannerConfigurer是MyBatis用於自動創建數據庫dao類的配置器。

            - basePackage指定了要掃描的包名稱,支持Ant風格路徑。在指定的包名稱下,MyBatis經過Spring,會自動發現對應包名下的dao接口,在後面須要查詢時,爲接口提供實現。

    下圖是MyBatis的大致框架,能夠做爲上述配置的一個補述:

    也就是說,MyBatis會根據XML配置Mapper去組成數據庫查詢,而後把查詢中所涉及的參數、返回結果,都映射成爲Java對象(或元數據類型)。最後交由數據庫去執行,返回。

3、dao接口
 1 package lekko.code.test.dao;
 2 
 3 import lekko.code.test.model.TestModel;
 4 import org.springframework.stereotype.Repository;
 5 
 6 /**
 7  * 測試DAO
 8  */
 9 @Repository
10 public interface TestDao {
11 
12     TestModel getTest(String name);
13 
14     int addTest(String name);
15 
16 }

    上面這個接口,因爲屬於包lekko.code.**.dao,因此會被識別爲須要映射的dao。

    接口只有兩個方法,一個是查詢getTest,一個是新增addTest。至於getTest已經根據須要,我這裏提取成了一個實體類TestModel:

 1 package lekko.code.test.model;
 2 
 3 /**
 4  * 測試數據類
 5  */
 6 public class TestModel {
 7 
 8     private int id;
 9     private String name;
10 
11     public String getName() {
12         return name;
13     }
14     public void setName(String name) {
15         this.name = name;
16     }
17 
18     public int getId() {
19         return id;
20     }
21     public void setId(int id) {
22         this.id = id;
23     }
24 
25 }

 

4、Mapper映射

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 
 4 <mapper namespace="lekko.code.test.dao.TestDao">
 5 
 6     <select id="getTest" resultType="lekko.code.test.model.TestModel">
 7         select id, name from Test where name = #{name}
 8     </select>
 9 
10     <insert id="addTest">
11         insert into Test (name, createdTime) values (#{name}, now())
12     </insert>
13 
14 </mapper>

    語法我就不詳細解釋了,百度一下就有。各類條件、判斷、參數都有解釋。我本人很是喜歡這種自由度高,sql看起來也很舒服的配置方式。

    

    至此,大致的使用介紹已經完畢。MyBatis仍是挺不錯的,建議你們在業務合適的狀況下試用試用。

    轉載請註明原址:http://www.cnblogs.com/lekko/p/6367732.html 

相關文章
相關標籤/搜索