6.MyBatis

news2025/7/28 17:38:11

一、为什么使用MyBatis

java中直接使用JDBC进行SQL查询,太麻烦,重复代码很多。

MyBatis为了方便SQL查询,设计总之比较偏向ORM方格。

1.主要思路:

  1. ORM(Object Relational Mapping) :

尝试把一张表中的一条条记录完全映射成一个个的对象。——去掉SQL

如果表结构 + SQL查询真的做简单映时,非常方便。但是如果有复杂查询时(一次涉及多表或者多表的优化比较特殊),就不好了。

2.保留SQL,简化SQL的编写

仍然是SQL那套。

Hibernate框架 偏向简化SQL的模式

MyBatis框架 偏向ORM的模式

Spring内部提供的JdbcTemplate 偏向简化SQL的模式

JPA 完全倒向了ORM的形式,建表的过程都被抽象,我们看到的只有类(我写了类,框架根据类进行建表)


官网全中文:https://mybatis.org/mybatis-3/zh/index.html

MyBatis本身独立,并不需要一定结合Spring才能使用,但我们只学习如何进行结合。

2.需要添加的依赖:

选择Spring Data JDBC,是因为导入这个依赖可以把DataSource对象注册到Spring中(默认HakiraDataSource)

选择MySQL Driver(无论是Durid or Hakira最终依赖MySQL官方提供的DataSource)

MyBatis Framework(引入了Mybatis + MybatisSpring)

3.Mybatis的使用:

  1. 通过注解使用(比较容易,但是做一些复杂功能时,不太灵活)

在UserMapper接口中,(@Mapper修饰,@Repository修饰)

@Select/@Insert +@Options/@Update/@Delete 完成SQL查询(必须掌握,大部分场景就够了)

注解有些地方实现不了:

(ResultMap的映射(表的字段名和对象的属性名称不一致的情况下,需要动态SQL拼接))

就需要通过XML的形式了。

  1. 通过XML配置文件的形式(比较规则,缺点是XML一大堆,又没有语法检查,出错不容易排查)

出现这种情况,通过添加@Repository注解,消除无限制IDEA的报错提示,实际中并没有什么作用。

一般利用XML去动态的生成SQL:

3.如果遇见如下问题:

required a bean of type....,很可能是导包错误,或者其它层没写注解,添加即可。

4.Controller层中的注解:@ResponseBody

作用是:将Controller方法返回的对象转化为指定格式后,写入到response对象的Body区,最终返回JSON或者XML

5.MyBatis XML相关文档: https://mybatis.org/mybatis-3/sqlmap-xml.html

对象中的a < - > 表中的uid

对象中的b < - > 表中的username

对象中的c < - > 表中的password

二、SSM中使用频率少,但面试会问到的

1.Spring bean 的作用域问题(生命周期)

Spring中针对一个类管理的bean,到底可以存在多久。“我”从各处,通过Spring获取bean对象,是同一个还是有什么其他规则?

(1)默认情况下,Spring Bean的作用域是单例形式(singleton)

并且,Spring创建这些单例bean,没有采用懒加载(lazy-inti : 用到的时候才进行触发)

(2)Spring Bean支持的集中作用域:

  1. singleton 单例(最常见)

  1. prototype 每次从Spring容器中get bean对象都会触发一次创建过程。每个对象都是独立对象

context.getBean(Person.class) <=> new Person( )

  1. request 以请求为单位。一次请求过程中,从开始到结尾,期间context.getBean(...)拿到的都是同一个对象。但如果是不同请求,则获取不同的对象。

  1. session 以用户session为为单位。每个用户(Session-id)都有自己的独立对象。context.getBean(...)根据不同的session,给予不同的对象。

  1. application Spring ApplicationContext中可以配置多个Application.所以,这个作用域表示每个都有自己独立的对象。

  1. websocket 一种协议方式。

  1. 自定义scope

通过@Scope("singleton")或者@Scope("prototype")来修改Bean的作用域


2.Spring启动过程:

  1. 根据不同的方式,进行BeanDefinition的加载。(来源:xml中的<bean>、扫描类的过程中发现的@Component)

  1. Bean(产生最终产品)

Bean Definition(如何生产产品的说明书)

Bean的生产必须在Bean Definition的指导下完成。

在一个ApplicationContext中,实际上就是定义好Map <id ,Bean Definition>....;

Map<Class,Bean Definition>....;

//真正的产品 (prototype一般不保存,只保存单例)

Map<id, Object>

Map<Class, Object>

  1. 针对所有singleton的bean && lazy-init = false

这就需要根据这些beanDefinition生产Bean出来

在生产过程中,有些bean的生产需要依赖另外一些bean。需要获取的另外的bean(这些bean可能已经生产过了,可能还没有。如果没有,就递归去产生另外的bean)

通常来讲,整个依赖关系应该是属性结构。所以一定可以递贵完成。

  1. spring Application启动完成

3.细分创建bean的过程

  1. 根据bean Definition 拿到合适的构造方法
  1. 默认情况下,取的是无参构造

  1. 但如果定义bean对象的类时,通过@Autowired修饰过构造方法,则这里取被修饰过的构造方法

Constructor ctor; //Constructor这个JDK反射对象

3.@Value(...)注解修饰的时候,这类Bean是通过解析配置文件得到的

2.进行Bean对象的实例化(调用上一步取得的构造方法)
  1. 如果是无参构造方法,则可以直接调用

  1. 如果不是无参构造,则需要先把 调用该构造方法需要的参数bean准备好

3.进行属性的注入(@Autowired String name/ setter方法注入)

这两种注入的效果是一样的

走另外的流程,又会导致依赖了一批bean,所以,还是取构造。

4.如果bean的类实现了某些Spring定义过的接口 XXX Aware接口

取调用指定的构造方法

5.装配beanDefinition,可以为这个类制定一个init-method

再去使用无参的方式,盗用init-method

6.至此,Bean才算初始化完成了。

4.产生一个bean的时候,有这么多lifecycle的回调,是因为:

  1. bean对象的实例化过程被交给spring创建了,导致我们没有控制权了

构造方法,属性注入必须分开,这个语言结构上就决定了

2.如果我想在bean被使用之前,做一些工作,没有地方可以做了
  1. 如果直接写在构造方法中,由于属性的注入还没有完成,所以是不行的

  1. 所以出现

一定发身在属性被注入之后,一定发生在bean被使用之前

这两个可以认为功能上基本是互相代替的

3.当我们需要一些Spring内部的信息时,可以使用Aware系列接口,让Spring把这些信息以对象的形式注入进来。

5.面试知识点

1.bean的作用域:

singleton、prototype.... 主要/默认使用singleton模式

singleton(单例)模式下,可以开启lazy-inti

2.bean的生命周期

生产bean阶段的工作: 调用构造方法(*) -> 属性注入(*) ->Aware系列接口 ->afterPropertiesSet/init-method

(*)备注的阶段,可能引起其他bean的产生

使用bean

销毁bean阶段的工作: destory-method / destory

三、总体过程

  1. 注解Mapper的过程:

  1. 拿到一个Mapper接口

  1. 拿到与之对应的XML配置文件(具体需要在Spring中配置XML的查找路径)

利用“对象代理”的原理,生成接口的实现代理对象(InvocationHandler)

然后,所有的接口的方法调用,都会调用到InvocationHandler的invoke 方法中

在这个方法中,通过JDBC完成对应的SQL操作(通过注解形式/XML配置(这个支持动态SQL的过程)

完成SQL操作后,最后完成,表的数据(字段名 = value) 映射成 -> 对象的数据(属性 = value)

利用XML中配置的ResultMap完成(如果同名,可以不去配置)

四、参数占位符 #{} 和 ${}

#{} : 预编译处理

${}: 字符直接替换

同样的指定参数 @Para("username") String name = "mxj"

@Select("select * from users where username =#{username}")

-> SQL: select * from users where username = "mxj";

//会帮我们做引号的处理,防止SQL注入

@Select("select * from users where username = ${username}")

-> SQL: select * from users where username = mxj;

//这是一个纯粹的SQL替换,这条SQL是错误的,因为没有引号,不能用


同样指定参数@Para("username") String name ="小明's笔";

@Select("select * from users where username =#{username}")

-> SQL: select * from users where username ="小明's笔"


那么什么情况下用到${...}

@Select("select * from users where username = #{username} offset ${offset} limit ${limit} ")

指定参数:

@Param("username")String name = "你好";

@Param("offset") int a = 3;

@Param("limit") int b = 30;

select * from users where username = "你好" offset 3 limit 30; // 此时就用到了$

五、AOP(Aspect Oriented Programing

  1. 编程的理念:把很多流程中的公共部分抽离出来,放在一起统一处理

  1. 实现依赖于“对象代理”

  1. 主要的应用场景: 日志打印、错误处理、事务处理

六、Spring MVC的统一处理:

Web开发过程中,有些步骤是很多地方都用到了,写在各处比较麻烦(AOP面临的问题)

这里没有使用AOP形式。

  1. 使用拦截器(Interceptor)

请求 -> Tomcat解析 -> 根据配置调用具体的Servlet对象中的Service()方法

Filter(过滤器) ->真正地进行Servlet对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML下拉框样式美化

在网页中&#xff0c;下拉框的样式最难美化&#xff0c;默认样式巨丑&#xff0c;好在现在已经有各种框架实现了下拉框的样式美化&#xff0c;主要思路都是通过JS代码将下拉框元素用更容易设置样式的div进行替换&#xff0c;再将对应选项及事件进行关联。 最近一项目需要修改很…

国内售价仅10元的鸭子滑梯玩具TK卖到20美元,相关视频获400万+播放!

在TikTok上玩具一直是增速极快的一个类目&#xff0c;不同于很多其他品类在疫情期间取得了巨大增长但在疫情后销售大幅下降的现象不同&#xff0c;全球玩具市场继续表现并保持稳定的较高的销售水平。美国市场研究机构NPD的统计&#xff0c;2021年&#xff0c;全球玩具市场的销售…

Spring Bean 生命周期,好像人的一生

简单说说IoC和Bean IoC&#xff0c;控制反转&#xff0c;想必大家都知道&#xff0c;所谓的控制反转&#xff0c;就是把new对象的权利交给容器&#xff0c;所有的对象都被容器控制&#xff0c;这就叫所谓的控制反转。 控制反转 Bean&#xff0c;也不是什么新鲜玩意儿&#xf…

Pycharm远程服务器常见问题

2023年02月23日 问题描述&#xff1a;Pycharm远程服务器跑代码时&#xff0c;不小心把Pycharm关掉了&#xff0c;但服务器代码还在运行&#xff1f; 解决办法&#xff1a;kill进程 先用watch -n 0.5 nvidia_smi查看进程&#xff0c;然后kill -9 <进程> 1、nvidia-smi…

九龙证券|4D毫米波雷达成市场新宠,相关概念股大涨,会贡献多少业绩?

近日&#xff0c;4D毫米波雷达成为A股新宠&#xff0c;相关概念股如经纬恒润&#xff08;688326.SH&#xff09;一周内涨幅接近20%&#xff0c;威孚高科&#xff08;000581.SZ&#xff09;5个买卖日内涨幅超越25%。 有音讯称特斯拉将在3月1日投资者活动日会宣告新款Model 3的全…

适合视力障碍者的Linux

导读有哪些最适合视障用户的 Linux 发行版&#xff1f;让我们一起来看看。 如果有人视力障碍或失明&#xff0c;他们可能会依赖声音提示或其他交互方式&#xff08;如盲文&#xff09;来阅读和交流。 他们怎样才能使用 Linux 发行版&#xff1f; 嗯&#xff0c;一般来说&…

springboot图书进销存销售管理入库信息系统9f27q-java idea

目录 第一章 绪论 5 1.1 研究背景 5 1.2系统研究现状 5 1.3 系统实现的功能 6 1.4系统实现的特点 6 1.5 本文的组织结构 6 第二章开发技术与环境配置 7 2.1 Java语言简介 7 2.2JSP技术 8 2.5 mysql数据库介绍 9 2.6 B/S架构 9 第三章系统分析与设计 11 3.1 可行性分析 11 3.1…

红帽Linux技术-cp命令

cp是一个复制文件或者目录的命令&#xff0c;其作用是将一个或多个文件或目录从源位置复制到目标位置。 格式&#xff1a;cp [选项] 源文件或目录 目标文件或目录 常用选项&#xff1a; -r&#xff1a;复制目录及其子目录下的所有文件和目录&#xff1b; -p&#xff1a;保留…

五、运行时数据区内部结构、JVM中的线程

内存是非常重要的系统资源&#xff0c;是硬盘和cpu的中间仓库及桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程种内存申请、分配‘、管理的策略&#xff0c;保证了JVM的高效稳定运行&#xff0c;不同的JVM对于内存的划分方式和管理机制…

STM32 OTA应用开发——通过USB实现OTA升级

STM32 OTA应用开发——通过USB实现OTA升级 目录STM32 OTA应用开发——通过USB实现OTA升级前言1 环境搭建2 功能描述3 BootLoader的制作4 APP的制作5 烧录下载配置6 运行测试结束语前言 什么是OTA&#xff1f; 百度百科&#xff1a;空中下载技术&#xff08;Over-the-Air Techn…

Zabbix4.0架构理解-zabbix的工作方式

目录 1.1、zabbix4.0架构图 1.2、zabbix的进程 1、 zabbix server 2、zabbix agent 3、 zabbix proxy 4、 java gateway 5、zabbix get 1.3、zabbix的几种工作方式 1、通过zabbix agent 2、通过zabbix proxy 3、通过 zabbix java gateway 4、其他 1.3、zabbix 数据走…

虹科案例 | Redis企业版数据库:金融行业客户案例解读

传统银行无法提供无缝的全渠道客户体验、无法实时检测欺诈、无法获得业务洞察力、用户体验感较差、品牌声誉受损和业务损失&#xff1f;Redis企业版数据库具有低延迟、高吞吐和可用性性能&#xff0c;实施Redis企业版数据库&#xff0c;可以使金融机构实现即时的客户体验、实现…

python+django篮球NBA周边商城vue

目 录 第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 1 1.3 研究的内容 1 第二章 关键技术的研究 3 2.1 vue技术介绍 3 myproject/ <-- 高级别的文件夹 |-- myproject/ <-- Django项目文件夹 | |-- myproje…

分阶段构建golang运行环境Dockerfile镜像

在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明&#xff0c;采用官方简单的一句话就是&#xff1a;scratch是一个明确的空图像&#xff0c;特别是对于“从头开始”构建图像。分阶段构建镜像就会用到scratch这个空镜像&#xff0c;这样的好处是可以…

pnpm / yarn / npm管理依赖包

pnpm pnpm官网&#xff1a;https://pnpm.io/zh/ pnpm安装方式有很多&#xff0c;详见官网。 用最简单的npm来安装pnpm&#xff1a;npm install -g pnpm pnpm安装依赖包 pnpm install # 安装所有项目中的依赖包 pnpm install vue # 安装依赖到dependencies pnpm in…

硬件系统工程师宝典(11)-----去耦电容布局“有讲究”

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们说到在电源完整性分析的目标就是要做到电源的干净、稳定和快速响应&#xff0c;以及针对不同噪声处理的实现方法。今天我们来看看去耦电容…

JS词法环境和执行上下文

前言 JavaScript是一门解释性动态语言&#xff0c;但同时它也是一门充满神秘感的语言。如果要成为一名优秀的JS开发者&#xff0c;那么对JavaScript程序的内部执行原理要有所了解。 本文以最新的ECMA规范中的第八章节为基础&#xff0c;理清JavaScript的词法环境和执行上下文…

嵌入式常问问题和知识

12、并发和并行的区别&#xff1f; 最本质的区别就是&#xff1a;并发是轮流处理多个任务&#xff0c;并行是同时处理多个任务。 你吃饭吃到一半&#xff0c;电话来了&#xff0c;你一直到吃完了以后才去接&#xff0c;这就说明你不支持并发也不支持并行。 你吃饭吃到一半&…

【ROS学习笔记2】使用vscode开发ROS全流程

【ROS学习笔记2】使用vscode开发ROS全流程 写在前面&#xff0c;本系列笔记参考的是AutoLabor的教程&#xff0c;具体项目地址在 这里 文章目录【ROS学习笔记2】使用vscode开发ROS全流程一、安装终端工具Terminator二、安装VsCode及插件三、使用VsCode开发全流程1、创建工作空…

亚马逊短期疲软,但长期前景乐观

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 由于投资者对亚马逊(AMZN)前景的担忧&#xff0c;导致该公司的股价在过去一年中下跌了39%。然而猛兽财经认为亚马逊近期面临的不利因素只是暂时的&#xff0c;该公司还是有充分的条件可以在医疗保健和物流领域获得重大增长机…