mybatis相关面试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/panhaigang123/article/details/79587602
JDBC编程有哪些不足之处,Mybatis是如何解决这些问题的?
        jdbc连接数据库,会对每一次的连接创建一个线程,使用完毕后关闭线程,频繁的操作会造成系统资源的浪费从而影响性能
        在mybatis的配置文件中配置数据库连接池
                
        jdbc的sql语句写在代码中造成代码不易维护 sql变动需要改变Java代码
        mybatis将sql语句配置在mapper.xml文件中与Java代码分离    也可以接口映射(约定大于配置)
        
        jdbc的sql语句传参比较麻烦 sql语句的where条件不一定 占位符和参数一一对应
        mybatis会自动将Java对象映射至sql语句
        
        jdbc对结果集解析比较麻烦 需要使用游标将结果集一条一条的遍历出来
        mybatis自动将sql执行结果映射到Java对象
        
mybatis编程步骤是什么样的?
         1、创建SqlSessionFactory   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  
         2、通过SQLSessionFactory创建SqlSession    SqlSession openSession = sqlSessionFactory.openSession();  
        3、通过sqlsession执行数据库操作
        4、调用session.commit()或session.rollback()
        5、调用session.close()关闭会话

mybatis与Hibernate有哪些不同?
         Hibernate是一个对象关系映射框架 mybatis是一个对jdbc进行了轻量级封装不是一个ORM框架 需要程序员自己编写sql语句
        Hibernate是通过对象方式操作,不能够直接操作sql语句,优化比较困难,运行时间过长,会导致对象堆满内存,需要定时的重启释放内存 
        mybatis在目前软件开发环境使用的比较广,学习门槛比较低,无法做到数据库无关系,如果在数据库切换的情况下,需要写多份sql语句
        
使用Mybatis的mapper接口调用(接口映射)时有哪些要求?
  xml:
        Mapper接口方法名和mapper.xml中定义的每个sql的id相同  <select id="queryFood1" resultType="food">  
        Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType类型相同
        Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
        mapper.xml文件中的namespace值是mapper接口的类路径
  注解:
        只需要在接口方法上添加 @select @update @delete @insert注解 并添加sql语句
        
sqlMapConfig.xml中配置有哪些内容?
         properties (读取配置文件) <properties resource="oracle.properties"></properties>
         typeAliases (类型别名) <typeAliases><typeAlias type="cn.easytop.lesson02.Food" alias="food"/></typeAliases>
         transactionManager (事务管理)
         DataSource (数据源)
         mappers (映射器) <mappers><mapper resource="cn/easytop/lesson02/xml/FoodMapper.xml"/></mappers> 
        
简单的说一下mybatis的一级缓存和二级缓存

  •   第一次查询时 调用数据库 获取数据后 把数据缓存 第二次查询时 通过缓存判断是否存在相同主键的数据值 如果存在直接返回引用 否则查数据库

        一级缓存是基于同一个sqlSession  如何SQLSession执行了commit操作,清空SQLSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息
                                                                
        二级缓存是基于mapper级别的缓存,多个sqlSessiion去操作同一个Mapper的sql语句,多个SQLSession可以共享二级缓存,二级缓存是跨sqlSession的。
        
spring集成mybatis
        1、添加mybatis-spring的maven依赖(pom.xml)
        2、配置druid的数据源
        3、配置sqlsessionfactoryBean将数据源注入
        4、配置sqlsessionTemplate通过构造器注入sqlsessionFactoryBean
        5、配置datasourceTransactionManager注入数据源配置事务
        6、配置MapperScannerConfigurer扫描mybatis的接口映射
        7、配置spring事务的切面以及通知
        
#{}和${}的区别
        #{}会将sql语句编译好并使用占位符?然后再进行取值< 值转换成字符串 > 很大的程度防止sql注入 一般能用#{}的就别用${}
        ${}先取值< 不做任何处理直接引用 >然后再去编译sql语句 无法防止sql注入 一般用于传入数据库对象 例如传入表名
        
xml映射文件中,除了常见的select|insert|update|delete|标签之外,还有哪些标签?
        结果集映射:<resultMap>
        生成主键:<selectKey>
        动态sql的标签:trim(替换)
                                        where(where条件的追加)
                                        set(用于修改多个列)
                                        foreach(循环结果集)
                                        if(判断)
                                        choose|when|otherwise(相当于Java中的if(){}else{} 两者选其一)

mybatis是如何进行分页的?分页插件的原理是什么?
        Mybatis使用Rowbounds对象进行分页,他是针对resultSet结果集执行的内存分页
        其实是一个拦截器 在执行sql语句之前重写sql 添加分页语句和分页参数
        
mybatis是否支持延迟加载?他的实现原理是什么?
        mybatis仅支持一对一关联对象和一对多关联集合对象的延迟加载  可以在mybatis配置文件中配置 lazyLoadingEnabled=true|false
       原理:使用CGLIB创建目标对象的代理对象 当调用目标方法时,进入拦截器,只查询目标的数据 当需要与目标相关的数据时从关联表去关联查询
        
mybatis中如何执行批处理
        使用BatchExecutor《白痴一克塞克特》
        
jdbc操作数据库的步骤 涉及到了那些对象

        
        String url=p.getProperty("url");//获取连接服务器的ip地址 端口 和数据库  
        String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库  
        String uname=p.getProperty("username");//使用哪个账号登录  
        String pwd=p.getProperty("password");//登录密码  
        Class.forName(driverClass);//加载该类  
        Connection conn=DriverManager.getConnection(url,uname,pwd);//获取连接数据库的对象  

1、加载驱动类
                class.forName("驱动类")
        2、通过DriverManager.getConnection获取连接数据库
         3、通过调用createStatement()方法获取statement《死得特门特》执行静态sql  Statement st=conn.createStatement();
                调用PrepareStatement()方法 传入sql编译动态sql获取PreparedStatement《婆盘得死得特门特》对象进行设值 PreparedStatement pscolumn=conn.prepareStatement(sql);
        4、创建游标对象ResultSet rt=ps.executeQuery(); 
        5、循环抓取数据 每次抓取一行数据
                        while(rs.next){
                                String id=rs.getString(“id”);
                                String name=rs.getString(2);
                                User user=new User();
                                User.setId(id);
                                ……
                        }
                        
jdbc调用存储过程
        1、获取数据库的连接对象
        2、调用prepareCall《破盘靠》预编译sql 获取CallableStatement对象
                过程 {call 过程名(参数)}
                函数 {参数=call 函数名(参数)}
        3、通过CallableStatement设值  调用execute()方法执行
        
jdbc如何处理批处理
        预编译sql对象 调用addBatch()将数据打包再调用executeBatch()

猜你喜欢

转载自blog.csdn.net/panhaigang123/article/details/79587602