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返回当前插入数据主键值到输入类中。

 parameterType="com.kq.domain.IdentityTest">

insert into identity_test(name)

values(#{name,jdbcType=VARCHAR})

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

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

 parameterType="com.kq.domain.IdentityTest">

 

SELECT REPLACE(UUID(),'-','')

insert into identity_test(name)

values(#{name,jdbcType=VARCHAR})

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

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

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

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

文章链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: