Mybatis 测试题

1、简述自己对mybatis的理解,并简述mybatis的优缺点
2、Mybatis是一个对象关系映射(Object Relational Mapping,简称ORM)框架,是为了解决面向对象与关系数据库存在的互不匹配的现象。也就是说Mybatis的关注点在于对象与数据库之间的映射,Mybatis会把从数据库中得到的松散数据进行封装,使开发者直接拿到一个对象。Mybatis其实是对jdbc的操作数据库的过程进行了封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybaits的优点:
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
MyBatis框架的缺点:
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
2、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?(不能修改属性名和字段名)
在Mapper.xml映射文件中,写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:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。

    2、JDBC:Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

    MyBatis:将Sql语句配置在XXXXmapper.xml文件中与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的全局属性
  typeAliases 类型命名
  typeHandlers 类型处理器
  objectFactory 对象工厂
  plugins 插件
  environments 环境
    environment 环境变量
      transactionManager 事务管理器
      dataSource 数据源
  databaseIdProvider 数据库厂商标识
  mappers 映射器10、mybatis常用注解有哪些??

11、mybatis如何传递多个参数??
使用HashMap传递多个参数  
使用JavaBean传递多个参数
@Param注解传参法
顺序传参法

12、简述mybatis运行机制是什么?
1.读取mybatis-config.xml配置文件,根据配置文件中的属性组装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有关
2、之后,接口无法直接产生对象,所以spring是产生MapperFactoryBean(FactoryBean对象),里边的getObject方法可以返回代理对象(动态代理),实现了接口
3、getObject方法中是:
​ getSqlSession().getMapper(this.mapperInterface) //生成mapper对象
​ ps.底层MapperProxy实现了jdk中动态代理的InvocationHandler,所以mapper.方法实际上就是调用了动态代理中的invoke方法(就是接口产生代理对象,然后调用的是invoke方法)
4、调用这个代理对象时,里边的invoke方法执行mapperMethod.execute方法,可以分别执行对应的CRUD操作。
5、那么为什么getMapper(this.mapperInterface)需要传接口呢?因为返回代理对象,所以是接口。
​ ​ 那么所有接口都变成了MapperFactoryBean对象后,又是如何区分的呢? definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName());
​ 在生成MapperFactoryBean对象的时候,立即在一参构造中设置了一个值,这样就有名称了
​ ps.扫描遍历过程中,defintion可以拿到每次传进来的信息,和beanDefinitions相关
6、之后循环拿到所有构造方法,筛出有参,根据有参来创建对应名称的MapperFactoryBean对象
14、mybatis中#{}和${}的区别是什么?
是 P r o p e r t i e s 文 件 中 的 变 量 占 位 符 , 它 可 以 用 于 标 签 属 性 值 和 s q l 内 部 , 属 于 静 态 文 本 替 换 , 比 如 {}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如 Propertiessql{driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()。

你可能感兴趣的:(数据库交互)