MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。2013年11月遷移到Github。java
iBATIS一詞來源於「internet」和「abatis」的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。mysql
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。sql
經過上面的介紹,咱們知道 MyBatis 是來和數據庫打交道。那麼在這以前,咱們是使用 JDBC 來對數據庫進行增刪改查等一系列操做的,而咱們之因此會放棄使用 JDBC,轉而使用 MyBatis 框架,這是爲何呢?或者說使用 MyBatis 對比 JDBC 有什麼好處?數據庫
下面咱們經過一段 JDBC 對 Person 表的操做來具體看看。apache
person 表爲:緩存
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 查詢操做:mybatis
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()); } }
經過上面的例子咱們能夠分析以下幾點:框架
①、問題一:數據庫鏈接,使用時就建立,使用完畢就關閉,這樣會對數據庫進行頻繁的獲取鏈接和關閉鏈接,形成數據庫資源浪費,影響數據庫性能。性能
設想解決:使用數據庫鏈接池管理數據庫鏈接this
②、問題二:將 sql 語句硬編碼到程序中,若是sql語句修改了,那麼須要從新編譯 Java 代碼,不利於系統維護
設想解決:將 sql 語句配置到 xml 文件中,即便 sql 語句變化了,咱們也不須要對 Java 代碼進行修改,從新編譯
③、問題三:在 PreparedStatement 中設置參數,對佔位符設置值都是硬編碼在Java代碼中,不利於系統維護
設想解決:將 sql 語句以及佔位符和參數都配置到 xml 文件中
④、問題四:從 resultset 中遍歷結果集時,對錶的字段存在硬編碼,不利於系統維護
設想解決:將查詢的結果集自動映射爲 Java 對象
⑤、問題五:重複性代碼特別多,頻繁的 try-catch
設想解決:將其整合到一個 try-catch 代碼塊中
⑥、問題六:緩存作的不好,若是存在數據量很大的狀況下,這種方式性能特別低
設想解決:集成緩存框架去操做數據庫
⑦、問題七:sql 的移植性很差,若是換個數據庫,那麼sql 語句可能要重寫
設想解決:在 JDBC 和 數據庫之間插入第三方框架,用第三方去生成 sql 語句,屏蔽數據庫的差別
既然直接使用 JDBC 操做數據庫有那麼多的缺點,那麼咱們如何去解決呢?請看下面 mybatis 框架的入門實例介紹。