当前位置: 首页 > 后端技术 > Java

java培训:MyBatis相关面试题分享

时间:2023-04-01 22:41:16 Java

什么是Mybatis?1、Mybatis是一个半ORM(对象关系映射)框架。它在内部封装了JDBC。开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建语句等复杂的过程。程序员直接编写原生态sql,可严格控制sql执行性能,灵活性高。2、MyBatis可以使用XML或者注解来配置和映射原生信息。Java训练将POJO映射到数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数和获取结果集。3、通过xml文件或者注解配置要执行的各种语句,通过语句中的java对象和sql动态参数的映射生成最终执行的sql语句。最后mybatis框架执行sql并将结果映射到java对象返回。(从执行sql到返回结果的过程)。Mybaits的优点:1.基于SQL语句编程,非常灵活,不会对现有的应用程序或数据库设计产生任何影响。SQL采用XML编写,将sql与程序代码解耦,便于统一管理;提供XML标签,支持编写动态SQL语句,可重复使用。2、与JDBC相比,减少了50%以上的代码量,剔除了JDBC的大量冗余代码,不需要手动切换连接;3.对各种数据库的兼容性都很好(因为MyBatis是使用JDBC连接数据库的,所以只要JDBC支持的数据库MyBatis都支持)。4.可以很好的和Spring集成;5.提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象-关系映射标签,支持对象-关系组件维护。MyBatis框架的缺点:1、编写SQL语句的工作量比较大,尤其是字段多、关联表多的时候,对开发人员编写SQL语句有一定的要求。2、SQL语句依赖于数据库,导致数据库可移植性差,不能随意更换数据库。MyBatis框架的适用场合:1、MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。2、对于性能要求高的项目,或者需求变化频繁的项目,比如互联网项目,MyBatis会是一个不错的选择。MyBatis和Hibernate有什么区别?1、与hibernate不同,Mybatis不完全是一个ORM框架,因为MyBatis需要程序员自己写Sql语句。2、Mybatis直接编写原生态sql,可以严格控制sql的执行性能,灵活性高。非常适合对关系数据模型要求不高的软件开发。由于此类软件的需求变化频繁,java培训机构的需求变化很快。输出结果。但是灵活性的前提是mybatis不能是数据库无关的。如果需要实现支持多数据库的软件,需要自定义多套sql映射文件,工作量大。3、Hibernate具有强大的对象/关系映射能力和良好的数据库独立性。对于关系模型要求高的软件,如果使用hibernate开发,可以节省大量代码,提高效率。#{}和${}有什么区别?{}是预编译处理,${}是字符串替换。Mybatis在处理#{}时,会把sql中的#{}替换成一个?number,调用PreparedStatement的set方法赋值;Mybatis处理时,会将{}替换为变量的值。使用#{}可以有效防止SQL注入,提高系统安全性。实体类中的属性名和表中的字段名不一致怎么办?类型一:通过在查询的sql语句中定义字段名的别名,使字段名的别名与实体类的属性名保持一致。selectorder_idid,order_noorderno,order_pricepriceformorderswhereorder_id=#{id};类型2:使用映射字段名和实体类属性名之间的一对一关系。从订单中选择*order_id=#{id}Howto写模糊查询之类的语句?类型1:在Java代码中添加sql通配符。insertintonames(名称)值(#{name})第二种:在sql语句中拼接通配符会导致sql注入字符串通配符名称="smi";listnames=mapper.selectlike(wildcardname);select*fromfoowherebarlike"%"${value}"%"通常一个Xml映射文件会写一个与之对应的dao接口。请问这个Dao接口的工作原理是什么?Dao接口中的方法在参数不同的情况下是否可以重载?Dao接口就是Mapper接口。接口的全称是映射文件中的命名空间值;接口的方法名是映射文件中MapperStatement的id值;接口方法中的参数是传递给sql的参数。Mapper接口没有实现类。调用接口方法时,以接口全名+方法名拼接的字符串作为键值,可以唯一定位到一个MapperStatement。在Mybatis中,每一个2、方法二:使用@param注解:publicinterfaceusermapper{userselectuser(@param("username")stringusername,@param("hashedpassword")stringhashedpassword);}然后,可以在xml中使用如下(建议封装成map,单独传给mapperparameter):selectid,username,hashedpasswordfromsome_tablewhereusername=#{username}andhashedpassword=#{hashedpassword}3.第三种:封装多个参数intomaptry{//映射文件的命名空间。SQL片段的ID,可以调用对应映射文件中的SQL//由于我们的参数不止两个,方法中只有一个Object参数集合,所以我们使用Map集合来加载我们的参数Mapmap=newHashMap();map.put("start",start);map.put("end",end);returnsqlSession.selectList("StudentID.pagination",map);}catch(异常e){e.printStackTrace();sqlSession.rollback();throwe;}finally{MybatisUtil.closeSqlSession();}Mybatis动态sql有什么用?实现原理?什么样的动态sql?Mybatis动态sql可以在Xml映射文件中以tags的形式写入动态sql,执行原理是根据表达式的值完成逻辑判断和动态拼接sql函数。Mybatis提供了9种动态sql标签:trim|where|set|foreach|if|choose|when|otherwise|bind。Xml映射文件中,除了常见的select|insert|updae|delete标签外,还有哪些标签?答:,加上动态sql的9个标签,其中是sql分片标签,通过引入sql分片tag,为不支持自增的主键生成策略标签。17、Mybatis的Xml映射文件中,不同Xml映射文件的id是否可以重复?对于不同的Xml映射文件,如果配置了namespace,id可以重复;如果没有配置命名空间,id不能重复;原因是使用了namespace+id作为Map的key,如果没有命名空间,只设置id的话,id重复会导致数据互相覆盖。有了namespace,id自然就可以重复了,namespace不同,namespace+id自然就不一样了。为什么Mybatis是一个半自动的ORM映射工具?它和全自动有什么区别?Hibernate是一个全自动的ORM映射工具。使用Hibernate查询关联对象或关联集合对象时,可以根据对象关系模型直接获取,因此是全自动的。Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,因此被称为半自动ORM映射工具。一对一、一对多关联查询?select*fromc类,教师t,其中c.teacher_id=t.t_id和c.c_id=#{id}select*fromc班,老师t,学生s,其中c.teacher_id=t.t_id和c.c_id=s.class_id和c.c_id=#{id}MyBatis实现一对一一共有多少种方式?它是如何工作的?有联合查询和嵌套查询。联合查询是几个表的联合查询,只查询一次。可以通过在resultMap中配置关联节点来配置一对一类来完成;嵌套查询就是先查一张表,根据这张表里面结果的外键id,去另外一张表查询个数按照它的说法,也是通过association来配置的,但是配置MyBatis的方式有几种,通过对另一张表的query的select属性实现一对多,如何操作呢?有联合查询和嵌套查询。联合查询是几个表的联合查询。它只被查询一次。可以通过在resultMap中的collection节点配置一个一对多的类来完成;嵌套查询就是先查一张表,根据这张表中结果的外键id,查询另一张表的数据也是通过collection配置的,但是查询另一张表是通过select节点配置的。Mybatis支持延迟加载吗?如果支持,它是如何实现的?答:Mybatis只支持关联对象和集合对象的延迟加载。关联是指一对一,集合是指一对多查询。在Mybatis的配置文件中,可以配置是否开启懒加载lazyLoadingEnabled=true|false。它的原理是利用CGLIB创建目标对象的代理对象。当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()为null,则发送预先保存的与B对象关联的sql单独查询,查询B,然后调用a.setB(b),使a的对象b属性有值,然后完成a.getB().getName()方法称呼。这就是懒加载的基本原理。当然,不仅仅是Mybatis,包括Hibernate在内的几乎所有的都支持同样的懒加载原理。Mybatis的一级缓存和二级缓存:1)一级缓存:基于PerpetualCache的HashMap本地缓存,其存储范围为Session,当Session被刷新或关闭时,Session中的所有Cache都会被清除,并且第一级缓存默认启用。2)二级缓存的机制与一级缓存相同。默认是使用PerpetualCache和HashMap存储。不同的是它的存储范围是Mapper(Namespace),存储源可以自定义,比如Ehcache。默认情况下不启用二级缓存。启用二级缓存,二级缓存属性类的使用需要实现Serializable序列化接口(可以用来保存对象的状态),在其映射中配置文件;3)对于Cache数据更新机制,当一个作用域(一级缓存Session/二级缓存Namespaces)进行C/U/D操作时,默认清除该作用域下select中的所有缓存。什么是MyBatis接口绑定?有哪些实现?接口绑定就是在MyBatis中任意定义接口,然后将接口中的方法绑定到SQL语句中。我们可以直接调用接口方法,这样我们就可以比原来SqlSession提供的方法有更灵活的选择和设置。.有两种方法可以实现接口绑定。一种是通过注解方式绑定,就是在接口方法上加上@Select、@Update等注解,其中包含Sql语句进行绑定;另一种是写SQL通过xml来绑定,这种情况下,在xml映射文件中指定命名空间必须是接口的全路径名。当Sql语句比较简单时,用注解绑定。当SQL语句比较复杂时,与xml绑定。一般都是用xml来绑定的。使用MyBatis的mapper接口有什么要求?1、Mapper接口方法名与mapper.xml中定义的每条sql的id相同;2、Mapper接口方法的入参类型与mapper.xml中定义的各个sql的parameterType相同;3、Mapper接口方法输出参数类型与mapper.xml中定义的每条sql的resultType相同;4、Mapper.xml文件中的namespace是mapper接口的类路径。Mapper的写法有哪些?第一种方法:接口实现类继承SqlSessionDaoSupport:使用该方法需要编写mapper接口,mapper接口实现类,mapper.xml文件。1.在sqlMapConfig.xml中配置mapper.xml的位置2.定义mapper接口3.实现类集成SqlSessionDaoSupportmapper方法可以使用this.getSqlSession()来增删改查数据。4、Spring配置第二种:使用org.mybatis.spring.mapper.MapperFactoryBean:1.在sqlMapConfig.xml中配置mapper.xml的位置。如果mapper.xml和mappre接口同名并且在同一个目录下,则不需要配置2.定义mapper接口:1.mapper.xml中的namespace是mapper接口的地址2.mapper接口中的方法名与id一致mapper.xml中定义的语句3.定义第三种方法:使用mapper扫描器:1.Mapper.xml文件编写:mapper.xml中namespace为mapper接口地址;mapper接口中的方法名与mapper.xml中定义的statement的id保持一致;如果映射器.xml如果与mapper接口名称一致,则无需在sqlMapConfig.xml中配置2.定义mapper接口:注意mapper.xml的文件名与mapper接口名称一致,并且放在同一个目录下3.配置mapper扫描器:4.使用scanner后从spring容器中获取mapper实现对象。简述Mybatis插件的运行原理以及如何编写插件。答:Mybatis只能为ParameterHandler、ResultSetHandler、StatementHandler、Executor这4个接口编写插件。Mybatis利用JDK的动态代理,为需要拦截的接口生成代理对象,实现接口方法拦截功能。每当执行这4个接口的Object方法时,就会进入拦截方法,具体是InvocationHandler的invoke()方法。当然,只有你指定要拦截的那些方法才会被拦截。编写插件:实现Mybatis的Interceptor接口并重写intercept()方法,然后为插件编写注解,指定拦截哪个接口的哪些方法。记住,不要忘记在配置文件中配置你写的插件。文章来自连编

猜你喜欢