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

osc_1q5l9zt9 2020-11-11 15:54:14
java Hibernate


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

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

<!--more-->

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

JDBC

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

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

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

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

JdbcTemplate

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

  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防注入的。

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

  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维护的。

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

  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体系结构(14)

myBatis 应用知识结构图

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

  • 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

环境配置

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

数据源:

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 别名配置


&lt;typeAliases&gt;
&lt;typeAlias type="com.idig8.dao"/&gt;
&lt;typeAlias type="com.idig8.dao.UserInfo" alias="UserInfo"/&gt;
&lt;/typeAliases&gt;
* mappers 文件引入
>基于 mapper 引入指定资源文件: resource| url |class
基于package 引入:扫描指定包路径当下的url
``` xml
<mappers>
<mapper resource="userInfo.xml" />
<package name="com.tuling.dao"/>
</mappers>

mapper 映谢文件配置

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







select 查询标签


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

>insert update delete 标签
``` xml
<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配置
``` xml
<if> 标签
trim (where, set) 标签
foreach 标签

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

版权声明
本文为[osc_1q5l9zt9]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4261553/blog/4713070

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云