說明
這一次我所想要做的事,是系統的學習一下mybatis,結合官網文檔以及各種網絡資料和以往實踐經驗。
既然是系統的學,就免不了需要了解他所要解決的事情。
據我目前的理解,作爲一個持久層框架,mybatis歸根結底解決的問題其實就是jdbc那幾句話的問題。因此,在此之前,就必須先充分熟悉jdbc操作數據庫的必要步驟。
環境準備
jdbc和mybatis既然是用來操作數據庫的,那麼數據庫就是必備的條件,所以,爲了後邊的實例,這裏先要創建一個簡單的數據表(注:全過程使用mysql數據庫):
CREATE TABLE `user` ( `id` int(5) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(3) NOT NULL, `role` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
與此同時,再建立一個與之對應的實體類,供後續使用:
/** * 用戶實體類 * * @author 塗宗勳 * @date 2018年4月25日 */ public class UserModel { private int id; private String name; private int age; private int role; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getRole() { return role; } public void setRole(int role) { this.role = role; } @Override public String toString() { return "UserModel [id=" + id + ", name=" + name + ", age=" + age + ", role=" + role + "]"; } }
jdbc基礎實現
準備工作做完了,然後就要進入jdbc的正題了。
可能現在絕大多數項目都不是直接使用jdbc,而是用mybatis、jpa等框架,因此如果手寫的話,可能有相當多的一部分人並不能保證百分之百正確的寫出來。
一般來說,原生的jdbc代碼基本需要遵循如下例子中的五步,其他都差不多是在這五個步驟上的演變:
// 1、加載驅動 Class.forName("com.mysql.jdbc.Driver"); // 2、獲取連接 String url = "jdbc:mysql://localhost:3306/test"; String username = "tuzongxun"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); // 3、創建statement Statement statement = connection.createStatement(); // 4、執行sql String sql = "select * from user"; ResultSet resultSet = statement.executeQuery(sql); // 5、處理結果 while (resultSet.next()) { UserModel user = new UserModel(); user.setId(resultSet.getInt("id")); user.setName(resultSet.getString("name")); user.setAge(resultSet.getInt("age")); user.setRole(resultSet.getInt("role")); System.out.println(user); }
上述代碼就是一個極其簡單的原始jdbc的例子,實現的功能就是:從user表中查詢出所有的數據,然後遍歷結果集中的數據爲user對象賦值,然後控制檯輸出。
至於必要的五個步驟,已經在代碼段的註釋中詳細列出,這裏就不再多說。
需要注意的是,上邊的代碼若要成功運行,就必須要導入mysql的java驅動包,因爲所謂的驅動類就在這個驅動包中,如果是maven項目,可以採用類似下邊的配置:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
爲什麼要用mybatis
如果所有的數據庫操作都如上邊例子一樣簡單,那麼可能直接使用這種原始jdbc代碼就好了,但實際上大多數實際業務都不可能這麼簡單。
隨着業務的複雜,jdbc代碼也就會逐漸變得不忍直視,不論是對於參數的判斷,還是結果集和實體類賦值的轉換,都會使代碼越來越複雜。
而mybatis等持久層框架,很主要的功能就是解決了這種問題,使我們對參數的判斷、結果集映射等工作變得更加簡單,對原始jdbc的操作我們不用管,mybatis替我們管。
隨着業務複雜度的提升,對數據庫sql複雜度的提升,mybatis能簡化的工作,對於那些多出來的配置而言,就會顯得微不足道。這也就是爲什麼使用mybatis需要導入更多jar包,需要更多配置,看起來似乎更復雜了,結果卻有那麼多地方使用的原因。