MyBatis面试系列-01

1. MyBatis 是什么框架?

MyBatis框架是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装性要低于Hibernate,性能优秀,并且小巧。

ORM即对象/关系数据映射,也可以理解为一种数据持久化技术。

MyBatis的基本要素包括核心对象、核心配置文件、SQL映射文件。

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

2. MyBatis 中 ${} 和 #{} 传参有什么区别?

1)“#”符号将传入的数据当成一个字符串并将传入的数据加上双引号。

如:order by #{userId},如果传入的值是1,那么解析成sql时的值为order by "1",如果传入的值是userId,则解析成的sql为order by "userId"。

2)“$”符号将传入的数据直接显示生成在sql语句中。

如:order by ${userId},如果传入的值是1,那么解析成sql时的值为order by 1, 如果传入的值是userId,则解析成的sql为order by userId。

3)“#”符号能够很大程度防止sql注入,而“$”符号无法防止sql注入。

4)“$”符号方式一般用于传入数据库对象,例如传入表名。

5)一般能用“#”符号的就别用“$”符号

6)MyBatis排序时使用order by动态参数时需要注意使用“$”符号而不是“#”符号。

3. MyBatis 如何实现分页?

Mybatis使用rowbounds对象进行分页,它是针对resultset结果集执行的内存分页,而非物理分页。可以在sql内直接带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

对数据库表数据进行分页,依靠offset和limit两个参数,表示从第几条开始,取多少条。也就是常说的start和limit。

1)相对原始方法,使用limit分页,需要处理分页逻辑:

MySQL数据库使用limit,如:

select * from table limit 0,10; --返回0-10行

Oracle数据库使用rownum,如:

从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下:

SELECT * FROM (SELECT ROWNUM R,t1.* From Sys_option where rownum < 30 ) t2 Where t2.R >= 10

2)拦截StatementHandler,其实质还是在最后生成limit语句。

3)使用PageHelper插件,目前比较常见的方法。

4. MyBatis 如何获取自动生成的主键 ID 值?

数据插入时获得主键值分为两种情况:支持主键自增数据库和不支持主键自增。

1)对于支持自动生成主键的数据库,如Mysql、sqlServer,可以通过Mybatis元素useGeneratedKeys返回当前插入数据主键值到输入类中。

<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" 
 parameterType="com.kq.domain.IdentityTest">
        insert into identity_test(name)
        values(#{name,jdbcType=VARCHAR})
</insert>

当执行此条插入语句以后,实体类IdentityTest中的Id会被当前插入数据的主键自动填充。

2)对于不支持自动生成主键的数据库。Oracle、DB2等,可以用元素selectKey 回当前插入数据主键值到输入类中。(同时生成一个自定义的随机主键)

<insert id="insertTest" useGeneratedKeys="true" keyProperty="id" 
 parameterType="com.kq.domain.IdentityTest">
 <selectKey keyProperty="id" resultType="String" order="BEFORE">
        SELECT  REPLACE(UUID(),'-','')  
  </selectKey>
        insert into identity_test(name)
        values(#{name,jdbcType=VARCHAR})
</insert>

当执行此条插入语句以后,实体类IdentityTest中的Id也会被当前插入数据的主键自动填充。

5. MyBatis 中 Integer 类型值是 0 ,为什么 != '' 无法执行?

MySQL数据库中设计数据库表,其中某字段status使用tinyint数据类型,当修改状态的时候,赋值status属性的值为0,用于改变状态记录试题库中发布情况。

但是通过Debug模式查看Controller控制层明显已经获取到status等于0,但是在执行到MyBatis中xml文件SQL语句时,总是无法赋值成功,xml配置如下:


 

                

相关推荐

  1. MyBatis面试系列-01

    2024-03-22 16:56:03       40 阅读
  2. MyBatis面试系列-02

    2024-03-22 16:56:03       39 阅读
  3. Mybatis面试系列

    2024-03-22 16:56:03       32 阅读
  4. Mybatis面试系列

    2024-03-22 16:56:03       33 阅读
  5. MySQL面试系列-01

    2024-03-22 16:56:03       45 阅读
  6. Elasticsearch面试系列-01

    2024-03-22 16:56:03       44 阅读
  7. Mybatis面试系列

    2024-03-22 16:56:03       28 阅读
  8. MyBatis面试系列

    2024-03-22 16:56:03       35 阅读
  9. 架构设计面试系列-01

    2024-03-22 16:56:03       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 16:56:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 16:56:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 16:56:03       82 阅读
  4. Python语言-面向对象

    2024-03-22 16:56:03       91 阅读

热门阅读

  1. 【安全类书籍-5】黑客大曝光

    2024-03-22 16:56:03       35 阅读
  2. spring boot切面execution表达式添加多个包路径

    2024-03-22 16:56:03       38 阅读
  3. Mysql迁移至达梦所遇问题汇总

    2024-03-22 16:56:03       39 阅读
  4. 【React】React组件的导入与导出

    2024-03-22 16:56:03       42 阅读
  5. [Qt学习笔记]Qt线程间数据通讯及数据共享

    2024-03-22 16:56:03       35 阅读
  6. 多线程(3)线程基本状态

    2024-03-22 16:56:03       45 阅读
  7. c++算法学习笔记 (16) 约数

    2024-03-22 16:56:03       43 阅读
  8. AI大模型学习:挑战与机遇

    2024-03-22 16:56:03       41 阅读
  9. Ubuntu自启GUI程序

    2024-03-22 16:56:03       37 阅读