zoukankan      html  css  js  c++  java
  • mybatis面试题

    1、什么是Mybatis?

    (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

    (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

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

    2、Mybatis优点:

    (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。

    (2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;

    (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。

    (4)能够与Spring很好的集成;

    (5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

    3、Mybatis缺点:

    (1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。

    (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

    4、MyBatis 和 hibernate 的区别有哪些?

    • 灵活性:MyBatis 更加灵活,自己可以写 SQL 语句,使用起来比较方便。
    • 可移植性:MyBatis 有很多自己写的 SQL,因为每个数据库的 SQL 可以不相同,所以可移植性比较差。
    • 学习和使用门槛:MyBatis 入门比较简单,使用门槛也更低。
    • 二级缓存:hibernate 拥有更好的二级缓存,它的二级缓存可以自行更换为第三方的二级缓存。

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

    • #{}是预编译处理,${}是字符串替换。
    • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
    • Mybatis在处理${}时,就是把${}替换成变量的值。
    • 使用#{}可以有效的防止SQL注入,提高系统安全性。

    6、MyBatis 逻辑分页和物理分页的区别是什么?

    逻辑分页:是一次性查询很多数据,然后再在结果中检索分页的数据。这样做弊端是需要消耗大量的内存、有内存溢出的风险、对数据库压力较大。

    物理分页:是从数据库查询指定条数的数据,弥补了一次性全部查出的所有数据的种种缺点,比如需要大量的内存,对数据库查询压力较大等问题。

    7、MyBatis 有几种分页方式?

    分页方式:逻辑分页和物理分页。

    逻辑分页: 使用 MyBatis 自带的 RowBounds 进行分页,它是一次性查询很多数据,然后在数据中再进行检索。

    物理分页: 自己手写 SQL 分页或使用分页插件 PageHelper,去数据库查询指定条数的分页数据的形式。

    8、MyBatis一对一

    <association property="topicType" select="selectType" column="topics_type_id" javaType="com.tmf.bbs.pojo.Type"/>
    • property:属性名
    • select:要连接的查询
    • column:共同列
    • javaType:集合中元素的类型

    9、MyBatis一对多

    <collection property="topicComment" column="id" ofType="com.tmf.bbs.pojo.Comment" select="selectComment" />
    • property:属性名
    • column:共同列
    • ofType:集合中元素的类型
    • select:要连接的查询

    10、MyBatis的步骤

    1. 创建SqlSessionFactory
    2. 通过SqlSessionFactory创建SqlSession
    3. 通过sqlsession执行数据库操作
    4. 调用session.commit()提交事务
    5. 调用session.close()关闭会话

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

    Mapper接口方法名和mapper.xml中定义的每个sql的id相同

    Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

    Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

    Mapper.xml文件中的namespace即是mapper接口的类路径

    12、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

    还有很多其他的标签,<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签。

    13、实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MappedStatement对象。

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

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

    14、mybatis的编写几种方法

    ①接口实现类继承SqlSessionDaoSupport使用此种方法需要编写mapper接口,mapper接口实现类、mapper.xml文件

    • 在sqlMapConfig.xml中配置mapper.xml的位置
    <mappers>
        <mapper resource="mapper.xml文件的地址" />
    </mappers>
    
    • 定义mapper接口
    • 实现类集成SqlSessionDaoSupport在mapper方法中可以this.getSqlSession()进行数据增删改查
    • spring的配置
    <bean id=" " class="mapper接口的实现">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>
    

    ②使用org.mybatis.spring.mapper.MapperFactoryBean

    在sqlMapConfig.xml中配置mapper.xml的位置

    如果mapper.xml和mappre接口的名称相同且在同一个目录,这里可以不用配置

    <mappers>
        <mapper resource="mapper.xml文件的地址" />
    </mappers>
    

    定义mapper接口

    注意:

    mapper.xml中的namespace为mapper接口的地址

    mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致

    Spring中定义

    <bean id="" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface"   value="mapper接口地址" /> 
        <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean>
    

    ③使用mapper扫描器

    mapper.xml文件编写

    注意:
    1、mapper.xml中的namespace为mapper接口的地址
    2、mapper接口中的方法名和mapper.xml中的定义的statement的id保持一致
    3、如果将mapper.xml和mapper接口的名称保持一致则不用在sqlMapConfig.xml中进行配置

    定义mapper接口

    注意:
    mapper.xml的文件名和mapper的接口名称保持一致,且放在同一个目录

    配置mapper扫描器

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="mapper接口包地址"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 
    </bean>

    使用扫描器后从spring容器中获取mapper的实现对象扫描器将接口通过代理方法生成实现对象,要spring容器中自动注册,名称为mapper 接口的名称。

  • 相关阅读:
    招标问什么
    其他房产
    长沙
    flume kafka
    http://www.zhihu.com/question/24301047
    38.NOW() 函数
    35.MID() 函数
    36.LEN() 函数
    34.UCASE() LCASE() 函数
    33.HAVING 子句
  • 原文地址:https://www.cnblogs.com/easyjie/p/12150228.html
Copyright © 2011-2022 走看看