在學習一門技術時,咱們首先要知道這門技術是什麼以及能夠幹什麼和爲何選擇這門技術而不選擇其餘技術。咱們引用官方給的解釋來看看什麼是MyBatis:java
MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.mysql
MyBatis是一個優秀的持久性框架,支持自定義SQL,存儲過程和高級映射。MyBatis消除了幾乎全部的JDBC代碼和參數的手動設置和結果的檢索。MyBatis可使用簡單的XML或註釋來配置和映射原語,Map接口和Java POJO(Plain Old Java Objects)到數據庫記錄。 sql
2.1 消除了大量的 JDBC 冗餘代碼
Java是經過Java數據庫鏈接API來操做關係型數據庫的,但JDBC是很底層的,咱們想對數據庫進行操做就須要書寫大量的代碼。廢話不說,看代碼數據庫
Student.java緩存
1 import java.util.Date; 2 3 import lombok.Data; 4 5 @Data 6 public class Student { 7 8 private Integer studId; 9 private String name; 10 private String email; 11 private Date dob; 12 13 }
StudentService.javamybatis
1 import java.sql.Connection; 2 import java.sql.DriverManager; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 7 import com.hz.mybatis.HzMyBatis.bean.Student; 8 9 /** 10 * 經過JDBC操做Student的SELECT和INSERT 11 * @author DONG 12 * 13 */ 14 public class StudentService { 15 16 public static void main(String[] args) { 17 System.out.println(new StudentService().findStudentById(1)); 18 } 19 20 /** 21 * 經過學生ID查找學生信息 22 * @param studId 23 * @return 24 */ 25 public Student findStudentById(int studId) { 26 Student student = null; 27 Connection connection = null; 28 29 try { 30 //獲取數據庫鏈接 31 connection = getDatabaseConnection(); 32 String sql = "SELECT * FROM students WHERE stud_id = ?;"; 33 34 //建立PreparedStatement 35 PreparedStatement preparedStatement = connection.prepareStatement(sql); 36 37 //設置輸入參數 38 preparedStatement.setInt(1, studId); 39 40 //執行sql 41 ResultSet resultSet = preparedStatement.executeQuery(); 42 43 //從數據取出結果,並生成Java Bean對象 44 while (resultSet.next()) { 45 student = new Student(); 46 student.setStudId(resultSet.getInt("stud_id")); 47 student.setName(resultSet.getString("stud_name")); 48 student.setEmail(resultSet.getString("stud_email")); 49 student.setDob(resultSet.getDate("stud_dob")); 50 } 51 } catch (Exception e) { 52 e.printStackTrace(); 53 } finally { 54 //關閉數據庫鏈接 55 if (connection != null) { 56 try { 57 connection.close(); 58 } catch (SQLException e) { 59 e.printStackTrace(); 60 } 61 } 62 } 63 return student; 64 } 65 66 /** 67 * 插入學生信息 68 * @param student 69 */ 70 public void createStudent(Student student){ 71 Connection conn = null; 72 try { 73 conn = getDatabaseConnection(); 74 String sql = "INSERT INTO students(stud_id, stud_name, stud_email, stud_dob) " 75 + "VALUES (?, ?, ?, ?)"; 76 77 PreparedStatement pstmt = conn.prepareStatement(sql); 78 79 pstmt.setInt(1, student.getStudId()); 80 pstmt.setString(2, student.getName()); 81 pstmt.setString(3, student.getEmail()); 82 pstmt.setDate(4, new java.sql.Date(student.getDob().getTime())); 83 84 pstmt.executeUpdate(); 85 } catch(Exception e) { 86 e.printStackTrace(); 87 } finally { 88 if (conn != null) { 89 try { 90 conn.close(); 91 } catch (SQLException e) { 92 e.printStackTrace(); 93 } 94 } 95 } 96 } 97 98 /** 99 * 獲取數據庫鏈接對象 100 * @return 101 */ 102 private Connection getDatabaseConnection() { 103 try { 104 Class.forName("com.mysql.jdbc.Driver"); 105 return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hadoop", "root", "root"); 106 } catch (Exception e) { 107 e.printStackTrace(); 108 } 109 return null; 110 } 111 }
以上兩個方法含有大量重複的代碼:建立鏈接、建立Statement對象、設置參數、關閉鏈接app
就算把重複代碼抽象出來,每次也仍是須要調用一次的,運行流程並無變化。框架
後續會與MyBatis進行對比。工具
2.2 學習成本低
涉及的知識面只有Java和SQLoop
2.3 能夠很好地與傳統數據庫協同工做
MyBatis是將查詢結果與Java對象進行映射,不會像Hibernate同樣將Java對象靜態地映射到表上,雖然也能夠實現但過於繁瑣了
2.4 自定義SQL語句
用過Hibernate的將會感受,靈活性上比它好太多了。
2.5 與 Spring 和 Guice 框架的集成支持
2.6 與第三方緩存類庫的集成支持
MyBatis內建的SqlSession級別緩存機制,能夠很好的與多種第三方緩存類庫集成。EHCache,OSCache等
2.7 更好的性能
MyBatis支持數據庫鏈接池、內建的緩存機制,這些特色都會獲取更好的性能。
在軟件開發中,並無通用的的解決方案,每個應用會有不一樣的一系列的要求,而咱們應該根據應用的須要來選擇咱們的工具和框架。上面咱們主要講的是使用 MyBatis 的優勢。然而也有一些狀況,MyBatis 並非理想的或者是最好的解決方案。 若是你的應用是以面向對象模型,而且向動態生成 SQL 語句,那麼 MyBatis可能就不符合你的要求。另外,若是你想讓你的應用有一個傳遞性的緩存機制的話(保存父對象時也應該保存關聯的子對象),Hibernate 會更適合你。