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
介紹完MyBatis以後,咱們再來看看使用傳統的JDBC編程所帶來的問題。mysql
在這兒我使用圖形化工具——Navicat for MySQL來建立一個mybatis的數據庫,步驟以下:sql
而後將以下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
首先建立一個普通的Java工程,例如mybatis-day01。而後導入mysql的數據庫驅動Jar包。編程
你們還記得JDBC編程的步驟嗎?mybatis
接下來就要按以上步驟來編寫編寫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編程所帶來的問題呼之欲出:工具
sql語句:性能
String sql = "select * from user where username = ?"; preparedStatement = connection.prepareStatement(sql);
在代碼中硬編碼,形成代碼不易維護,實際應用sql變化的可能較大,sql變更須要改變java代碼。
使用preparedStatement向佔有位符號傳參數存在硬編碼:
preparedStatement.setString(1, "王五");
由於sql語句的where條件不肯定,可能多也可能少,修改sql還要修改代碼,系統不易維護。
從如下代碼可知:
System.out.println(resultSet.getString("id")+" "+resultSet.getString("username"));
對結果集解析存在硬編碼(查詢列名),sql變化致使解析代碼變化,系統不易維護,若是能將數據庫記錄封裝成pojo對象解析比較方便。