1. 程式人生 > >mybatis 詳解(一)------JDBC

mybatis 詳解(一)------JDBC

jdbc javax 發出 一段 true his 實例 用戶名 移植

1、什麽是MyBatis?

  MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。

  iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。

  MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。

2、為什麽會有 MyBatis?

  通過上面的介紹,我們知道 MyBatis 是來和數據庫打交道。那麽在這之前,我們是使用 JDBC 來對數據庫進行增刪改查等一系列操作的,而我們之所以會放棄使用 JDBC,轉而使用 MyBatis 框架,這是為什麽呢?或者說使用 MyBatis 對比 JDBC 有什麽好處?

  下面我們通過一段 JDBC 對 Person 表的操作來具體看看。

   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 查詢操作:

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());
	}
}

3、分析  

  通過上面的例子我們可以分析如下幾點:

  ①、問題一:數據庫連接,使用時就創建,使用完畢就關閉,這樣會對數據庫進行頻繁的獲取連接和關閉連接,造成數據庫資源浪費,影響數據庫性能。

    設想解決:使用數據庫連接池管理數據庫連接

  ②、問題二:將 sql 語句硬編碼到程序中,如果sql語句修改了,那麽需要重新編譯 Java 代碼,不利於系統維護

    設想解決:將 sql 語句配置到 xml 文件中,即使 sql 語句變化了,我們也不需要對 Java 代碼進行修改,重新編譯

  ③、問題三:在 PreparedStatement 中設置參數,對占位符設置值都是硬編碼在Java代碼中,不利於系統維護

    設想解決:將 sql 語句以及占位符和參數都配置到 xml 文件中

  ④、問題四:從 resultset 中遍歷結果集時,對表的字段存在硬編碼,不利於系統維護

    設想解決:將查詢的結果集自動映射為 Java 對象

  ⑤、問題五:重復性代碼特別多,頻繁的 try-catch

    設想解決:將其整合到一個 try-catch 代碼塊中

  ⑥、問題六:緩存做的很差,如果存在數據量很大的情況下,這種方式性能特別低

    設想解決:集成緩存框架去操作數據庫

  ⑦、問題七:sql 的移植性不好,如果換個數據庫,那麽sql 語句可能要重寫

    設想解決:在 JDBC 和 數據庫之間插入第三方框架,用第三方去生成 sql 語句,屏蔽數據庫的差異

  既然直接使用 JDBC 操作數據庫有那麽多的缺點,那麽我們如何去解決呢?請看下面 mybatis 框架的入門實例介紹。

mybatis 詳解(一)------JDBC