Mybatis相关知识点

JDBC的运行流程:

  1. 加载驱动。
  2. 创建并建立数据库连接。
  3. 创建JDBCStatement对象。
  4. 设置sql语句并传入对象。
  5. 执行sql语句,并返回查询结果。
  6. 对查询的结果进行转换,并返回结果集。
  7. 释放资源。

一、概述:

Mybatis是一个优秀的基于java的持久层框架,他封装了JDBC,使开发者只需要关注sql语句的本身,不必花大量的时间去处理驱动,创建连接,创建操作对象和关闭资源等操作。

二、与hibernate区别:

mybatis与hibernate不同,他不是一个完全的ORM框架,因为mybatis需要开发着自己手动编写SQL语句.所以数据库的无关性较差,但是同时,因为可以手写SQL语句,所以性能较高,并且sql语句可以通过XML的方式和注解的方式灵活的配置,并将java对象和sql语句的参数进行映射,最后SQL语句查询的结果再映射成java对象。

三、优点与缺点:

优点:

mybatis简单易学,容易上手。SQL语句写在XML里,并支持动态sql语句,从程序代码中彻底分离,解除了sql与程序代码的耦合性。因为可以手动写SQL,所以性能比较高。

缺点:

SQL语句的编写工作量大,尤其是字段多、关联表多的时候,对开发人员编写SQL语句的功底有一定的要求。
SQL语句依赖数据库,导致数据的移植性查,不能随意的更换数据库。

四、Mybatis的执行流程:

  1. 根据配置文件(全局配置文件和Mapper文件)创建sqlSessionFactoty对象,内包换Configuration对象。
  2. 创建sqlSession对象,他里面包含Configuration和excutor对象。
  3. sqlSession对象获取代理Mapper对象。(Mapper接口的代理对象)
  4. 代理Mapper对象中有SqlSession对象。
  5. 执行增删改查
    1. 调用SqlSession中的Executor执行器执行增删改查。
    2. 会创建一个statementHandler对象(同时也会创建参数处理对象parameterHandler和结果集处理对象ResultSetHandler对象)
    3. 调用statementHandler预编译sql语句和调用ParameterHandler对象设置参数。
    4. 执行,并返回ResultSetHandler对象处理过的结果集。

五、源码中几个重要的组件:

  • sqlSession:作为mybatis的最顶层API,表示一个和数据库交互的会话,完成必要的增删改查。
  • Executor:执行器,是mybatis的调度核心。
  • statementHandler:封装了JDBC操作。
  • parameterHandler:负责把用户的参数转化成JDBCStatement所需要的参数。
  • ResultSetHandler:负责把结果集对象转化成List。
  • TypeHandler:负责java的数据类型和JDBC的数据类型之间的映射转换。
  • MappedStatement:维护一个增删改查的节点的封装,也就是sql语句中一个节点的封装。
  • sqlSouce:负责根据用户传递的参数对象,动态生成sql语句,将信息封装到BoundSql中,并返回。
  • BoundSql:动态生成的Sql语句以及相应的参数信息。
  • Configuratiton:Mybatis:Mybatis的所有配置信息都维护再Configuratiton中。

批量操作:

默认的openSession没有参数,但是OpenSession方法有ExecutorType类型的参数,枚举参数:

  • ExecutorType.SIMPLE:这个执行器类型不做特殊的事情(这是默认装配
    的)。它为每个语句的执行创建一个新的预处理语句。
  • ExecutorType.REUSE.:这个执行器类型会复用预处理语句。
  • ExecutorType.BATCH:这个执行器会批量的执行更新语句。
    批量操作我们是使用Mybatistigong 的BatchExecutor进行的,
    他的底层是通过JDBJ攒sql的方式进行的。我们可以让他攒够一定属灵后发给数据库一次。

#{}和${}的区别是什么?

#{}进行预编译处理,再处理时会把sql语句中#{}转换成?号,调用parameterHandler的set方法来复制的。
${} 为值替换,再处理的时候,把 ${}转换成变量的值
使用#{}可以有效的防止SQL注入,提高系统安全性

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

1.再sql语句中使用别名的方式,
2.使用ResultMap的方式映射。

mybatis模糊查询的方式:

  1. name like’%${name}%’
    使用 $进行字符串的拼接,直接把传入的值,拼接上去了,
  2. name like"%"#{name}"%"
    在#{}占位符的两侧,直接写上%%;
  3. 这是使用了cancat进行字符串的连接,同时使用了#进行占位

如何获取自动生成的(主)键值?

insert 方法总有一个int返回值。这个值代表的是插入的行数。
而自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中

在mapper中如何传递多个参数?

使用#{0},#{1}的方式
使用@param注解。

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已。

原因就是namespace+id是作为Map<String, MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id重复会导致数据互相覆盖。有了namespace,自然id就可以重复,namespace不同,namespace+id自然也就不同。

Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

使用MyBatis的mapper接口调用时有哪些要求?

① Mapper接口方法名和mapper.xml中定义的每个sql的id相同
② Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同
③ Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
④ Mapper.xml文件中的namespace即是mapper接口的类路径。

Mapper编写的三种方法:

1.Dao接口实现类继承SqlSessionDaoSupport

2.使用org.mybatis.spring.mapper.MapperFactoryBean
此方法即mapper接口开发方法,只需定义mapper接口,不用编写mapper接口实现类。每个mapper接口都需要在spring配置文件中定义
3 此方法即mapper接口开发方法,只需定义mapper接口,不用编写mapper接口实现类。只需要在spring配置文件中定义一个mapper扫描器,自动扫描包中的mapper接口生成代代理对象。
注意mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值