Java在寫數據庫查詢時,我接觸過四種方式:
1、純Java代碼,引用對應的數據庫驅動包,自己寫連接與釋放邏輯(可以用連接池)
這種模式實際上性能是非常不錯的,但是使用起來并不是非常方便:一是要手工為Connection做獲取與釋放,大量的冗余代碼也容易出錯;另一個是,復雜的SQL用字符串寫起來簡直不可維護(換行、可視長度、參數都是問題)。
2、使用Spring JdbcTemplate
這個其實還是挺不錯的,配置比較簡單,功能豐富上比手工管理Connection要舒服多了,而且代碼也比較簡潔。突出的問題就是SQL維護還是挺麻煩的。
3、使用Hibernate框架
一句話,配置很麻煩,用起來還是挺不錯的。但是有一個致命缺陷,它并不能像單表查詢一樣可以幫我們完成多表的查詢。如果有復雜的多表查詢或查詢條件,還是得用SQL去查,這對于一些業務邏輯復雜或者會經常變更的業務來說,后期維護就是災難,改到想哭(因為真的是很混亂,一定要開始就規劃好)。
4、使用MyBatis框架
這個是當前我所做項目最喜歡用的數據庫持久化框架了,它通過XML配置可以非常簡單直觀地幫你完成各種條件、判斷、多表的綜合查詢,實現方式比Java代碼拼SQL要舒服太多了,在這方面更是甩Hibernate一條街。要說易用性,其實也挺容易用的,但是配置上也要對一些數據做映射,不過相對而言更加靈活。它的實體類并不一定要是數據庫物理表,而可以是任意查詢出來的數據集(類似數據傳輸對象DTO)。
簡單總結一下:
配置容易程度:1 > 2 > 4 > 3
使用便捷程度:2 > 3 > 4 > 1
查詢靈活程度:4 > 1 = 2 > 3
下面將開始介紹Spring集成MyBatis的配置和使用,項目基于Maven構建,連接Mysql數據庫:
一、Maven配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<!-- Spring Base --> < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-beans</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-context</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-jdbc</ artifactId > < version >4.2.5.RELEASE</ version > </ dependency > <!-- MySql --> < dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > < version >5.1.39</ version > </ dependency > < dependency > < groupId >com.mchange</ groupId > < artifactId >c3p0</ artifactId > < version >0.9.5.2</ version > </ dependency > < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.4.1</ version > </ dependency > < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis-spring</ artifactId > < version >1.3.0</ version > </ dependency > |
關于Spring的包引用,我這里的引用只作為參考,其它web、mvc的包視各業務來引用。如果不用Maven,就自己乖乖引jar包,或者使用其它包管理吧。
二、Spring配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > < bean id = "myDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method = "close" > < property name = "driverClass" value = "com.mysql.jdbc.Driver" /> < property name = "jdbcUrl" value = "jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxdb" /> < property name = "user" value = "lekko" /> < property name = "password" value = "xxx" /> < property name = "minPoolSize" value = "2" /> < property name = "maxPoolSize" value = "100" /> </ bean > < bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > < property name = "mapperLocations" value = "classpath:mapper/**/*Mapper.xml" /> < property name = "dataSource" ref = "myDataSource" /> </ bean > < bean id = "mapperScannerConfigurer" class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > < property name = "basePackage" value = "lekko.code.**.dao" /> </ bean > </ beans > |
這里的配置比較關鍵。
1、myDataSource是一個ComboPooledDataSource類型的實例bean,它實現了數據庫連接池的功能。
2、sqlSessionFactory是MyBatis用于建立查詢的工廠實例,它包括了一個mapperLocations定位,以及dataSource數據庫連接來源。
- mapperLocations指定了MyBatis將會搜索的路徑,支持Ant風格路徑。在指定的路徑下,MyBatis會把讀取其中的xml查詢,并將用于后面的dao映射。
- dataSource是來源數據庫,這里直接就是前面的連接池。
3、mapperScannerConfigurer是MyBatis用于自動建立數據庫dao類的配置器。
- basePackage指定了要掃描的包名稱,支持Ant風格路徑。在指定的包名稱下,MyBatis通過Spring,會自動發現對應包名下的dao接口,在后面需要查詢時,為接口提供實現。
下圖是MyBatis的大體框架,可以作為上述配置的一個補述:
也就是說,MyBatis會根據XML配置Mapper去組成數據庫查詢,然后把查詢中所涉及的參數、返回結果,都映射成為Java對象(或元數據類型)。最后交由數據庫去執行,返回。
三、dao接口
1
2
3
4
5
6
7
8
9
10
11
|
package lekko.code.test.dao; import lekko.code.test.model.TestModel; import org.springframework.stereotype.Repository; /** * 測試DAO */ @Repository public interface TestDao { TestModel getTest(String name); int addTest(String name); } |
上面這個接口,由于屬于包lekko.code.**.dao,所以會被識別為需要映射的dao。
接口只有兩個方法,一個是查詢getTest,一個是新增addTest。至于getTest已經根據需要,我這里提取成了一個實體類TestModel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package lekko.code.test.model; /** * 測試數據類 */ public class TestModel { private int id; private String name; public String getName() { return name; } public void setName(String name) { this .name = name; } public int getId() { return id; } public void setId( int id) { this .id = id; } } |
四、Mapper映射
1
2
3
4
5
6
7
8
9
10
|
<? 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 = "lekko.code.test.dao.TestDao" > < select id = "getTest" resultType = "lekko.code.test.model.TestModel" > select id, name from Test where name = #{name} </ select > < insert id = "addTest" > insert into Test (name, createdTime) values (#{name}, now()) </ insert > </ mapper > |
語法我就不詳細解釋了,百度一下就有。各種條件、判斷、參數都有解釋。我本人非常喜歡這種自由度高,sql看起來也很舒服的配置方式。
至此,大體的使用介紹已經完畢。MyBatis還是挺不錯的,建議大家在業務合適的情況下試用試用。
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!
原文鏈接:http://www.cnblogs.com/lekko/p/6367732.html