MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code,且改名为MyBatis 。2013年11月迁移到GitHub。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
框架(Framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。框架这个广泛的定义使用的十分流行,尤其在软件概念。
框架( Framework )对于java来说,就是一系列为了解决特定问题而定义的一系列接口和实现类,在组织框架代码时,使用了一系列优秀的设计模式,使代码无论在性能上还是API操作上得到很大提升.框架可以看做是项目开发的半成品,基本的底层操作已经封装完毕,通过框架,程序员可以从底层代码中解脱出来,专注于业务逻辑的完成和性能的优化。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节。
如果将开发完成的软件比作是一套已经装修完毕的新房,那框架就好比是一套已经修建好的毛坯房。用户直接购买毛坯房,建筑质量和户型合理有保证,还省去了自己建造房屋的时间,一举多得。
在开发过程是使用框架,同样可以保证减少开发时间、降低开发难度,并且还保证设计质量。好比和世界上最优秀的软件工程师是一个项目的,并且他们完成的还是基础、全局的工作。想想是不是很嗨的一件事情。
框架还有一个作用是约束。莎士比亚说,"一千个观众眼中有一千个哈姆雷特" 即仁者见仁,智者见智.说每个人都会对作品有不同的理解,每个人对待任何事物都有自己的看法,一千个人就有可能有一千种不同的看法1000人心中有1000个哈姆雷特。同样的技术解决同样的问题会产生不同流程和风格的解决方案,而采用一种框架其实就是限制用户必须使用其规定的方案来实现,可以降低程序员之间沟通以及日后维护的成本。
常用的基于JavaEE的三大开源框架,已经从SSH、SSH2过渡到了SSM:SpringMVC、Spring、MyBatis。
总之,框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度。
JDBC的缺点:需要手动的完成面向对象的Java语言、面向关系的数据库之间数据的转换,代码繁琐无技术含量,影响了开发效率。
如图所示,查询是需要手动的将结果集的列数据转换为Java对象的属性;而添加操作时需要手动将Java对象的属性转换为数据库表的列字段。
关于面向对象的Java语言、面向关系的数据库之间数据的转换必须要做,问题在于这个转换是否可以不由开发者来做。可以的。ORM框架就是专门来做这个问题的,相当于在面向对象语言和关系数据库之间搭建一个桥梁。
ORM,Object-Relationl Mapping,对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,ORM框架会根据映射完成对数据库的操作,就不需要再去和复杂的SQL语句打交道了。
另外学习ORM必须知道两个概念:持久化、持久层
什么是“持久化”
持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
什么是 “持久层”
持久层(Persistence Layer),即专注于实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联。之前使用JDBC访问数据库的DAO层,后面采用MyBatis访问数据库的mapper层,就是持久层。
Mybatis是一持久层的款半自动的ORM映射框架
MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code,且改名为MyBatis 。2013年11月迁移到GitHub。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
精简解释:MyBatis是一个半自动ORM框架,其本质是对JDBC的封装。使用MyBatis重点需要程序员编写SQL命令,不需要写一行JDBC代码。
Hibernate是一个全自动的ORM框架。因为Hibernate创建了Java对象和数据库表之间的完整映射,可以完全以面向对象的思想来操作数据库,程序员不需要手写SQL语句,而MyBatis中还需要手写SQL语句,所以是半自动化的,工作量要大于Hibernate。
为什么半自动化的Mybatis比自动化的Hibernate受欢迎?
MyBatis需要手写SQL语句,所以工作量要大于Hibernate。但是也正是由于自定义SQL语句,所以其灵活性、可优化性就超过了Hibernate。
Hibernate封装了SQL语句,由开发者对对象操作,Hibernate来生成SQL语句。虽然也可以通过映射配置来控制生成的SQL语句,但是对于要生成复杂的SQL语句,很难实现,或者实现后导致性能的丢失。
而MyBatis将手写SQL语句的工作丢给开发者,可以更加精确的定义SQL,更加灵活,也便于优化性能。完成同样功能的两条SQL语句的性能可能相差十几倍到几十倍,在高并发、快响应要求下的互联网系统中,对性能的影响更明显。
MyBatis对存储过程可提供很好的支持。另外MyBatis的开发工作量大不意味着学习成本大。对于新手,学习Hibernate时间成本比Mybatis大很多,Mybatis很快就上手了。
总之,因为MySQL具有相对轻量级,封装少、映射多样化、支持存储过程、可以进行SQL语句优化等特点,符合互联网高并发、大数据、高性能、高响应的要求,使它取代Hibernate成为了Java互联网中首选的持久框架。而对于对性能要求不高的比如内部管理系统、ERP等可以使用Hibernate。
mybatis主要类及执行流程
MyBatis运行需要其核心包以及依赖包,这些jar包可以从MyBatis官网下载包中找到,同时还要添加JDBC访问数据库的驱动包。
在src下定义MyBatis的配置文件,无固定名称。文件名可以用mybatis.cfg.xml,也有一部分人选择使用sqlMapConfig.xml或者mybatis.xml作为配置文件名
查看mybatis帮助文档,从xml中构建SqlSessionFactory.后面既有配置文件的写法
从XML中构建SqlSessionFactory
每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心,SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,SqlSessionFactoryBuilder对象可以从XML配置文件或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象。
MyBatis的主要工作就是进行映射,甚至可以占到全部工作量的80%以上。MyBatis的映射可以通过XML和注解来实现。面对复杂的SQL语句,注解也会力不从心。所以MyBaits中更多使用XML配置来实现。实体类和数据库表格之间的映射关系,二者映射关系主要通过sql语句体现. 简单来说,Mapper映射文件我们写sql语句的地方,mybatis根据我们所配置的sql语句,自动完成映射转换,自动完成的映射转换其实就是在做增删改查.每个独立的表格都要有自己独立的映射的实体类和Mapper映射文件.
先准备好实体类 私有的属性,getset方法 空参数构造方法,全部参数构造方法(可选) toString(可选) 实现序列化 (可选,分布式情况下必须写)
在mybati核心配置文件中要引入mapper映射文件
EmpMapper
DeptMapper
在 mybatis核心配置文件 mybatis.xml 中配置加载多个mapper映射文件
在两个mapper映射文件中定义sql语句
编写JAVA代码
package com.bjsxt.testDemo;
import com.bjsxt.pojo.Dept;
import com.bjsxt.pojo.Emp;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Test1 {
public static void main(String[] args) throws IOException {
//1获取sqlsession
//SqlSessionFactory创建工具 专门用户创建SqlSessionFactory
SqlSessionFactoryBuilder ssfb =new SqlSessionFactoryBuilder();
// SqlSessionFactory sql语句会话对象工厂,专门用于生产SqlSession对象
InputStream is = Resources.getResourceAsStream("mybatis.xml");
// build方法中需要传入一个输入流作为参数 输入流要指向我们的mybatis核心配置文件
SqlSessionFactory factory=ssfb.build(is);
//sql语句会话对象 专门用于执行sql语句和返回结果
SqlSession sqlSession=factory.openSession();
//2用sqlsession执行sql语句,完成映射关系处理
// selectOne中方的是要执行的sql语句的id
Emp emp = sqlSession.selectOne("selectByEmpno");
Dept dept = sqlSession.selectOne("selectByDeptno");
System.out.println(emp);
System.out.println(dept);
//3关闭sqlsession 释放资源
sqlSession.close();
}
}
总结:
项目的搭建很费劲,搭建完毕之后,后面所有的增删改查就变的简单了,套路在mapper映射文件定义一个sql语句,使用sqlsession调用sql语句即可,再也不用编写原生JDBC代码了,再也不用手动处理ResultSet 封装成java对象. 再也不用手动的设置sql语句的参数了,完全由mybatis自动完成映射处理。