Mybatis

1.为什么需要预编译?

  1,防止SQL注入

  2.预编译生成的PreparedStatement对象执行时,不予要在进行编译,节省性能.并且PreparedStatement对象可以多次复用.Mybatis默认情况下会对说有的SQL进行预编译.

 

2.Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

  仅支持关联对象和关联集合对象的延迟加载.

  实现原理是CGLIB动态代理实现的.比如a.getb().name().执invoke a.getb()时,值是null,这个Mybatis就会先将实现查询好的b的值放进a.getb(b).于是a的对象b的属性就有值了.hibernate的延迟加载也是类似.

 

3.mybatis模糊查询like语句该怎么写?

  使用函数concat('%'#(dang)'%').  SQL语句怎么写 select like dang%  from test

 

4. 在mapper中如何传递多个参数?

  1,可以使用@param注解

  2,使用collection集合传参

  3,将数据封装到pojo类中

  4,普通顺序传参

 

5,Mybatis如何执行批量操作?

   

   如添加批量添加多条信息,you

  insert into table emp(name,gender,email,did)values

  <forech='collecion' item='emp' separator=" , ">

  (#{emp.eName},#{emp.gender},#{emp.email},#{emp.dept.id})

  </forech>

 

6,如何获取生成的主键?

   在insectStatement中设置标签<useGeneratedKeys=true,KeyProperty=ID>

 

7,当实体类中的属性名和表中的字段名不一样 ,怎么办?

  1:在SQL中设置字段别名使字段名和属性名一致

  2:在resourceMap中映射字段名和实体类名一致.

  3,使用注解FliesType

 

8,什么是MyBatis的接口绑定?有哪些实现方式?

  接口绑定就是把接口和SQL语句绑定,调用接口方法就可以执行对应绑定的SQL语句

  有两种实现方式:1 注解,在接口方法上使用注解@select,@Update等

          2,使用XML文件编写SQL语句,要注意namespace要和接口的类路径名相同,方法和SQL ID一致,已经形参和paramtype,返回值类型和resultType一致

 

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

  mybatis因为resultmap或者SQL别名和实体对象属性名一一映射.通过反射常见对象,同时将反射的方式给对象属性赋值并返回.

 

10. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

  <include>标签可以在XML文件中任何地方,因为Mybatis解析A时候,如果发现没有解析B标签,就会对A标签标记为未解析状态,等解析完所有标签后,重新解析未解析状态的SQL

 

11.Mybatis能执行一对多,一对一的联系查询吗,有哪些实现方法?

  实现方法1:子查询

      2:单独查询一个SQL,去查询关联对象,将查询结果赋给主对象,然后返回给主对象

      3:想JOIN一样,一遍查询主对象,一边查询关联对象

 

12,Mybatis是否可以映射Enum枚举类?

可以,Mybatis甚至可以映射对象到数据库中的一个字段中.映射方式为自定义一个typeHandler.实现typeHandler的setparameter()和getResult()方法,他们就是负责转换Javatype()和jdbctype().

 

13,Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理吗?

  动态SQL可以让我们在XML文件中以标签的形式,完成判断,拼接SQL的功能

  trim|where|set|foreach|if|choose|when|otherwise|bind。
  其执行原理为,使用每一个从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

 

14,Mybatis是如何进行分页的?分页插件的原理是什么?

  两种分页  1,可以直接在SQL语句中书写带有分页的语句,和分页参数.分页插件的原理是通过Mybatis的提供的插件接口,在插件的拦截方法内,拦截待执行的SQL语句,重新SQL.添加分页的物理分页参数和物理分页语句. 比如MySQL select * from table limit 0 10

        2,对结果集进行分页.比如获取结果,使用遍历形式对其进行分页.

 

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

Mybatis仅可以编写针对ParameterHandler、ResultSetHandler、StatementHandler、
Executor这4种接口的插件,Mybatis使用JDK的动态代理,为需要拦截的接口生成代理对象以实现
接口方法拦截功能,每当执行这4种接口对象的方法时,就会进入拦截方法,具体就是
InvocationHandler的invoke()方法,当然,只会拦截那些你指定需要拦截的方法。
实现Mybatis的Interceptor接口并复写intercept()方法,然后在给插件编写注解,指定要拦截哪一
个接口的哪些方法即可,记住,别忘了在配置文件中配置你编写的插件。

16,根据实体类的参数进行查询,统计最近时间段内,某字段的不同value的个数。返回map集合

 <resultMap id="healthCountResultMap" type="java.util.HashMap">
        <result column="normal" property="normal"/>
        <result column="warn1" property="warn1"/>
        <result column="warn2" property="warn2"/>
        <result column="warn3" property="warn3"/>
    </resultMap>
    <select id="getHeathCount" resultMap="healthCountResultMap"
            parameterType="com.weizu.baseInfo.domain.PhmFeaturesData">
        select SUM(td.`enable` LIKE '%1%') AS normal,
               sum(`enable` like '%2%'
                   )                       AS warn1,
               sum(`enable` like '%3%'
                   )                       AS warn2,
               sum(`enable` like '%4%'
                   )                       AS warn3
        from phm_threshold AS td
        where created_time = (select MAX(t.created_time) from phm_threshold AS t)
          and point_id = #{pointId}
    </select>

 

posted @ 2021-08-06 16:38  党王  阅读(228)  评论(0)    收藏  举报