Mybatis框架|Mybatis介绍


一、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中连接数据库的代码如下:

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语句依赖于数据库,导致数据库移植性差,不能更换数据库。
③框架还是比较简陋,功能尚有缺失。整个底层数据库还是要自己写的,工作量比较大。
④二级缓存机制不佳。

发布了391 篇原创文章 · 获赞 1044 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104199767