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 框架的入门实例介绍。