MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。2013年11月遷移到Github。html
iBATIS一詞來源於「internet」和「abatis」的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。java
MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis 消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql
經過上面的介紹,咱們知道 MyBatis 是來和數據庫打交道。那麼在這以前,咱們是使用 JDBC 來對數據庫進行增刪改查等一系列操做的,而咱們之因此會放棄使用 JDBC,轉而使用 MyBatis 框架,這是爲何呢?或者說使用 MyBatis 對比 JDBC 有什麼好處?sql
下面咱們經過一段 JDBC 對 Person 表的操做來具體看看。數據庫
person 表爲:apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 查詢操做:緩存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
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());
}
}
|
經過上面的例子咱們能夠分析以下幾點:mybatis
①、問題一:數據庫鏈接,使用時就建立,使用完畢就關閉,這樣會對數據庫進行頻繁的獲取鏈接和關閉鏈接,形成數據庫資源浪費,影響數據庫性能。框架
設想解決:使用數據庫鏈接池管理數據庫鏈接性能
②、問題二:將 sql 語句硬編碼到程序中,若是sql語句修改了,那麼須要從新編譯 Java 代碼,不利於系統維護
設想解決:將 sql 語句配置到 xml 文件中,即便 sql 語句變化了,咱們也不須要對 Java 代碼進行修改,從新編譯
③、問題三:在 PreparedStatement 中設置參數,對佔位符設置值都是硬編碼在Java代碼中,不利於系統維護
設想解決:將 sql 語句以及佔位符和參數都配置到 xml 文件中
④、問題四:從 resultset 中遍歷結果集時,對錶的字段存在硬編碼,不利於系統維護
設想解決:將查詢的結果集自動映射爲 Java 對象
⑤、問題五:重複性代碼特別多,頻繁的 try-catch
設想解決:將其整合到一個 try-catch 代碼塊中
⑥、問題六:緩存作的不好,若是存在數據量很大的狀況下,這種方式性能特別低
設想解決:集成緩存框架去操做數據庫
⑦、問題七:sql 的移植性很差,若是換個數據庫,那麼sql 語句可能要重寫
設想解決:在 JDBC 和 數據庫之間插入第三方框架,用第三方去生成 sql 語句,屏蔽數據庫的差別
既然直接使用 JDBC 操做數據庫有那麼多的缺點,那麼咱們如何去解決呢?請看下面 mybatis 框架的入門實例介紹。