Java面试之MyBatis

Mybatis

    • MyBatis是什么?
    • 对象关系映射
    • 传统JDBC开发存在的问题
    • JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
    • MyBatis的解析和运行原理
    • MyBatis的功能架构是怎样的
    • 映射器

MyBatis是什么?

MyBatis 是一款优秀的持久层框架,一个半 ORM(对象关系映射)框架,它支持定制化 SQL、存储过程以及高级映射	

对象关系映射

一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

传统JDBC开发存在的问题

1:频繁创建数据库连接对象、释放,容易造成系统资源浪费,影响系统性能。
	可以使用连接池解决这个问题。但是使用jdbc需要自己实现连接池。
2:sql语句定义、参数设置、结果集处理存在硬编码。实际项目中sql语句变化的可能性较大,一旦发生变化,
			需要修改java代码,系统需要重新编译,重新发布。不好维护。
3:使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,
			可能多也可能少,修改sql还要修改代码,系统不易维护。
4:结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便。

JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
	解决:在mybatis-config.xml中配置数据链接池,使用连接池管理数据库连接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
	解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
	解决: Mybatis自动将java对象映射至sql语句。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
	解决:Mybatis自动将sql执行结果映射至java对象。

MyBatis的解析和运行原理

1:MyBatis编程步骤是什么样的?
		1、 创建SqlSessionFactory
		2、 通过SqlSessionFactory创建SqlSession	
		3、 通过sqlsession执行数据库操作
		4、 调用session.commit()提交事务
		5、 调用session.close()关闭会话

2:MyBatis的工作原理
Java面试之MyBatis_第1张图片
1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

MyBatis的功能架构是怎样的

Java面试之MyBatis_第2张图片

映射器

1:#{}和${}的区别
		1:#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。		
		2:Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。			
		3:Mybatis在处理时 , 是 原 值 传 入 , 就 是 把 {}时,是原值传入,就是把时,是原值传入,就是把{}替换成变量的值,相当于JDBC中的Statement编译。			
		4:变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’。		
		5:#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入。
		6:#{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外。

你可能感兴趣的:(JAVA,java)