『互联网架构』软件架构-mybatis体系结构(14)

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』软件架构-mybatis体系结构(14)

今天说说mybatis,之前说过spring ioc,aop,mvc,接下来就到数据库的持久层了。从上到下的顺序,mvc,ioc,最下面就是数据库的持久层。mybatis是互联网和企业内广为应用的框架。官方参考文档这个文档很详细:http://www.mybatis.org/mybatis-3/zh/index.html

数据库访问层的4种实现方案对比

JDBC

当初最早的实现dao层,都是通过jdbc的方式

  1. 获取链接,通过DriverManager.getConnection
  2. 构建sql语句,可能这个sql语句,增删改查都有可能
  3. 设置参数,跟jdbc数据库是一一对应的
  4. 执行sql,通过execute
  5. 获取返回结果
  6. 基于结果构建DO
  7. 关闭链接

非常的繁琐,可以基于一个组件,开发一个工具类,获取链接和关闭链接肯定是两个方法,1-7步可以通过代理方法构建。第二步可以通过参数的形式传递给方法。自动帮我们获取链接,设置参数,执行sql。大大简化了我们开发。后来就开始企业开发使用jdbc template。

JdbcTemplate

  1. 构建sql语句
  2. 构建参数
  3. 调用jdbc模板方法
    3.1 获取链接
    3.2 设置参数
    3.3 执行sql
    3.4 获取返回结果
    3.5 基于result对象属性映射构建DO
    4 返回DO对象

虽然JdbcTemplate 简化我们对数据库的操作,但是它有个问题,sql语句都要java类,代码的方式拼接sql,最后导致代码非常的混乱,数据库的类型和java的类型进行映射。写sql语句本身就是很繁琐的事情,ORM的出现对象关系映射,数据库里面的二维和java里面的bean,做一对一的配置。根本就不需要写sql语句了,后来开始普及hibernate。

hibernate

hibernate 是一个完完整整的ORM框架,包含基本的查询,插入,修改,删除。通过java api的方式进行调用,还包括二级缓存这种附加的,天生支持sql防注入的。

  1. 获取session
  2. 开启事务,返回transaction对象
  3. 调用save,返回执行结果
    3.1 配置映射
    3.2 预计DO映射生成SQL(底层还是jdbc,就好像我们spring mvc底层还是用的servlet)
    3.3 获取链接
    3.4 设置sql参数
    3.5 执行sql
    3.6 释放链接
  4. 提交事务

hibernate虽然好,但是也有弊端的,最不方便的地方,状态的把握(游离态,持久化态,瞬态数据态),特别是模型比较复杂的时候什么一对一,一对多,多对一,多对多,很容易绕晕,还有HQL语句,这些语句都是hibernate自己生成的,这样DBA是非常郁闷的,对性能研究把握比较大的,这样会感觉它比较重了。 后来很多人从hibernate转成了JdbcTemplate ,JdbcTemplate 虽然比较繁琐,但是sql语句都是可控的。sql语句的写法完全可以考数据库的经验。

mybatis

  • 历史

Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前mybaits是由Github维护的。

  1. 获取session
  2. 开启事务返回Transaction
  3. 调用select
    3.1 拉取映射配置
    3.1.1 基于配置构建configstatement
    3.2 执行sql
    3.2.1 基于configstatement生成sql
    3.2.2 获取链接
    3.2.3 设置sql参数
    3.2.4 执行sql
    3.2.5 释放链接,返回Do对象,返回执行结果

hiberate都是通过映射自己生成sql语句,mybatis是根据xml,你配置什么sql就执行什么sql,sql语句是可控的,是可以看的到的。出了问题可以通过经验执行sql。

四种的对比

分类 优点 缺点
jdbc 简单、纯粹 1、需要手动关闭链接 2、结果集不能自动映谢
jdbcTemplate 简单、纯粹、自动会话管理、结果集映谢 1、手动拼装SQL管理混乱
hirbernate 编程效率高,无需编写sql。数据库更换成本低、较完善的二级缓存、自动防SQL注入 完全掌握的门槛高、性能优化较麻烦、复杂映谢
myBatis 学习成本低、可以进行更为细致的SQL优化,减少查询字段、统一的SQL管理 功能相对简陋、需要手动编写维护SQL、表结构变更之后需要手动维护SQL与映谢(尽可能的多关联查询什么的,都写在业务代码里面,这样可以良好的完成分布式)

mybatis的定位

myBatis 专注于sql 本身,其为sql 映谢而非完整的ORM,需要自己编写sql 语句,这是其优点也是缺点。优点是:优化方便,可更好利用sql编写经验。缺点是当数据修改之后调整麻烦耗费时间长.

试用场景:适用于对性能要求较高,有大批量的查询修改,并且业务实现没有过多依懒数据关系模型,比如:电商、O2O等互联网项目。

互联网项目对DAO层的要求:
1.对数据库的访问更新纯粹
2.尽可能不要使用数据库做运算
3.SQL语句可以针对性的优化(减少查询字段、查条件排序例 、查询条件尽可能命中索引)

myBatis 体系结构图

myBatis 应用知识结构图

  • Config

属性配置

<properties resource="app.properties">
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
</properties>

三种设置方式:
1.构建sessionFactory 时传递 (优先级:高)
2.基于resource 属性加载 或 url 加载 (优先级:中)
3.基于 <propertite> 属性设置 (优先级:低)

全局参数配置

<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
具体参考:http://www.mybatis.org/mybatis-3/zh/configuration.html#settings

环境配置

<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED" >
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>

数据源:

unpooled 普通连接,每次获取时都会重新建立一个新的连接.属性下如下:
• driver :数据库驱动类
• url: URL地址
• username:用户名。
• password :登录数据库的密码。
pooled: 连接池模式,所有连接从连接池当中获取,由连接池来来进行连接的建立与回收关于等操作,除支持unpooled属性外还支持属性如下:
• poolMaximumActiveConnections : 最大活跃数,默认值:10
• poolMaximumIdleConnections :最大空闲连接数
• poolMaximumCheckoutTime :获取连接超时等待最大(checked out)时间,默认值:20000 毫秒
• poolTimeToWait : 单次获取连接 最大等待时间 默认:20000 毫秒(即 20 秒)。
• poolMaximumLocalBadConnectionTolerance 获取连接重试次数 默认:3
• poolPingQuery 用于检测连接是否断开的测试 语句
• poolPingEnabled 是否通过执行poolPingQuery 语句做检测,默认值:false。
• poolPingConnectionsNotUsedFor 连接检测间隔时间 ,默认60000。

typeAliases 别名配置

<typeAliases>
<typeAlias type="com.idig8.dao"/>
<typeAlias type="com.idig8.dao.UserInfo" alias="UserInfo"/>
</typeAliases>

  • mappers 文件引入

基于 mapper 引入指定资源文件: resource| url |class
基于package 引入:扫描指定包路径当下的url

<mappers>
<mapper resource="userInfo.xml" />
<package name="com.tuling.dao"/>
</mappers>

mapper 映谢文件配置

mapper 常用元素
• select – 映射查询语
• insert – 映射插入语句
• update – 映射更新语句
• sql – 可被其他语句引用的可重用语句块。
• delete – 映射删除语句
• resultMap 用来描述如何从数据库结果集中来加载对象。
• cache – 给定命名空间的缓存配置。
• cache-ref – 其他命名空间缓存配置的引用。

select 查询标签

<select id="selectUser" 
resultType="com.tuling.mybatis.test.UuserInfo"> 
select * from user_info where id = #{id}
</select>
其支持属性如下:
<select
id="selectUser" // statement id
parameterType="int" // 参数类型
resultType="hashmap"// 返回结果类别
resultMap="personResultMap" // 返回结果映谢
flushCache="false" // 
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED">
参数的引用的办法
#{id, mode=in, jdbcType=INT, jdbcTypeName=MY_TYPE}

insert update delete 标签

<insert id="addUser"
parameterType="com.tuling.mybatis.test.UuserInfo">
INSERT INTO user_info (user_name,nick_name,password) VALUES
(#{userName},#{nickName},#{password})
</insert>

<update id="updateUser" 
parameterType="com.tuling.mybatis.test.UuserInfo" >
update user_info set user_name=#{userName} where id=#{id}
</update>

<delete id="deleteUser" parameterType="int">
DELETE from user_info where id=#{id}
</delete>

<sql> 标签

将重复的sql 语句定文为一个字段
<sql id="base_colume"> id,user_name,nick_name</sql>
可通过 <include > 进行引入 如:
<include refid="base_colume"/>

resultMap

resultMap 是myBatis 对象的映谢

  • 动态SQL配置
<if> 标签
trim (where, set) 标签
foreach 标签

PS:其实mybatis,我比较习惯自动生成对应的xml,里面只有简单的增删查改,所有的业务逻辑不在表里面进行处理包括关联查询,都在service里面处理,然后new 新的vo 展示就可以了,这样把压力都给程序来完成,数据库更单纯一些。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,523评论 0 4
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    梦殇_fccd阅读 987评论 0 5
  • Mybatis相关 1.Mybatis是什么? 2.为什么选择Mybatis? 3、#{}和${}的区别是什么? ...
    zhihaoZzz阅读 1,284评论 0 2
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,977评论 0 27
  • B区机组纯凝工况(原设计)运行时,锅炉主汽压力自动设定曲线为:定压(95bar)----滑压-----定压(182...
    宇宙地球村阅读 836评论 0 51