请说说MyBatis的工作原理?#{}和${}的区别?Mybatis如何执行批量操作?

1、聊一聊mybatis缓存
Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。
一级缓存是指 SqlSession 级别的缓存,当在同一个
SqlSession 中进行相同的 SQL 语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存 1024 条
SQL。
二级缓存是指可以跨 SqlSession 的缓存。是 mapper 级别的缓存,对于 mapper 级别的缓存不同的 sqlsession 是可以共享的。
第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。

key:MapperID+offset+limit+Sql+所有的入参
value:用户信息
同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作(修改、添加、删除),本 sqlsession 中的
一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。

二级缓存的范围是mapper 级别(mapper同一个命名空间),mapper以命名空间为单位创建缓存数据结构,结构是 map。mybatis 的二
级缓存是通过 CacheExecutor 实现的。CacheExecutor 其实是 Executor 的代理对象。所有的查询操作,在 CacheExecutor 中都会先匹配
缓存中是否存在,不存在则查询数据库。
key:MapperID+offset+limit+Sql+所有的入参
具体使用需要配置:
Mybatis 全局配置中启用二级缓存配置
在对应的 Mapper.xml 中配置 cache 节点
在对应的 select 查询节点中添加 useCache=true
2、ORM是什么?
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数 据与简单Java对象(POJO)的映射关系的技术。简
单的说,ORM是通过使用描述对象和 数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

3、传统JDBC开发存在的问题?
频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。可以使用连接池 解决这个问题。但是使用jdbc需要自己实现连接
池。
sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大, 一旦发生变化,需要修改java代码,系统需要重
新编译,重新发布。不好维护。
使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一 定,可能多也可能少,修改sql还要修改代码,系
统不易维护。
结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方
4、 JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
(1)数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接 池可解决此问题。
解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。
(2)Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变 java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
(3)向sql语句传数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需 要和参数一一对应。
解决: Mybatis自动将java对象映射至sql语句
5、Mybatis优缺点
(1)优点

基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态 SQL语句,并可重用。
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接。
很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数 据库MyBatis都支持)
(2)缺点
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底 有一定要求。

SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
7、MyBatis执行步骤是什么样的?
创建SqlSessionFactory
通过SqlSessionFactory创建SqlSession
通过sqlsession执行数据库操作
调用session.commit()提交事务
调用session.close()关闭会话
8、请说说MyBatis的工作原理
读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信
息。
加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句, 需要在 MyBatis 配置文件 mybatis-config.xml 中
加载。mybatis-config.xml 文件可以加 载多个映射文件,每个文件对应数据库中的一张表。
构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所 有方法。
Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL
语句,同时负责查询缓存的维护。
MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于
存储要映射的 SQL 语句的 id、参数等信 息。
输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对
preparedStatement 对象设置参数的过 程。
输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型 和 POJO 类型。输出结果映射过程类似于 JDBC 对
结果集的解析过程。
9、#{}和KaTeX parse error: Expected 'EOF', got '#' at position 8: {}的区别? #̲{}是占位符,预编译处理;{}是拼接符,字符串替换,没有预编译处理。
Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用 PreparedStatement的set方法来赋值
Mybatis在处理时,是原值传入,就是把 {}时,是原值传入,就是把时,是原值传入,就是 把{}替换成变量的值,相当于JDBC中的Statement编译。
变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,KaTeX parse error: Expected 'EOF', got '#' at position 22: …变量不会加上 单引号 ‘’; #̲{} 可以有效的防止SQL注入…{} 不能防止SQL 注入;
#{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外;

12、如何获取生成的主键?
(1)对于支持主键自增的数据库(MySQL)

<insert id="insertUser" useGeneratedKeys="true" keyProperty="userId" >
insert into user(
	user_name, user_password, create_time)
values
	(#{userName}, #{userPassword} , #{createTime, jdbcType=TIMESTAMP})
</insert>

parameterType 可以不写,Mybatis可以推断出传入的数据类型。如果想要访问主键,那 么应当parameterType 应当是java实体或者
Map。这样数据在插入之后 可以通过java实体 或者Map 来获取主键值。通过 getUserId获取主键。
13、当实体类中的属性名和表中的字段名不一样 ,怎么办
(1)通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一 致。

select order_id id, order_no orderno ,order_price price form orders where order_id=#{id};

(2)通过来映射字段名和实体类属性名的一一对应的关系

select * from orders where order_id=#{id}


<!–用id属性来映射主键字段–>

<!–用result属性来映射非主键字段,property为实体类属性名,column为数据库表中的属性–>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值