一、什麼是MyBatis?
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。2013年11月遷移到Github。html
iBATIS一詞來源於「internet」和「abatis」的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。java
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql
二、爲何會有 MyBatis?
經過上面的介紹,咱們知道 MyBatis 是來和數據庫打交道。那麼在這以前,咱們是使用 JDBC 來對數據庫進行增刪改查等一系列操做的,而咱們之因此會放棄使用 JDBC,轉而使用 MyBatis 框架,這是爲何呢?或者說使用 MyBatis 對比 JDBC 有什麼好處?sql
下面咱們經過一段 JDBC 對 Person 表的操做來具體看看。數據庫
person 表爲:apache
public class Person { private Long pid; private String pname; public Long getPid() { return pid; } public void setPid(Long pid) { this.pid = pid; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } }
JDBC 查詢操做:緩存
package com.ys.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.swing.DebugGraphics; import com.ys.bean.Person; public class CRUDDao { //MySQL數據庫驅動 public static String driverClass = "com.mysql.jdbc.Driver"; //MySQL用戶名 public static String userName = "root"; //MySQL密碼 public static String passWord = "root"; //MySQL URL public static String url = "jdbc:mysql://localhost:3306/test"; //定義數據庫鏈接 public static Connection conn = null; //定義聲明數據庫語句,使用 預編譯聲明 PreparedStatement提升數據庫執行性能 public static PreparedStatement ps = null; //定義返回結果集 public static ResultSet rs = null; /** * 查詢 person 表信息 * @return:返回 person 的 list 集合 */ public static List<Person> readPerson(){ List<Person> list = new ArrayList<>(); try { //加載數據庫驅動 Class.forName(driverClass); //獲取數據庫鏈接 conn = DriverManager.getConnection(url, userName, passWord); //定義 sql 語句,?表示佔位符 String sql = "select * from person where pname=?"; //獲取預編譯處理的statement ps = conn.prepareStatement(sql); //設置sql語句中的參數,第一個爲sql語句中的參數的?(從1開始),第二個爲設置的參數值 ps.setString(1, "qzy"); //向數據庫發出 sql 語句查詢,並返回結果集 rs = ps.executeQuery(); while (rs.next()) { Person p = new Person(); p.setPid(rs.getLong(1)); p.setPname(rs.getString(2)); list.add(p); } } catch (Exception e) { e.printStackTrace(); }finally{ //關閉數據庫鏈接 if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } return list; } public static void main(String[] args) { System.out.println(CRUDDao.readPerson()); } }
三、分析
經過上面的例子咱們能夠分析以下幾點:mybatis
①、問題一:數據庫鏈接,使用時就建立,使用完畢就關閉,這樣會對數據庫進行頻繁的獲取鏈接和關閉鏈接,形成數據庫資源浪費,影響數據庫性能。框架
設想解決:使用數據庫鏈接池管理數據庫鏈接ide
②、問題二:將 sql 語句硬編碼到程序中,若是sql語句修改了,那麼須要從新編譯 Java 代碼,不利於系統維護
設想解決:將 sql 語句配置到 xml 文件中,即便 sql 語句變化了,咱們也不須要對 Java 代碼進行修改,從新編譯
③、問題三:在 PreparedStatement 中設置參數,對佔位符設置值都是硬編碼在Java代碼中,不利於系統維護
設想解決:將 sql 語句以及佔位符和參數都配置到 xml 文件中
④、問題四:從 resultset 中遍歷結果集時,對錶的字段存在硬編碼,不利於系統維護
設想解決:將查詢的結果集自動映射爲 Java 對象
⑤、問題五:重複性代碼特別多,頻繁的 try-catch
設想解決:將其整合到一個 try-catch 代碼塊中
⑥、問題六:緩存作的不好,若是存在數據量很大的狀況下,這種方式性能特別低
設想解決:集成緩存框架去操做數據庫
⑦、問題七:sql 的移植性很差,若是換個數據庫,那麼sql 語句可能要重寫
設想解決:在 JDBC 和 數據庫之間插入第三方框架,用第三方去生成 sql 語句,屏蔽數據庫的差別
既然直接使用 JDBC 操做數據庫有那麼多的缺點,那麼咱們如何去解決呢?請看下面 mybatis 框架的入門實例介紹。