使用MyBatis進行資料庫對映
在Java中,MyBatis是1個支援自定義SQL的持久層框架,它可以儲存過程和高階的對映。
在正式介紹之前,我們首先通過mvn進行安裝,我們將下面的內容新增到pom.xml
配置檔案中:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency>
上述操作完成後,我們首先新建1個MyBatis的配置檔案,使用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="db.properties"></properties> <environments default="my-config"> <environment id="my-config"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}"></property> <property name="url" value="${url}"></property> <property name="username" value="${user}"></property> <property name="password" value="${pwd}"></property> </dataSource> </environment> </environments> <mappers> <mapper resource="mapping.xml" /> </mappers> </configuration>
我們將上述的內容寫入到config.xml
檔案中。其中environments是配置的環境,其中的environment用於對應的環境的配置。這裡,我們預設使用的環境是my-config
,其使用JDBC的方式進行連線,資料來源的方式為連線池。其中,資料來源可以使用:
-
UNPOOLED,每次請求時開啟和關閉連線
-
POOLED,連線池
-
JNDI,主要用於EJB或應用伺服器中使用
而環境通過對db.properties
中的內容進行配置,其內容如下:
url=jdbc:oracle:thin:@xxx.xxx.xxx.xx:1521/orcl user=xxx pwd=xxx driver=oracle.jdbc.driver.OracleDriver
更多關於MyBatis的配置,可以ofollow,noindex" target="_blank">參考 。其中包括別名、型別處理器typeHandler的說明,這裡就不一一敘述了。
最後,我們還設定了1個匹配的資源,其支援4種方式:
-
resource,使用相對於類路徑的資源引用
-
url,使用完全限定資源定位符
-
class,使用對映器介面實現類的完全限定類名
-
name,將包內的對映器介面實現全部註冊為對映器
在這裡我們使用resource的方式指定匹配的檔案的名稱。其內容如下:
<?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="user"> <select id="es_temp" fetchSize="10" resultType="java.util.LinkedHashMap"> select ENTNAME,UNISCID,INDUSTRY,REGION,OPSTATE,ESTYEAR,SCALE from xxx where rownum <![CDATA[<=]]> 20 </select> </mapper>
由於在XML中,括號具有單獨的意義,因此如果我們使用尖括號會出現解析錯誤,此時我們可以使用HTML實體轉義編碼,如<
來進行處理,或者直接使用<![CDATA[xxxx]]>
進行實際符號的處理。
我們通過mapper標籤中的namespace定義了對映的名稱空間,其中的id用於對應語句的匹配,方便進行命名解析。
接著是對應的Java程式碼的編寫:
import java.io.Reader; import java.util.*; import com.alibaba.fastjson.*; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*; public class Demo { public static SqlSessionFactory sessionFactory; public static void main(String[] args) { try { Reader reader = Resources.getResourceAsReader("config.xml"); sessionFactory = new SqlSessionFactoryBuilder().build(reader); SqlSession session = sessionFactory.openSession(); List<LinkedHashMap<?,?>> result = session.selectList("user.es_temp"); String json_str = JSON.toJSONString(result); System.out.println(json_str); session.close(); } catch (Exception e){ e.printStackTrace(); } } }
在這裡,我們通過Resources類對配置檔案進行讀取,然後構建1個SqlSessionFactory,之後通過其openSession得到1個Session物件,這樣我們就可以進行對應的SQL操作了。
我們使用selectList函式進行對應SQL的執行,其使用的是名稱空間.id
的方式來進行對應的操作。另外,還有1個selectOne函式用於單個記錄的查詢,對於多個結果會直接返回異常。
其結果為:
[ { "ENTNAME":"深圳市藍海匯裝飾設計工程有限公司", "UNISCID":"91440300359236108Q", "INDUSTRY":"批發和零售業", "REGION":"深圳", "OPSTATE":"存續(在營、開業、在冊)", "ESTYEAR":"3年以下", "SCALE":"小微企業" }, { "ENTNAME":"暴風雨(深圳)電子商務有限公司", "UNISCID":"91440300MA5DF887XE", "INDUSTRY":"批發和零售業", "REGION":"深圳", "OPSTATE":"存續(在營、開業、在冊)", "ESTYEAR":"3年以下", "SCALE":"小微企業" }, ... ]
可以看到,通過上述的方式,我們可以很容易的實現程式碼與SQL語句的分離。但是,對應的SQL語句依賴於資料庫,可移植性差。另外,對於欄位多、關聯表多時,編寫SQL語句的工作量很大。