文章目录
一、Mybatis介绍
MyBatis 本是apache的一个开源项目iBatis
, 2010年这个项目由apache迁移到了Google,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
Mybaties封装了JDBC的很多细节,使开发者只需要关注sql语句本身,无需关注注册驱动,创建连接等繁杂过程。使用了ORM思想实现了结果集的封装。
二、JDBC问题分析
1.一个JDBC编码例子
一个JavaWeb中连接数据库的代码如下:
- 详细的步骤可以参照———JDBC编程步骤。
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
/**
* 类说明:
* JDBC创建PreparedStatement对象连接数据库
* @author qianliangguo
*/
public class testPreparedStatement {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
try {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/mybase?useUnicode=true&characterEncoding=utf-8";
String user = "root";
String password = "Hudie";
conn = DriverManager.getConnection(url, user, password);
// 3.创建PreparedStatement,预编译sql语句
String sql = "select * from emp where job=?";
pstm = conn.prepareStatement(sql);//创建sql半成品
pstm.setString(1,"clerk");//参数绑定
//4.执行sql语句
rs = pstm.executeQuery();
//5.处理结果集
while(rs.next()){
int empno = rs.getInt("empno");
String ename = rs.getString("ename");
String job = rs.getString(3);
int mgr = rs.getInt("mgr");
Date hiredate = rs.getDate(5);
double sal = rs.getDouble("sal");
double comm = rs.getDouble("commit");
int deptno = rs.getInt(8);
System.out.println(empno+" "+ename+" "+job+" "+mgr+" "+hiredate+" "+sal+" "+comm+" "+deptno);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6.关闭连接/释放资源
try {
rs.close();
pstm.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2.JDBC编码问题分析
-
数据库链接创建、释放频繁造成
系统资源浪费
从而影响系统性能。
如果使用数据库链接池可解决此问题。 -
Sql 语句在代码中硬编码
,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
设想:把sql语句写在一个配置文件中,修改配置文件中的sql语句就行了。 -
使用 preparedStatement 向占有位符号传参数存在硬编码
,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
设想:sql语句中的占位符及其参数写在一个配置文件中,自动的完成参数的输入。(输入映射) -
对
结果集解析存在硬编码
(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
设想:查询的结果和Java对象可以自动完成映射。(输出映射)
二、持久层框架
1.Hibernate
Hibernate是一个全自动ORM(Object Relation Mapping),旨在消除sql。但这也是把双刃剑,直接造成了herbinate的优化成本高。
2.Mybaties
Mybaties是一个半自动,轻量级的框架。sql与Java编码分离,sql由开发人员控制。
三、MyBatis优缺点
总结:
Mybatis的优点同样是Mybatis的缺点
,正因为Mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。Mybatis没有hibernate那么强大,但是Mybatis最大的优点就是简单小巧易于上手,方便浏览修改sql语句。
1.优点
①简单易学。(mybatis本身就很小且简单。没有任何第三方依赖)
②灵活。(sql写在xml里,便于统一管理和优化)
③解除sql与程序代码的耦合。(通过提供DAL层,将业务逻辑和数据访问逻辑分离)
④提供映射标签,支持对象与数据库的orm字段关系映射。
⑤提供对象关系映射标签,支持对象关系组建维护。
⑥提供xml标签,支持编写动态sql。
2.缺点
①编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
②SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
③框架还是比较简陋,功能尚有缺失。整个底层数据库还是要自己写的,工作量比较大。
④二级缓存机制不佳。