Mybatis笔记 - Mybatis框架简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进,再后来托管到github下。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。程序员只需通过xml或注解的方式将要执行的各种statement配置起来,Mybatis就可以通过java对象和statement中的sql进行映射生成最终执行的sql语句,在sql语句执行成功后,将结果映射成java对象并返回。
一、数据库解决方案
1、JDBC问题总结
(1)jdbc执行步骤
1、加载数据库驱动
2、创建并获取数据库链接
3、创建preparedStatement对象,设置sql语句及其参数
4、通过statement执行sql,获取结果集
5、循环解析结果集
6、释放资源(rs、stmt、con)
(2)问题总结
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
2、Sql语句在代码中硬编码,修改sql也会导致代码的修改,造成代码不易维护。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、使用preparedStatement向占有位符号传参数存在硬编码,sql语句的where条件不一定,占位符需要和参数一一对应
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析存在硬编码(查询列名),sql变化会导致解析代码变化,且解析前需要遍历。
解决:Mybatis自动将sql执行结果
封装成pojo对象
,通过statement中的resultType定义输出结果的类型。
2、与Hibernate的不同
Hibernate的对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,例如需求固定的定制化软件,如果用hibernate开发可以节省很多代码,提高效率。
Mybatis和hibernate不同,它不完全是一个ORM框架, 程序员需要编写原生态sql,可严格控制sql执行性能,灵活度高。非常适合对关系数据模型要求不高、需求变化频繁的软件开发,例如互联网软件、企业运营类软件等。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3、原始Dao开发方式
原始Dao开发中存在以下问题:
① Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
② 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护
③ 由于sqlsession方法使用Object泛型,调用sqlsession方法传入的变量类型即使错误,在编译阶段也不报错。 解决方案:使用Mapper代理的方式开发
4、Mapper参数扩展
dao层的代码是被业务层公用的,虽然mapper接口只有一个参数,但可以使用pojo包装类型、Map等满足不同的业务方法的需求,实现系统扩展维护。另外:在service方法中建议不要使用包装类型,这样并不利于业务层的可扩展。
二、Mybatis存储流程
1、 mybatis配置
SqlMapConfig.xml是mybatis的全局配置文件,配置了mybatis的运行环境等信息。mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2、建立sqlSession会话
SqlSessionFactoryBuilder类通过build()加载SqlMapConfig.xml配置信息,可作为工具类构造SqlSessionFactory会话工厂。SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,一般使用单例模式管理会化工厂。会话工厂创建sqlSession会话,SqlSession是一个面向用户的接口,SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等,默认使用DefaultSqlSession实现类,但操作数据库实质上用的是Executor。执行过程如下:
1、 加载数据源等配置信息 Environment environment = configuration.getEnvironment();
2、 创建数据库链接
3、 创建事务对象
4、 创建Executor,SqlSession所有操作都是通过Executor完成
① SqlSession的实例不能共享使用
在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性,若将SqlSession实例的引用放在一个类的静态字段或实例字段中,多线程并发执行时,每个实例都对数据域有一个存储单元,引起线程不安全的问题。所以,SqlSession的实例不能共享使用,每个线程都应该有它自己的SqlSession实例。
SqlSession最佳应用场合是在方法体内定义成局部变量使用。打开一个 SqlSession,使用完毕就要关闭它。通常把这个关闭操作放到 finally 块中以确保每次都能执行关闭。如下:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}
② Executor执行器
mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。SqlSession所有操作都是通过Executor完成,mybatis源码如下:
if (ExecutorType.BATCH == executorType) {
executor = newBatchExecutor(this, transaction);
} elseif (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = new CachingExecutor(executor, autoCommit);
}
3、底层封装对象
Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
Mybatis笔记 - Mybatis框架简介的更多相关文章
- MyBatis笔记----MyBatis 入门经典的两个例子: XML 定义与注解定义
----致敬MyBatis官方开放文档让大家翻译,不用看书直接看文档就行了,mybatis的中文文档还需要完备的地方 简介 什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以 ...
- MyBatis笔记----SSM框架mybatis3整合springmvc spring4
上节 无springmvc框架 http://www.cnblogs.com/tk55/p/6661786.html 结构 jar包 web.xml 与index.jsp <?xml versi ...
- Spring笔记——Spring框架简介和初次框架配置
Spring简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
- MyBatis笔记----mybatis分页
mybatis版本3.4以下 结构 spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> &l ...
- MyBatis笔记----MyBatis数据库表格数据修改更新的两种方法:XML与注解
继上 http://www.cnblogs.com/tk55/p/6659285.html http://www.cnblogs.com/tk55/p/6660477.html 注解 将id:8 na ...
- MyBatis笔记----MyBatis查询表全部的两种方法:XML与注解
查询单条信息的在 http://www.cnblogs.com/tk55/p/6659285.html 已经有了 XML 修改UserMapper.xml <?xml version=&quo ...
- Unit07: MyBatis框架简介 、 MyBatis基本应用
Unit07: MyBatis框架简介 . MyBatis基本应用 1. myBatis (1)myBatis是什么? 是一个开源的持久层框架. 注:myBatis底层仍然是jdbc. (2)编程步骤 ...
- Mybatis学习笔记-Mybatis简介
如何获得Mybatis 中文文档 https://github.com/tuguangquan/mybatis Github https://github.com/mybatis/mybatis-3 ...
- Springmvc+mybatis+restful+bootstrap框架整合
框架整合: Springmvc + Mybatis + Shiro(权限) + REST(服务) + WebService(服务) + JMS(消息) + Lucene(搜搜引擎) + Quartz( ...
随机推荐
- Codeforces F. Bits And Pieces(位运算)
传送门. 位运算的比较基本的题. 考虑枚举\(i\),然后二进制位从大到小考虑, 对于第\(w\)位,如果\(a[i][w]=1\),那么对\(j.k\)并没有什么限制. 如果\(a[i][w]=0\ ...
- 思维——cf1238C
听思维的一道题,网上大多直接模拟,感觉有点麻烦,其实只要把连续段求出来,然后处理一下统计答案就行 两个注意点:1.除了第一个连续段,其余段长度都要+1 2.因为目的地是0,所以最后一段要特判一下 #i ...
- Django框架(二)—— 基本配置:app注册、模板配置、静态文件配置、数据库连接配置post和get
目录 app注册.模板配置.静态文件配置.数据库连接配置post和get 一.app 二.模板配置 三.静态文件配置 四.数据库连接配置 五.get请求和post请求 六.新手三件套 七.登录功能案例 ...
- redis-trib.rb创建集群失败
yum安装ruby: yum install -y rubyyum install -y rubygems //安装rubygemgem install redis //安装redis的接口包gem ...
- netty源码分析 - Recycler 对象池的设计
目录 一.为什么需要对象池 二.使用姿势 2.1 同线程创建回收对象 2.2 异线程创建回收对象 三.数据结构 3.1 物理数据结构图 3.2 逻辑数据结构图(重要) 四.源码分析 4.2.同线程获取 ...
- 真实的『REM』手机屏幕适配
rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用.使用 rem 前端开发者可以很方便的在各种屏幕尺寸下,通过等比缩放的方式达到设计图要求的效果. rem 的官方定义『The ...
- Codeforces Round #536 E. Lunar New Year and Red Envelopes /// 贪心 记忆化搜索 multiset取最大项
题目大意: 给定n m k:(1≤n≤1e5, 0≤m≤200, 1≤k≤1e5) 表示n个时间长度内 最多被打扰m次 k个红包 接下来k行描述红包 s t d w:(1≤s≤t≤d≤n , 1≤w≤ ...
- 待办消息查询sql
select tsm.TMsgID,tsm.TMID,tsm.FNRID,tm.MainComID, tsm.TMsgName,fb.FBDataTbale, tsm.REMARK,fb.FlowTy ...
- Jmeter 请求参数中包含 MD5 加密的密码
如何在jmeter中对参数进行加密 使用工具:java+myeclipse 让开发将他的加密类从eclipse中导出来打成jar包,放在jmeter安装文件夹lib文件夹中%JMETER HOME%\ ...
- C语言之内存分配函数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /********* ...