学习MyBatis框架的一点小理论知识

orm框架是啥
orm是Object Relational Mapping的缩写,译为”对象关系映射“的框架。

o技术,即在对象模型和关系数据库之间建立起的对应的关系,并且提rm框架是一种数据持久化供一种机制,可通过Javabean对象操作数据库表中的数据。
当前主流且常见的java orm框架有hibernate和mybatis,主要区别如下:
1.hibernate
1)hibernate框架是一个全表映射的框架。通常开发者只要定义好持久化对象到数据库表的映射关系,就可以通过hibernate框架的方法完成持久层的操作。
2)开发者不需要熟练的编写sql语句,其开发效率高于mybatis框架。hibernate框架会根据编制的存储逻辑,会自动生成对应的sql,并调用jdbc接口来执行。
3)hibernate框架的缺点:
    1.多表关联的时候,对sql查询的支持较差
    2.更新数据时,需要发送所有的字段。
    3.不支持存储过程
    4.不能通过优化sql来优化性能
4)hibernate只能适用于场景不要复杂且性能要求不高的项目。
2.mybatis
1)mybatis框架是一个半自动映射的框架。mybatis框架通过简单的xml或注解进行配置和原始映射,将实体类和sql语句之间的映射关系。
2)mybatis框架需要手动编写sql语句,比使用hibatis框架的工作量大。
3)mybatis框架可以配置动态sql并优化sql,通过配置决定sql的映射规则,支持存储过程。
4)mybatis适用于场景复杂和需要优化性能的项目。


数据库连接池
1.什么是数据库连接池
  数据库连接池(Database Connenction Pooling)在程序初始化是创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接一避免因为没有释放数据库连接而引起的数据库连接遗漏。
  即在程序初始化的时候创建一定数量的数据库连接,用完可以放回去,下一个在接着用,通过配置数据库的参数来控制连接中的初始连接数、最小连接、最大连接、最大空闲时间这些参数保证访问数据库在一定可控制的范围类,防止系统崩溃,使用户的体验好
  2.为什么使用数据库连接池
    数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库是一个很耗时的操作,频繁的进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的狮虎可能导致服务器崩溃,而数据库连接池可以节省系统许多开销
 3.实现
     1)标准接口:DataSource Javax.sql包下的
         1.方法:
         获取连接 getConnection()
         归还连接:Connection.close() 如果连接对象Connection是从连接池中获得的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
         2.一般我们不去实现它,由数据库厂商来实现
             1.C3PO:数据库连接池技术
             2.Druid:数据库连接池实现技术,由阿里巴巴提供的
    3.mybatis的连接池技术

#{}和${}的区别
简单来说,使用#{}格式的占位符时,最终处理机制使用了预编译的!所以,使用这种格式的占位符时,在编写sql时,不需要关心值的数据类型问题,并且,不存在sql注入的风险!使用${}的占位符时,可以表示sq语句中方的任意片段,但是会存在sql注入的风险。

查询的时候,数据库的列名和类的字段名不一致的怎么办
1.在sql语句中,给数据库的列名起一个别名,去和类的字段名一致
2.使用resultmap标签为字段名与属性名自定义映射关系 

mapper接口支持重载吗
动态代理对象根据保存的接口全路径名+方法名的字符串反射调用到对应的MapperStatement对象,并执行其sql,并将执行结果返回。

简单来说就是接口全路径+接口方法名与映射文件中namespace值+标签的id值是一一对应。mapper.xml映射文件标签的id是不能出现重复的,即id值唯一,如果接口中的方法出现重载,那么就会导致传入的参数与匹配的标签sql中的参数不一致,致使执行sql时报错。

mybatis的动态标签
if标签:用于判断传入的参数条件成不成立
where标签:where元素只会在至少有一个子元素的条件成立返回sql子句的情况下才去插入where子句;若语句的开头为and、or、where元素也会将他们去除。还可以通过trim标签去自定义这种处理规则
set标签:set里面至少有一个条件成立,会在前面加上set,自动去除尾部多余的逗号
foreach标签:用于遍历传入集合,数组,map这种参数的时候使用
sql片段:相当于java中的代码提重,需要配合include使用
include标签:相当于java中的方法调用


什么是N+1问题
在查询关联数据库时,我们可能会写另一条sql语句去查询关联的数据库对象里的数据,此时我们需要对这个关联的数据库对象进行映射,那么这条查询查询关联的数据库对象的sql语句就是N+1的+1;

mybatis的一级缓存与二级缓存是咋回事
mybatis缓存就是内存中的数据,常常来自对查询结果的保存,使用缓存可以避免频繁与数据库进行交互,从而提高查询响应速度
而缓存又分为一级缓存和二级缓存
一级缓存:SqlSession级别的缓存,缓存的数据只在SqlSession内有效。
二级缓存:mapper级别的缓存,同一个namespace公用这一个缓存,所以对SqlSession是共享的,二级缓存需要我们手动开启

一个正在学习的小白收集的简单理论知识,答案不全且为摘要,大佬勿喷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值