招贤资讯网

首页 > 正文

27 道经典 MyBatis 面试题

www.cartecampus.com2019-09-20

作者| a

链接|

1.什么是Mybatis?

Mybatis是一个半ORM(对象关系映射)框架,它在内部封装了JDBC。它只需要在开发过程中注意SQL语句本身。它不需要任何努力来处理加载驱动程序,创建连接和创建语句的复杂过程。程序员直接编写原始的sql,它可以严格控制sql执行性能并具有很高的灵活性。

MyBatis可以使用XML或注释来配置和映射本机信息,将POJO映射到数据库中的记录,避免几乎所有JDBC代码并手动设置参数和获取结果集。

要执行的各种语句由xml文件或注释配置,最终执行的sql语句是通过在java对象和语句中映射sql的动态参数生成的,最后sql语句由mybatis框架执行,结果映射到java对象并返回。 (从执行sql到返回结果的过程)。

2,Mybaits的优点:

基于SQL语句编程,它非常灵活,不会对应用程序或数据库的现有设计产生任何影响。 SQL是用XML编写的,解耦了sql和程序代码之间的耦合,促进了统一管理;提供XML标记并支持编写动态SQL语句并且可以重用。

与JDBC相比,它将代码量减少了50%以上,消除了JDBC大量冗余代码,并且不需要手动切换连接;

与各种数据库非常兼容(因为MyBatis使用JDBC连接数据库,因此只要支持JDBC的数据库MyBatis支持它)

能够与Spring完美整合;

提供映射标记以支持对象和数据库之间的ORM字段关系映射;提供对象关系映射标记以支持对象关系组件维护。

3. MyBatis框架的缺点:

SQL语句的编写比较大,特别是当有很多字段和很多相关表时,开发人员对编写SQL语句有一定的要求。

SQL语句依赖于数据库,导致数据库的可移植性差,并且您无法随意更改数据库。

4,MyBatis框架适用场合:

专注于SQL本身,MyBatis是一个足够灵活的DAO层解决方案。

对于具有高性能要求或更多要求更改的项目(如Internet项目),MyBatis将是一个不错的选择。

5. MyBatis和Hibernate有什么区别?

Mybatis与休眠不同。它不完全是一个ORM框架,因为MyBatis要求程序员自己编写Sql语句。

Mybatis直接编写原始的sql,它可以严格控制sql的执行性能,并具有很高的灵活性。它非常适合对关系数据模型要求较低的软件开发。因为这种软件需要经常变化,一旦需求变化需要快速输出。但是,灵活性的前提是mybatis无法实现数据库独立性。如果需要实现支持多个数据库的软件,则需要自定义多组sql映射文件,这是很多工作。

Hibernate对象/关系映射能力,数据库独立性,对于关系模型高的软件,如果使用hibernate开发可以节省大量代码,提高效率。

6.#{}和$ {}有什么区别?

#{}是预编译的,$ {}是字符串替换。

当Mybatis处理#{}时,它用s替换sql中的#{},并调用PreparedStatement的set方法来赋值;

当Mybatis处理$ {}时,它会将$ {}替换为变量的值。

使用#{}可以有效地防止SQL注入并提高系统安全性。

7.如果实体类中的属性名称与表中的字段名称不同,我该怎么办?

第一种类型:通过在查询的sql语句中定义字段名称的别名,字段名称的名称与实体类的属性名称相同。

选择order_id id,order_no orderno,order_price价格表订单,其中order_id=#{id};

第二种类型:通过映射字段名称和实体类属性名称之间的一对一对应关系。

从order_id=#{id}

的订单中选择*

8.如何编写类似语句的模糊查询?

类型1:将sql通配符添加到Java代码中。

String wildcardname=“%smi%”; list names=mapper.selectlike(wildcardname);从foo中选择*,其中bar为#{value}

第二种:在sql语句中拼接通配符将导致sql注入

String wildcardname=“smi”; list names=mapper.selectlike(wildcardname);从foo中选择*,其中bar为'%'#{value}'%'

9,通常是一个Xml映射文件,会写一个与之对应的Dao接口,请问,这个Dao接口的工作原理是什么? Dao界面中的方法,当参数不同时,方法是否可以重载?

Dao接口是Mapper接口。接口的全名是映射文件中命名空间的值;接口的方法名称是映射文件中Mapper的Statement的id值;接口方法中的参数是传递给sql的参数。

Mapper接口没有实现类。调用接口方法时,接口全名+方法名称拼接字符串用作键值,可以唯一地定位MapperStatement。在Mybatis中,每个,和标记都被解析为MapperStatement对象。

例如:com.mybatis3.mappers.StudentDao.findStudentById,您可以唯一地找到其名称空间为com.mybatis3.mappers.StudentDao且其id为findStudentById的MapperStatement。

Mapper接口中的方法无法重载,因为使用全名+方法名称保存和搜索它们。 Mapper接口的工作原理是JDK动态代理。运行Mybatis运行时时,JDK动态代理用于为Mapper接口生成代理对象代理。代理对象拦截接口方法,然后执行MapperStatement表示的sql,然后返回sql执行结果。

10. Mybatis如何分页?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,这是一个针对ResultSet结果集而不是物理页面执行的内存分页器。物理分页功能可以通过在sql中直接写入带有物理分页的参数,或者通过使用分页插件来完成物理分页来完成。

分页插件的基本原理是使用Mybatis提供的插件接口来实现自定义插件,拦截要在插件拦截方法中执行的sql,然后根据方言方言重写sql,添加相应的物理分页语句和物理分页参数。

11. Mybatis如何将sql执行结果封装为目标对象并将其返回?有哪些映射形式?

第一种是使用标签逐个定义数据库列名和对象属性名之间的映射。

第二种是使用sql列的别名函数将列的别名写为对象属性名。

通过列名和属性名之间的映射,Mybatis通过反射创建对象,并使用反射逐个分配和返回对象的属性。无法分配无法找到映射关系的那些。

12.如何执行批量插入?

首先,创建一个简单的插入语句:

插入名称(名称)值(#{value})

然后在java代码中执行批量插入:如下所示:

列表名称=新的arraylist; names.add( “fred的”); names.add( “巴尼”); names.add( “贝蒂”); names.add( “威尔玛”); //注意这里的executortype.batch sqlsession Sqlsession=sqlsessionfactory.opensession(executortype.batch); try {namemapper mapper=sqlsession.getmapper(namemapper.class); for(字符串名称:名称){mapper.insertname(name); sqlsession.commit; } catch(例外e){e.printStackTrace; sqlSession.rollback;扔掉; } finally {sqlsession.close; }

13.如何获取自动生成的(主)键值?

insert方法始终返回一个int值,该值表示插入的行数。

如果采用自增长策略,则在执行insert方法后,可以将自动生成的键值设置为传入的参数对象。

例如:

插入名称(名称)值(#{name})

14.如何在映射器中传递多个参数?

第一:

//DAO层函数Public UserselectUser(String name,String area);

//对应的xml,#{0}表示dao层中的第一个参数,#{1}表示dao层中的第二个参数。稍后可以添加更多参数。选择* fromuser_user_t whereuser_name=#{0} anduser_area=#{1}

第二:使用

http://wap.a186.net.cn

热门浏览
热门排行榜
热门标签
日期归档