MyBatis笔试题

  

1请写出Mybatis核心配置文件MyBatis-config.xml的内容?

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>

<!--加载我们需要的properties文件  获取连接四要素-->    <properties resource="jdbc.properties"/>

<settings>        <!-- 全局性地启用或禁用延迟加载。当禁用时,所有关联的配置都会立即加载。 -->        <setting name="lazyLoadingEnabled" value="true"/>        <!--当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象的所有的属性都会被加载。否则,所有属性都是按需加载。  -->        <setting name="aggressiveLazyLoading" value="false"/>        <!--全局关闭2级缓存  -->        <!--<setting name="cacheEnabled" value="false"/>-->

</settings>

<!--创建类的别名-->    <typeAliases>        <!--只要是在mapper.xml文件中使用了cn.pb.bean包下面的任意类的时候,无需再用全类名        使用简写的类名          之前应该 cn.pb.bean.Student          现在  Student        -->        <package name="cn.pb.bean"/>    </typeAliases>

<!--设置mybatis运行环境  default默认的运行环境====environment id的属性值-->    <environments default="mysql">       <environment id="mysql">           <!--配置事务管理器-->           <transactionManager type="JDBC"></transactionManager>           <!--配置数据源 POOLED:mybatis自带的数据源-->           <dataSource type="POOLED">               <property name="driver" value="${jdbc.driver}"/>               <property name="url" value="${jdbc.url}"/>               <property name="username" value="${jdbc.username}"/>               <property name="password" value="${jdbc.password}"/>           </dataSource>       </environment>    </environments>

<!--配置需要的mapper文件-->    <mappers>        <mapper resource="mapper/StudentMapper.xml"/>    </mappers></configuration>

2请写出Mybatis框架的优缺点?

优点:

1. 易于上手和掌握。

2. sql写在xml里,便于统一管理和优化。

3. 解除sql与程序代码的耦合。

4. 提供映射标签,支持对象与数据库的orm字段关系映射

5. 提供对象关系映射标签,支持对象关系组建维护

6. 提供xml标签,支持编写动态sql。

缺点:

1. sql工作量很大,尤其是字段多、关联表多时,更是如此。

2. sql依赖于数据库,导致数据库移植性差。

3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。

4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)

5. DAO层过于简单,对象组装的工作量较大。

6.  不支持级联更新、级联删除。

7. 编写动态sql时,不方便调试,尤其逻辑复杂时。

8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。

9. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。

10. 参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)

11. 多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)

12. 缓存使用不当,容易产生脏数据。

总结:

mybatis的优点其实也是mybatis的缺点,正因为mybatis使用简单,数据的可靠性、完整性的瓶颈便更多依赖于程序员对sql的使用水平上了。sql写在xml里,虽然方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限,无法像jdbc那样在代码里根据逻辑实现复杂动态sql拼接。mybatis简单看就是提供了字段映射和对象关系映射的jdbc,省去了数据赋值到对象的步骤而已,除此以外并无太多作为,不要把它想象成hibernate那样强大,简单小巧易用上手,方便浏览修改sql就是它最大的优点了。

mybatis适用于小型且程序员能力较低的项目和人群使用,对于中大型项目来说我并不推荐使用,如果觉得hibernate效率低的话(实际上也是使用不当所致,hibernate是实际上是不适用于拥有高负载的工程项目),还不如直接用spring提供的jdbc简单框架(Template),同样支持对象映射。

3.什么是数据持久化以及ORM?

4请写出MybatisUtil工具类

package cn.pb.util;

import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;import java.io.InputStream;

public class SessionFactoryUtil {    //01.创建需要单例的对象实例    private static SqlSessionFactory sessionFactory;

//02.私有化构造    private SessionFactoryUtil(){}

/**     *  03.对外提供访问的接口     *     001.SqlSession的创建依赖SqlSessionFactory     *     002.SqlSessionFactory依赖于SqlSessionFactoryBuilder     *     003.SqlSessionFactoryBuilder依赖于配置文件     *     004.获取配置文件     */    public   static  synchronized SqlSession getSession(){        //给我一个文件 返回一个输入流 到 内存中        try {            InputStream stream = Resources.getResourceAsStream("mybatis.xml");            //判断SqlSessionFactory是否为空            if (sessionFactory==null){                sessionFactory=new SqlSessionFactoryBuilder().build(stream);            }        } catch (IOException e) {            e.printStackTrace();        }        /**         * 之前还需要写一个finally用来关闭流!  现在不需要   为什么不需要??         * 01.查询源码build(stream)         * 02.SqlSessionFactoryBuilder类中已经关闭reader.close()         * 03.所以我们如果关闭流  会报错!         */        return  sessionFactory.openSession();  //创建session返回    }}

5.请使用association节点实现根据用户id查询用户信息以及对应角色信息(Role实体类中有一个对象User,只写SQL映射文件)?

 <!-- 01. 根据角色id 查询出角色信息--><select id="selectRoleById"  resultMap="roleMap">select id,name,userid from role where id=#{xxx}</select>

<!-- 02. 根据角色表中查询结果中的userid 查询用户信息       xxx就是resultmap中传递来的 userid--><select id="selectUserByUserId" resultType="User">select userid,name from user where userid=#{xxx}</select>

<!--对应的roleMap  这种方式 推荐使用  因为使用延迟加载--><resultMap id="rolrMap" type="Role"><id property="id" column="id"/><result property="name" column="name"/><!-- Role有一个属性的类型是 user   域属性javaType:域属性对应的类型 --><association property="user" javaType="User" select="selectUserByUserId"             column="userid"/></resultMap>

6.请使用collection节点实现获取指定用户的相关信息和地址列表(User实体类中有一个复杂类型的Address集合,只写SQL映射文件)?

<!-- 01. 根据用户id 查询出用户信息--><select id="selectUserById"  resultMap="userMap">select id,name from user where id=#{xxx}</select>

<!-- 02. 根据用户表中查询结果中的userid 查询地址信息       xxx就是resultmap中传递来的 userid--><select id="selectAddressByUserId" resultType="Address">select id,name,userid from address where userid=#{xxx}</select>

<!--对应的userMap  这种方式 推荐使用  因为使用延迟加载--><resultMap id="userMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><!-- User有一个属性的类型是 list   javaType:域属性对应的类型 --><collection property="addresses" javaType="Address" select="selectAddressByUserId"             column="userid"/></resultMap>

7.MyBatis的一级缓存缓存的是什么,二级缓存缓存的是什么?

8.如何开启MyBatis的二级缓存?

9.请根据商品名称(模糊查询),供应商,以及是否付款进行多条件查询和分页(只写SQL映射文件)

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

时间: 2024-08-30 03:46:13

MyBatis笔试题的相关文章

java常见面试题——java笔试题总结

注:本文转载自http://www.cnblogs.com/huajiezh/p/5790928.html,版权归其所有! Java常见面试题总结 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4.描述一下ArrayList和LinkedList各自实现和区别 5.Java中的队列都有哪些,有什么区别. 6.反射中,Class.forName和cl

MyBatis面试题集锦(精选)

以下来自网络收集,找不到原文出处.此次主要为了面试准备收集,希望对大家有所帮助~~~~ 1. 简单谈一谈MyBatis? Mybatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使得开发者只需要专注于SQL语句本身,而不用去关心注册驱动,创建connection等 Mybatis通过xml文件配置或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql进行映射成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

java各公司笔试题集1

IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码问题 public class test{ public void print(String str){ char[] s=str: } } public class a{ public static void main(String [] args){ puts() } } 三.写出以下输出 pu

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中

2017CVTE笔试题

下面是凭记忆整理的2017CVTE校招笔试题,基本上全都是我不会或很模糊的题,为了更好突出重点我以问答题的形式来描述题目. 1. 中序遍历是属于层次遍历.广度优先遍历.深度优先遍历中的哪一种? 答:层次遍历是指一层一层的遍历树中的节点,广度优先遍历是指遍历完它所有的兄弟节点后再开始遍历其孩子节点,因此层次遍历也属于广度优先遍历.深度优先遍历就是顺着节点的孩子节点一直往下搜索,直到没有孩子节点时才开始搜索叶子节点,常见的前序遍历.中序遍历.后序遍历就是属于深度优先遍历. 2. 产生死锁的4个条件,

c++笔试题贪吃蛇问题

贪吃蛇 现在有一个N*M(N,M=100)的方形矩形,在这个矩形的每一个方格上都放有一个随机值,一条可爱的小蛇从矩形的 左上角开始出发,每次移动都只能移动一格,向右或向下,而每到达一格贪吃的小蛇都会吧该位置上的值吃个一干二净,直到到达右下角时停止.而贪吃的小蛇不怕撑死,它只想吃到最多,并输出路径. #include <iostream> #include<string> #include <cstring> #include<vector> #include