首页 > 其他分享 >MyBatis记录

MyBatis记录

时间:2024-03-23 18:23:33浏览次数:21  
标签:分页 映射 记录 数据库 SQL Mybatis sql MyBatis

什么是MyBatis
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL
语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直
接编写原生态sql,可以严格控制sql执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避
免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement(statement用于向数据库发送sql语句,对数据库进行增删改查) 配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
MyBatis的优点和缺点
优点:

  1. 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
  2. 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  3. 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
  4. 能够与Spring很好的集成;
  5. 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
    缺点
  6. SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  7. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

{}和${}的区别

  1. {}是预编译处理,${}是字符串替换。

  2. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值,Mybatis在处理${}时,就是把${}替换成变量的值。
  3. 使用#{}可以有效的防止SQL注入,提高系统安全性。

● 能用 #{} 的地方就用 #{},不用或少用 ${}
● 表名作参数时,必须用 ${}。如:select * from ${tableName}
● order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
● 使用 ${} 时,要注意何时加或不加单引号,即 和 ′ {} 和 '和
Mybatis是如何进行分页的,分页插件的原理
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接拼写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页,比如:MySQL数据的时候,在原有SQL后面拼写limit。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
Mybatis是如何将sql执行结果封装为目标对象并返回的
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
MyBatis实现一对一有几种方式
联合查询和嵌套查询

  1. 联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;
  2. 嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过 association配置,但另外一个表的查询通过select属性配置。
    Mybatis设计模式
  3. Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder,XMLStatementBuilder、CacheBuilder;
  4. 工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
  5. 单例模式,例如ErrorContext和LogFactory;
  6. 代理模式,Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
  7. 组合模式,例如SqlNode和各个子类ChooseSqlNode等;
  8. 模板方法模式,例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
  9. 适配器模式,例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
  10. 装饰者模式,例如Cache包中的cache.decorators子包中等各个装饰者的实现;
  11. 迭代器模式,例如迭代器模式PropertyTokenizer;

标签:分页,映射,记录,数据库,SQL,Mybatis,sql,MyBatis
From: https://www.cnblogs.com/sangwu/p/18091505

相关文章

  • MyBatis3源码深度解析(二十)动态SQL实现原理(一)动态SQL的核心组件
    文章目录前言第八章动态SQL实现原理8.1动态SQL的使用8.1.1\<if>8.1.2<where|trim>8.1.3<choose|when|otherwise>8.1.4\<foreach>8.1.5\<set>8.2SqlSource组件&BoundSql组件8.3LanguageDriver组件8.3.1XMLLanguageDriver8.3.2RawLanguageDriver8.4Sq......
  • 机器学习金融预测领域2023部分综述论文阅读记录
    23年的综述最近读了3篇,总结笔记如下:本期所有论文链接:2023综述https://www.alipan.com/s/ySur3StxKip点击链接保存,或者复制本段内容,打开「阿里云盘」APP,无需下载极速在线查看,视频原画倍速播放。(2023)A_Systematic_Survey_of_AI_Models_in_Financial_Mark评价:原文写的一般,可以......
  • 记录真实项目中遇到的bug--003:支付bug
    T03:支付bug:1.优先级:P02.前提条件:用户A手机浏览器打开页面选择微信支付3.预期结果:弹出二维码,根据提示文字在微信中完成支付。4.实际结果:弹出二维码,根据提示文字无法在微信中完成支付5.缺陷跟踪:后台未赋予微信外浏览器H5支付权限,因为开发与产品业务未能对齐颗粒度,最终取消手......
  • SQL语句:对重复字段的记录,只保留时间最新的一条记录
    selectt.*,t.rowidfromMHQC04_NORMLIZEtwherest_no='HQ4M61WW'orderbytimecreateddesc根据上面表字段和表名称,oracle语句,功能为,对于st_no重复的记录,只保留timecreated时间最新的一条,其余的删除。DELETEFROMMHQC04_NORMLIZEWHERErowidIN(SELECTrow......
  • 25计学(11408)考研记录贴
    25计学(11408)考研记录贴背景:广东二本,计算机科学与技术专业23年获ICPC,CCPC和百度之星铜奖,蓝桥睿抗均有国奖,GDCPC铁2021-2023学校算法集训室学生教练深度学习论文在发ing前后端知识完全没学过大学成绩(总之除了数据结构很会,其他完全没学,还好学校考试水):高数75,线代85,概统75,数据......
  • 基于SpringBoot+MyBatis+Vue的电商智慧仓储管理系统的设计与实现
    前言博主简介......
  • idea很好用的mybatis插件
    mybatis_log_plugin此插件可以恢复sql日志为完整的可执行的sql语句、把sql日志里面的?替换为真正的值可以选择在idea里找到下载,也可以在外面下来jar包直接拖拽到idea里下载后在idea:点击后在下面就多了一个MyBatisLog:在运行后,一旦有执行mybat......
  • mongoDB使用记录:副本集选举淘汰策略失效
    一个问题场景:业务请求查询数据库,当请求没有成功返回时(这里是数据库机器异常,表现是不返回请求结果,处于假死状态),业务挂起进入等待(WAIT),逻辑中断,表现为卡顿、持续加载中;高并发场景下,短时间内堆积的请求会大量占用发起数据库请求的机器的内存(风险一),大量业务卡顿异常;当数据库异常解决成......
  • mongoDB使用记录:误用数组索引
    版本:mongoDB4.2集群方案:副本+分片一个问题场景:集合内对多个字段建立索引,其中包含数组索引;当执行查询时,业务查询期望命中数组索引,mongodb筛选策略首次给出的执行方案命中了另外的索引key,导致当次慢查询,扫描超过1000w数量的文档,业务出现卡顿;处理&优化方案:mongodb筛选策略命中......
  • django+Mybatis的医生在线诊所平台(源码+mysql+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的迅猛发展和普及,越来越多的传统行业开始向数字化转型。医疗健康领域作为与人们生活密切相关的行业,其服务模式也正逐渐从传统的面对面诊疗转......