學(xué)習(xí)Mybatis的過程(一)
- 什么是Mybatis
- 原生jdbc開發(fā)的總結(jié)
- Mybatis框架的流程圖
- Mybatis的學(xué)習(xí)思路
1.什么是Mybatis
Mybatis是一個持久層的框架,開源的的,是Apache下的一個頂級項(xiàng)目,現(xiàn)在這個項(xiàng)目托管到github里面了。點(diǎn)擊傳送門查看這個開源項(xiàng)目。

Mybatis讓程序員把主要的精力放在sql上,自己編寫sql,根據(jù)需要去靈活的編寫。
官網(wǎng)的解釋:
MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。
2.原生jdbc開發(fā)的總結(jié)
先看一段代碼:
Class Test{
public static void main(String[] args) {
//數(shù)據(jù)庫連接
Connection connection = null;
//預(yù)編譯的Statement,使用預(yù)編譯的Statement提高數(shù)據(jù)庫性能
PreparedStatement preparedStatement = null;
//結(jié)果 集
ResultSet resultSet = null;
try {
//加載數(shù)據(jù)庫驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//通過驅(qū)動管理類獲取數(shù)據(jù)庫鏈接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "mysql");
//定義sql語句 ?表示占位符
String sql = "select * from user where username = ?";
//獲取預(yù)處理statement
preparedStatement = connection.prepareStatement(sql);
//設(shè)置參數(shù),第一個參數(shù)為sql語句中參數(shù)的序號(從1開始),第二個參數(shù)為設(shè)置的參數(shù)值
preparedStatement.setString(1, "王五");
//向數(shù)據(jù)庫發(fā)出sql執(zhí)行查詢,查詢出結(jié)果集
resultSet = preparedStatement.executeQuery();
//遍歷查詢結(jié)果集
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();
}
}
}
}
單獨(dú)使用jdbc開發(fā)存在的問題:主要是
數(shù)據(jù)庫連接和硬編碼的問題
1、數(shù)據(jù)庫連接,使用時就創(chuàng)建,不使用立即釋放,對數(shù)據(jù)庫進(jìn)行頻繁連接開啟和關(guān)閉,造成數(shù)據(jù)庫資源浪費(fèi),影響 數(shù)據(jù)庫性能。
設(shè)想:使用數(shù)據(jù)庫連接池管理數(shù)據(jù)庫連接。
2、將sql語句硬編碼到j(luò)ava代碼中,如果sql 語句修改,需要重新編譯java代碼,不利于系統(tǒng)維護(hù)。
設(shè)想:將sql語句配置在xml配置文件中,即使sql變化,不需要對java代碼進(jìn)行重新編譯。
3、向preparedStatement中設(shè)置參數(shù),對占位符號位置和設(shè)置參數(shù)值,硬編碼在java代碼中,不利于系統(tǒng)維護(hù)。
設(shè)想:將sql語句及占位符號和參數(shù)全部配置在xml中。
4、從resutSet中遍歷結(jié)果集數(shù)據(jù)時,存在硬編碼,將獲取表的字段進(jìn)行硬編碼,,不利于系統(tǒng)維護(hù)。
設(shè)想:將查詢的結(jié)果集,自動映射成java對象。
3.Mybatis框架的流程圖

1.SqlMapConfig.xml
是mybatis的全局配置文件,名稱不固定的。
配置數(shù)據(jù)源等,配置映射文件(配置sql語句)
2.SqlSessionFactory
會話工廠,根據(jù)配置文件來創(chuàng)建工廠,創(chuàng)建SqlSession
3.SqlSession
會話,只一個接口,面向用戶(程序員),操作數(shù)據(jù)庫
4.Excutor
執(zhí)行器,是一個接口(基本執(zhí)行器,緩存執(zhí)行器),作用是SqlSession內(nèi)部通過執(zhí)行器操作數(shù)據(jù)庫。
5.mapped statemnt
底層封裝對象,作用對數(shù)據(jù)庫存儲封裝,包括sql語句,輸入?yún)?shù),輸出結(jié)果類型
6.輸入?yún)?shù)類型
java簡單類型,pojo自定義,hashmap
7.輸出結(jié)果類型
java簡單類型,pojo自定義,hashmap
4.Mybatis的學(xué)習(xí)重點(diǎn)
-
Mybatis開發(fā)Dao的兩種方法
原始的dao開發(fā)(程序需要編寫dao接口和dao的實(shí)現(xiàn)類) (掌握)
Mybatis的mapper接口(相當(dāng)于dao接口)代理的開發(fā)(掌握)
Mybatis的SqlMapConfig.xml配置(全局的配置文件)
-
Mybatis的核心
Mybatis的輸入映射(掌握)
Mybatis的輸出映射(掌握)
Mybatis的動態(tài)sql(掌握)
高級映射
高級緩存
spring和mybatis整合
逆向工程