在研究Mybatis原理之前笔刹,先看一下java中是如何實(shí)現(xiàn)一次對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)的:
public void testSql() {
Connection connection = null;
Statement statement = null;
try {
//1.獲取dataSource,設(shè)置基本屬性
DataSource dataSource = new BasicDataSource();
//2.從dataSource獲取連接
connection = dataSource.getConnection();
//3.從連接獲得sql執(zhí)行體
statement = connection.createStatement();
//4.創(chuàng)建sql語(yǔ)句
String sql = "select 1 from table1 where id= 1";
//5.執(zhí)行傳入的sql
statement.execute(sql);
//6.獲取執(zhí)行結(jié)果
ResultSet resultSet = statement.getResultSet();
} catch (SQLException e) {
//7.處理異常
e.printStackTrace();
} finally {
//8.清理資源
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
可以看到纹烹,一次完整的數(shù)據(jù)庫(kù)訪問(wèn)過(guò)程最少包含注釋中的8個(gè)操作柑营,這個(gè)過(guò)程用面向?qū)ο蟮姆绞匠橄蟪梢韵聨讉€(gè)接口:DataSource、Connection猎荠、Statement、ResultSet蜀备,再加上期間產(chǎn)生的SQLException異常关摇,就構(gòu)成了基本的java數(shù)據(jù)庫(kù)操作體系。
- DataSource:數(shù)據(jù)庫(kù)資源碾阁,存儲(chǔ)數(shù)據(jù)庫(kù)的url输虱、port、userName脂凶、password等參數(shù)來(lái)建立數(shù)據(jù)庫(kù)連接宪睹,可以用“池”的方式存儲(chǔ)連接愁茁,在需要的時(shí)候提供現(xiàn)有連接,來(lái)減少建立連接的耗時(shí)亭病。
- Connection:一個(gè)連接建立好之后鹅很,應(yīng)當(dāng)提供關(guān)閉的方法--close(),設(shè)置連接狀態(tài)的方法--setAutoCommit()罪帖、setReadOnly()等促煮,獲取連接狀態(tài)的方法--getAutoCommit()、getReadOnly()等整袁,獲取sql執(zhí)行語(yǔ)句的方法--createStatement()菠齿、prepareStatement()等,對(duì)執(zhí)行的語(yǔ)句進(jìn)行回滾的方法--rollback()坐昙。這些方法基本上包含了針對(duì)數(shù)據(jù)庫(kù)的所有RUD操作绳匀。
-
Statement:sql執(zhí)行語(yǔ)句。包含要執(zhí)行的sql炸客、sql的執(zhí)行結(jié)果以及關(guān)閉的方法close()疾棵。
PreparedStatement:預(yù)制sql語(yǔ)句,繼承自Statement嚷量。預(yù)編譯并存儲(chǔ)sql語(yǔ)句陋桂,可以通過(guò)setter(int ,object)方法設(shè)置sql語(yǔ)句中的參數(shù)逆趣,實(shí)現(xiàn)動(dòng)態(tài)編寫(xiě)sql語(yǔ)句蝶溶。 - CallableStatement:可調(diào)用語(yǔ)句,繼承自PreparedStatement宣渗。它提供了一種從 Java 程序中調(diào)用服務(wù)器上的存儲(chǔ)過(guò)程的方式抖所,也可以通過(guò)順序位置或命名參數(shù)的方式輸入?yún)?shù)。
- **ResultSet **:返回的結(jié)果集痕囱,通過(guò)next()方法順序訪問(wèn)結(jié)果中的每一列田轧,支持獲取指定javaType的結(jié)果和關(guān)閉的方法。
- SQLException:數(shù)據(jù)庫(kù)訪問(wèn)和操作過(guò)程中的異常鞍恢。所有數(shù)據(jù)庫(kù)異常的父類傻粘,需要針對(duì)具體的異常進(jìn)行細(xì)化。