Mybaits面试总结

1)Mybaits是什么?

Mybaits是一款优秀的持久层架构,一个半ORM(对象关系映射)框架,它支持定制化SQL,存储过程以及高级映射,Mybatis避免了所有JDBC代码和手动设置参数以及获取结果集,Mybatis可以使用简单的XML和注解配置和映射原生类型、接口和JAVA的POJO(Plain Old Java Objects,普通老式对象)为数据库中的记录。

2)ORM是什么?

ORM(Object Retational Mapping) 对象关系映射,为了解决关系型数据库和简单Java对象(POJO)映射关系的技术。

ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

3)Mybatis 和 Hibernate 的区别?

相同点:都是对jdbc的封装,都是持久层框架,都基于dao层开发 。

不同点:

映射关系:

Hibernate是全自动ORM映射工具,使用Hibernate查询关联对象或关联集合对象时,可以通过对象关系模型直接获取。

Mybatis查询关联对象或关联集合对象时,通过手动编写SQL完成。

SQL优化和移植性:

Hiberdate对SQL语句封装,提供了日志、缓存、级联等特性,提供HQL操作数据库,数据库无关性支持好,但会消耗性能,代码开发量少,但SQL语句优化比较困难。

Mybatis手动编写SQL,支持动态SQL ,动态生成表名,支持存储过程,但开发工作量大,直接一用SQL支持数据库,不支持数据库无关性,但SQL优化比较容易。

开发难易程度和学习成本:

Hibernate重量级框架,学习使用门槛高,适合于需求相对稳定,中小型项目,比如办公自动化系统,

Mybatis轻量级框架,学习使用门槛低,适合于需求变化频繁,大型项目,比如:电子商务系统。

4)Mybatis编程步骤是什么样的?

1 创建SqlSessionFactory

2 通过SqlSessionFactory 创建SqlSession。

3 通过Sqlsession执行数据操作。

4 调用session.commit()提交事务。

5 调用session.close() 关闭会话。

5)#{}和${}区别:

#{}是占位符,预编译处理,${}是拼接符,字符串替换

#{}有效防止SQL注入,提高系统安全性,${}不能防止SQL注入

#{}传入参数是以字符串传入,会将SQL中的#{}替换成?号,调用preparedStatement的set方法赋值。

${}原值传入,把{}替换成变量的值,相当于jdbc的Statement编译。

变量替换后,#{}对应的变量自动加上单引号'',${}对应的变量不会自动加上单引号''.

#{}的变量替换是在BDMS中,${}的变量替换是在BDMS外。

6)模糊查询like语句怎么写:

“%”#{value}"%"  注意:#{}解析成SQL语句,会在变量外自动加入单引号,

CONCAT('%',#{value},'%'),使用CONCAT函数。

使用bind标签

<select id="name" resultType="com.io.po.user">

    <bind name="part" value=" '%' + username + '%' ">

    select id name age from person where username like #{par}

</select>

7)在mapper中如何传递多个参数?

1) 使用顺序传参法

public User selectUser(String name,int id);

      <select id ="selectUser" resultMap="UserResultMap">

     select * from user where user_name=#{0} and id =#{1}

</select>

备注:#{}里面的数字表示传入参数的顺序。

这种方法不推荐使用,SQL层表达不直观,一旦顺序调整容易出错。

2) 使用@Param注解传参法

public User selectUser(@Param("userName") String name,int @Param("deptId") depeId);

   <select id="selectUser" resultMap="UserResultMap">

        select * from user where user_name=#{userName} and dept_id = #{depeId}  

</select>

备注:#{}里面的名称对应注解里@Param括号里修饰的名称。

          参数不多的情况下推荐使用。比较直观

3)Map传参法

public User selectUser(Map<String,Object> params);

  <select id="selectUser" paramterType="java.util.map" resultMap="UserResultMap">

    select * from user where user_name=#{user_name} and dept_id=#{depeId}

<select>

备注:#{}里面的名称参数对应Map里面的key名称。

           适合多个参数传递,参数异变能灵活传递的情况。

4) java  bean 传参法

public User selectUser(User user);

<select  id="selectUser"  paramterType="com.io.po.User" resultMap="UserResultMap">

          select * from user where user_name =#{username} and dept_id =#{deptId}

</select>

备注: #{}里面的名称对应的是User类里面的成员属性。

这种方法直观,需要建一个实体类,扩展不容易,需要加属性,但代码可读性强,业务逻辑处理方便,推荐使用。

8)Mybatis如何进行批量操作?

使用foreach标签

foreach主要用在构建in条件中,在SQL语句中进行迭代一个集合,foreach标签的主要属性主要有item,index,collection,open,separator,close。

item  集合中每一个元素进行迭代的别名,随便起的变量名

inex  指定一个名字,用于在迭代过程中,每次迭代的位置,不常用

open 表示语句以什么开始,常用“(”;

separator 每次进行迭代之间以什么符合进行分隔符,常用“,”;

close 表示以什么结束,常用“)”;

collection属性指定的三种属性情况:

1)传入的是单参数且参数类型是List,collection属性值为List

2)  传入的是单参数且参数类型是array数组,collection属性值为array

3)  多参数使用map,map的key是参数名,collection属性值传入的lsit或者array对象在封装的map里的key.

具体用法如下:

<insert id="addEmp">

   INSERT INTO  EMP(ID ,NAME,AGE) VALUES

<foreach collection="emps" item ="emp" separator=",">

        (#{emp.id},#{emp.name},#{emp.age})

<foreach>

</insert>

<insert id="addEmp">

        <foreach collection="emps" item="emp" separatoe=",">

       INSERT INTO EMP(ID,NAME,AGE) VALUES (#{emp.id},#{emp.name},#{emp.age})

</insert>

9)什么是Mybatis的接口绑定?有哪些实现方式?

在mybatis定义任意接口,将接口的方法与SQL语句绑定,直接调用接口方法

两种方式:

注解实现,在接口的方法上加上@select @update等注解,里面包含SQL绑定

通过XML写SQL绑定,指定XML映射文件的namespace必须为接口的全路径名。

10)Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

如果配置了namespace,id可重复,么有配置的话,id不能重复,namespace只是最佳实践

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

<resultMap>,<parameterMap>,<sql>,<include>,<selectKey>

12)MyBatis实现一对一,一对多有几种方式,怎么操作的?

联合查询:多表联合查询,只查询一次,通过在resultMap里的association ,collection配置一对一,一对多的类就可以完成。

嵌套查询:先查一个表,根据这个表得结果得外键ID,去另一个表查询数据,也是通过配置association ,collection,但另外一张表得查询通过select节点配置。

13)简述Mybatis的插件运行原理,以及如何编写一个插件?

原理:Mybatis仅可以编写针ParameterrHandler,ResultSetHandler,StatementHandler.Executor,4种接口插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现接口方法拦截功能,每当执行4种接口对象的方法时,就会进入拦截方法,具体就是InvocationHandler的invoke()方法,只会拦截那些你指定需要拦截的方法。

2.在配置文件中写入plugins标签

  <plugins>
        <plugin interceptor="city.albert.TestInterceptor">
            <property name="name" value="name"/>
        </plugin>
    </plugins>

14)Mybatis的一级二级缓存

  1. 一级缓存默认开启,查询时先从缓存中查询,缓存中没有对应数据时再进行数据库查询。
  2. 二级缓存即查询缓存,他的作用于是mapper和namespace,二级缓存可以跨SqlSession

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛小方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值