Mybatis整理

Mybatis

一、ORM

ORM(Object-Relationship-Mapping),对象关系映射,它是一种思想,是指将数据库中的每一行数据用对象的形式表现出来。

二、JPA

JPA(Java-Persistence-API):是Java持久化接口的意思,它是JavaEE关于ORM思想的一套标准接口,仅仅是一套接口,不是具体的实现。

三、MyBatis概念

MyBatis是一个优秀的基于java的持久层框架,它内部封装了JDBC,使开发者只需要关注sql本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁琐的过程。

MyBatis虽然实现了JPA但是它并不是一个完完全全的ORM组件,而是一个基于SQL开发的半ORM组件。

Mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最终由mybatis框架执行sql并将结果映射为java对象并返回。

四、MyBatis框架体系结构

1、Configuration-mybatis配置

1)、与Spring一样,可以通过配置文件或注解的形式进行配置

2)、SqlMapConfig.xml,此文件作为MyBatis的全局配置文件,配置了mybatis的运行环境等信息

3)、mapper文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要SqlMapConfig.xml中加载

4)、有了配置文件之后,通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂

5)、由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行

6)、sqlSession使用Executor(数据库操作执行器口)操作数据库,同Executor具体实现类实现指定dao层数据访问操作

2、Mapped Statement

框架底层封装对象(sql语句、输入参数、输出结果类型),它包装了MyBatis配置信息及sql映射信息等,mapper文件(即Mapper.xml)中一个sql对应Mapped Statement对象,sql的id即是Mapped statement的id.

3、Sql的输入映射参数

​ 基本和简单类型、HashMap、自定义pojo等。输入参数映射就是jdbc编程中对preparedStatement设置参数,Executor通过Mapped Statement在执行sql前将输入的java对象映射到sql中。

4、Sql的输出映射参数

​ 基本和简单类型、HashMap、自定义pojo。Statement对sql执行输出结果进行定义,输出结果映射过程相当于jdbc

五、Mybatis的优点

1、简单易上手

2、消除了JDBC大量冗余代码,不需要手动开关连接

3、很好的与各种数据库兼容

4、提供了很多第三方插件(分页插件/逆向工程)

5、能够与Spring很好的集成

六、Mybatis的缺点

Sql语句编写工作量大,尤其是字段多,关联的表多的时候

Sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

七、Mybatis的适用场景

Mybatis专注于sql本身,是一个足够灵活的Dao层解决方案

对性能的要求很高,或者需求变化比较多的项目,比如互联网项目

八、mybatis和hibernate有哪些不同?

灵活性:mybatis更加灵活,自己可以写sql语句,使用起来比较方便

可以移植性:mybatis有很多自己写的sql,因为每个数据的sql可能不同,所以移植性比较差

二级缓存:hibernate有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存

九、#{}与${}区别是什么?

#{}是预编译处理,${}是字符替换。在使用#{}时,Mybatis会将sql中?替换成#{},配合preparedStatement的set方法赋值,这样可以有效的防止sql注入,保证程序的安全。

十、当实体类的属性名和表中的字段名不一样,怎么办?

通过在sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,通过resultMap来映射字段名和实体类属性名的一一对应关系。

*******十一、xml映射文件都会写一个dao接口与之对应,这个dao接口的工作原理是什么?dao接口里面的方法,参数不同时,方法能重载吗?

​ Dao接口就是mapper接口,接口的权限定名就是映射文件中的namespace的值,接口的方法名就是映射文件中mapper的statement的id值,接口方法内的参数就是传递给sql的参数。

​ Mapper接口是没有实现类的,当调用接口方法时,接口权限定名+方法 拼接字符串作为key值,可以唯一定位一个mapperstatement,在mybatis中,标签,都会被解析成一个mapperstatement对象。

​ Mapper接口里的方法,是不能重载的,因为使用全限定名+方法名 的保存和寻找策略。

Mapper接口的工作原理:是jdk动态代理,Mybatis运行时会使用jdk动态代理为mapper接口生成代理对象proxy,代理对象会拦截接口方法,转而执行mapperstatement所代表的sql,然后将sql执行结果返回。

十二、在Mybatis中mysql是怎样进行分页的?

逻辑分页:rowbounds对象进行分页,一次性查询很多数据,然后在数据中进行检索。

可以在sql内直接书写带物理分页的参数来完成物理分页功能,也可以用分页插件pagehelper来完成物理分页。

分页插件的基本原理是使用mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应物理分页语句和物理分页参数。

十三、MyBatis如何将sql执行结果封装成目标对象返回的?有哪些映射方式?

第一种使用标签,注意定义数据库字段和对象属性名之间的映射关系

第二种使用sql字段的别名功能,将字段的别名书写成对象的属性名

有了字段名和属性名的映射关系后,mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

十四、如何获取自动生成的主键值

采用自增长策略,自动生成的键值在insert方法执行完成后可以被设置传入的参数对象中 。Usegeneratedkeys=true

十五、在mapper中如何传递多个参数

@Param注解

十六、MyBatis动态sql有什么用?执行原理?有哪些动态sql?

MyBatis动态sql可以在xml映射文件内,以标签的形式编写动态sql,执行原理是根据表达式的值完成逻辑判断并动态拼接sql的功能。

MyBatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind

十七、MyBatis的xml映射文件,不同的xml映射文件,id可以重复吗?

如果是不同的namespace,那么id可以重复;如果是相同的namespace,id不能重复。

十八、为什么说MyBatis是半自动orm,和全自动区别在哪里?

Hibernate是全自动orm,使用hibernate***查询关联对象的或者关联集合对象***时,可以根据***对象关系模型直接获取***,所以是全自动的。

而MyBatis在查询关联对象或关联对象集合时,需要手动编写sql来完成,所以是半自动的。

十九、MyBatis实现一对一有几种方式?具体怎么操作。

有联合查询和嵌套查询。

联合查询是几个表联合查询,只查询一次。通过在resultMap里面配置association节点配置一对一的类就可以完成。

嵌套查询就是先查一个表。根据这个表里面的结果的外键id去在另外一个表里面查询数据,也是通过assocation配置,但另外一个表的查询通过select属性配置。

二十、MyBatis实现一对多有几种方式操作?

联合查询和嵌套查询

联合查询是几个表联合查询,只查询一次,通过在resultMap里面的Collection节点配置一对多的类就可以完成。

嵌套查询是先查一个表,根据这个表里面的结果的外检id去在另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

二十一、MyBatis的延迟加载 lazyLoadingEnabled=true

延迟加载也叫懒加载,根据需求加载数据,先加载主要显示的数据,如果需要显示关联的数据,再加载关联的数据

1、为什么使用延迟加载?

总结:按需加载数据,避免资源浪费,提升查询速度

1)、假设场景:用户表和订单表,用户表有多个用户,每个用户有多个订单,某些时候,我们需要同时查看用户信息和用户的订单信息,这个时候用户的信息和订单的信息都需要显示。但如果我们只查看订单列表,就没必要把用户信息和用户的订单的数据信息全部查询出来,只显示订单信息就够了。如果想看订单详情,这时候需要显示订单的用户信息,再来加载订单的用户数据。 那这个时候很明显,就需要用到延迟加载。

2)、好处就是:避免资源浪费,提升查询速度

2、如何实现?

1)、在sqlMapConfig配置文件中加入以下节点:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值