Mybatis测试题
1、简述⾃⼰对mybatis的理解,并简述mybatis的优缺点
2、Mybatis是⼀个对象关系映射(Object Relational Mapping,简称ORM)框架,是为了解决⾯向对象与关系数据库存在的互不匹配的现象。也就是说Mybatis的关注点在于对象与数据库之间的映射,Mybatis会把从数据库中得到的松散数据进⾏封装,使开发者直接拿到⼀个对象。Mybatis其实是对jdbc的操作数据库的过程进⾏了封装,使开发者只需要关注 SQL 本⾝,⽽不需要花费精⼒去处理例如注册驱动、创建connection、创建statement、⼿动设置参数、结果集检索等jdbc繁杂的过程代码。
kotlin和java的关系Mybaits的优点:
(1)基于SQL语句编程,相当灵活,不会对应⽤程序或者数据库的现有设计造成任何影响,SQL写在XML⾥,解除sql与程序代码的耦合,便于统⼀管理;提供XML标签,⽀持编写动态SQL语句,并可重⽤。
(2)与JDBC相⽐,减少了50%以上的代码量,消除了JDBC⼤量冗余的代码,不需要⼿动开关连接;
MyBatis框架的缺点:
进入redis控制台的命令
(1)SQL语句的编写⼯作量较⼤,尤其当字段多、关联表多时,对开发⼈员编写SQL语句的功底有⼀定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
2、当实体类中的属性名和表中的字段名不⼀样 ,怎么办 ?(不能修改属性名和字段名)
在l映射⽂件中,写SQL语句时起别名门户模板图片
数据库是什么组成的在Mybatis全局配置⽂件中开启驼峰命名
3、简述如何利⽤mybatis实现批量删除功能?
1.当collection=”array“时,表名参数为数组;
2.当collection=”list“时,表名参数为集合.
4、简述在mybatis映射⽂件中如何获取⾃动⽣成的(主)键值?
Mapper⽂件insert语句设置 useGeneratedKeys=“true” keyProperty=“id”
5、简述mybatis传递参数的机制?
6、resultType:使⽤resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使⽤resultType。
定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此⽅法较为简单,企业中使⽤普遍。
resultMap:需要单独定义resultMap,实现有点⿇烦,如果对查询结果有特殊的要求,使⽤resultMap可以完成将关联查询映射pojo的属性中。
7、MyBatis中在查询进⾏select映射的时候,返回类型可以⽤resultType,也可以⽤resultMap,resultType是直接表⽰返回类型的(对应着我们的model对象中的实体),⽽resultMap则是对外部ResultMap的引⽤(提前定义了db和model之间的隐射key–>value关系),但是resultType跟resultMap不能同时存在。
在MyBatis进⾏查询映射时,其实查询出来的每⼀个属性都是放在⼀个对应的Map⾥⾯的,其中键是属性名,值则是其对应的值。
①当提供的返回类型属性是resultType时,MyBatis会将Map⾥⾯的键值对取出赋给resultType所指定
的对象对应的属性。所以其实MyBatis的每⼀个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对⾃动的给把对应的值赋给resultType所指定对象的属性。
②当提供的返回类型是resultMap时,因为Map不能很好表⽰领域模型,就需要⾃⼰再进⼀步的把它转化为对应的对象,这常常在复杂查询中很有作⽤。
8、JDBC编程有哪些不⾜之处,MyBatis是如何解决这些问题的?
1、JDBC:数据库链接创建、释放频繁造成系统资源浪费从⽽影响系统性能,如果使⽤数据库链接池可解决此问题。
MyBatis:在l中配置数据链接池,使⽤连接池管理数据库链接。
2、JDBC:Sql语句写在代码中造成代码不易维护,实际应⽤sql变化的可能较⼤,sql变动需要改变java代码。
MyBatis:将Sql语句配置在l⽂件中与java代码分离。
3、JDBC:向sql语句传参数⿇烦,因为sql语句的where条件不⼀定,可能多也可能少,占位符需要和参数⼀⼀对应。
MyBatis: Mybatis⾃动将java对象映射⾄sql语句。
4,JDBC:对结果集解析⿇烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析⽐较⽅便。
MyBatis:Mybatis⾃动将sql执⾏结果映射⾄java对象。
9、简述mybatis全局配置⽂件以及映射⽂件常⽤的标签有哪些??
configuration 配置
properties 属性:可以加载properties配置⽂件的信息
settings 设置:可以设置mybatis的全局属性mysql语句的执行顺序
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象⼯⼚
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
databaseIdProvider 数据库⼚商标识
mappers 映射器10、mybatis常⽤注解有哪些??
11、mybatis如何传递多个参数??
使⽤HashMap传递多个参数
使⽤JavaBean传递多个参数
@Param注解传参法
顺序传参法
12、简述mybatis运⾏机制是什么?
1.读取l配置⽂件,根据配置⽂件中的属性组装Configuration对象
2.由SqlSessionFactoryBuilder对象⽣成SqlSessionFactory对象
3.由SqlSessionFactory对象⽣成SqlSession对象
4.由SqlSession对象执⾏SQL语句
13、mybatis如何和spring整合?
不⽤写mybatis映射⽂件,采⽤注解⽅式提供相应的sql语句和输⼊参数
⾸先解析@Mapperscan,发现Import导⼊的类,执⾏类中的⽅法,这个类扩展了spring的扫描器,doScan⽅法,只扫描了所有接⼝。之后将接⼝变成了对象:
1、⾸先拿到接⼝⾥的beanDefinitions对象(⽤来描述bean的,记录了bean的信息)
ps.spring创建对象跟接⼝⽆关,和bd有关bigdecimal比较大小compareto
2、之后,接⼝⽆法直接产⽣对象,所以spring是产⽣MapperFactoryBean(FactoryBean对象),⾥边的getObject⽅法可以返回代理对象(动态代理),实现了接⼝
3、getObject⽅法中是:
getSqlSession().getMapper(this.mapperInterface) //⽣成mapper对象
ps.底层MapperProxy实现了jdk中动态代理的InvocationHandler,所以mapper.⽅法实际上就是调⽤了动态代理中的invoke⽅法(就是接⼝产⽣代理对象,然后调⽤的是invoke⽅法)
4、调⽤这个代理对象时,⾥边的invoke⽅法执⾏ute⽅法,可以分别执⾏对应的CRUD操作。
5、那么为什么getMapper(this.mapperInterface)需要传接⼝呢?因为返回代理对象,所以是接⼝。
那么所有接⼝都变成了MapperFactoryBean对象后,⼜是如何区分的呢?
在⽣成MapperFactoryBean对象的时候,⽴即在⼀参构造中设置了⼀个值,这样就有名称了
ps.扫描遍历过程中,defintion可以拿到每次传进来的信息,和beanDefinitions相关
6、之后循环拿到所有构造⽅法,筛出有参,根据有参来创建对应名称的MapperFactoryBean对象
14、mybatis中#{}和${}的区别是什么?
是Properties⽂件中的变量占位符,它可以⽤于标签属性值和sql内部,属于静态⽂本替换,⽐如
{driver}会被静态替换为sql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执⾏前会使⽤PreparedStatement的参数设置⽅法,按序给sql的?号占位符设置参数值,⽐如ps.setInt(0, parameterValue),#{item.name}的取值⽅式为使⽤反射从参数对象中获取item对象的name属性值,相当于Item().getName()。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论