(轉)MyBatis框架的學習(一)——MyBatis介紹

http://blog.csdn.net/yerenyuan_pku/article/details/71699343

MyBatis介紹

MyBatis本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation遷移到了google code,而且更名爲MyBatis。2013年11月遷移到Github。MyBatis是一個優秀的持久層框架,它對jdbc的操做數據庫的過程進行封裝,使開發者只須要關注SQL自己,而不須要花費精力去處理例如註冊驅動、建立connection、建立statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。 
Mybatis經過xml或註解的方式將要執行的各類statement(statement、preparedStatemnt、CallableStatement)配置起來,並經過java對象和statement中的sql進行映射生成最終執行的sql語句,最後由mybatis框架執行sql並將結果映射成java對象並返回。java

使用JDBC編程問題總結

介紹完MyBatis以後,咱們再來看看使用傳統的JDBC編程所帶來的問題。mysql

建立mysql數據庫

在這兒我使用圖形化工具——Navicat for MySQL來建立一個mybatis的數據庫,步驟以下:sql

  1. 新建一個鏈接——localhost_3306,右鍵,在彈出的下拉框中選中【新建數據庫】 
  2. 在彈出的對話框中,輸入數據庫名,選擇字符集 

而後將以下sql腳本文件——mybatis.sql導入到mybatis數據庫中:數據庫

/* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50521 Source Host : localhost:3306 Source Database : mybatis Target Server Type : MYSQL Target Server Version : 50521 File Encoding : 65001 Date: 2015-04-09 16:03:53 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `orders` -- ---------------------------- DROP TABLE IF EXISTS `orders`; CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '下單用戶id', `number` varchar(32) NOT NULL COMMENT '訂單號', `createtime` datetime NOT NULL COMMENT '建立訂單時間', `note` varchar(100) DEFAULT NULL COMMENT '備註', PRIMARY KEY (`id`), KEY `FK_orders_1` (`user_id`), CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of orders -- ---------------------------- INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null); INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null); INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null); -- ---------------------------- -- Table structure for `user` -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用戶名稱', `birthday` date DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性別', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', '王五', null, '2', null); INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市'); INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('24', '張三丰', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('26', '王五', null, null, null);

 

 

導入步驟記錄以下:apache

  1. 右鍵mybatis數據庫,在彈出的下拉框中選中【運行SQL文件】 
  2. 在彈出的對話框中選中mybatis.sql腳本文件,點擊【開始】按鈕開始導入sql腳本文件 

建立一個普通的Java工程

首先建立一個普通的Java工程,例如mybatis-day01。而後導入mysql的數據庫驅動Jar包。編程

編寫JDBC程序

你們還記得JDBC編程的步驟嗎?mybatis

  1. 加載數據庫驅動
  2. 建立並獲取數據庫鏈接
  3. 建立JDBC Statement對象
  4. 設置sql語句
  5. 設置sql語句中的參數(使用PreparedStatement)
  6. 經過Statement執行sql並獲取結果
  7. 對sql執行結果進行解析處理
  8. 釋放資源(ResultSet、PreparedStatement、Connection)

接下來就要按以上步驟來編寫編寫JDBC程序了,首先在src目錄下新建一個名爲cn.itheima.mybatis.jdbc的包,而後在該包下編寫一個JdbcTest類:框架

public class JdbcTest { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { //加載數據庫驅動 Class.forName("com.mysql.jdbc.Driver"); //經過驅動管理類獲取數據庫連接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "yezi"); //定義sql語句,?表示佔位符 String sql = "select * from user where username = ?"; //獲取預處理statement preparedStatement = connection.prepareStatement(sql); //設置參數,第一個參數爲sql語句中參數的序號(從1開始),第二個參數爲設置的參數值 preparedStatement.setString(1, "王五"); //向數據庫發出sql執行查詢,查詢出結果集 resultSet = preparedStatement.executeQuery(); //遍歷查詢結果集 while(resultSet.next()){ System.out.println(resultSet.getString("id")+" "+resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); }finally{ //釋放資源 if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(preparedStatement!=null){ try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }

以上使用JDBC的原始方法(未經封裝)實現了查詢數據庫表記錄的操做。 
運行以上程序,Eclipse控制檯會打印: 
這裏寫圖片描述 
經過觀察以上程序代碼,使用JDBC編程所帶來的問題呼之欲出:工具

  1. 數據庫鏈接建立、釋放頻繁形成系統資源浪費從而影響系統性能,若是使用數據庫鏈接池可解決此問題。
  2. sql語句:性能

    String sql = "select * from user where username = ?"; preparedStatement = connection.prepareStatement(sql);
    • 1
    • 2
    • 1
    • 2

    在代碼中硬編碼,形成代碼不易維護,實際應用sql變化的可能較大,sql變更須要改變java代碼。

  3. 使用preparedStatement向佔有位符號傳參數存在硬編碼:

    preparedStatement.setString(1, "王五");
    • 1
    • 1

    由於sql語句的where條件不肯定,可能多也可能少,修改sql還要修改代碼,系統不易維護。

  4. 從如下代碼可知:

    System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
    • 1
    • 1

    對結果集解析存在硬編碼(查詢列名),sql變化致使解析代碼變化,系統不易維護,若是能將數據庫記錄封裝成pojo對象解析比較方便。

相關文章
相關標籤/搜索