MyBatis
MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。通过 XML 和注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中的动态参数进行映射生成最终执行的 Sql 语句,最后要 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。
MyBatis提供了普通 SQL 查询、事物、存储过程等功能。
优点
- 相比于 JDBC 需要编写的代码更少
- 使用灵活,支持动态 SQL
- 提供映射标签,支持对象与数据库的字段关系映射
缺点
- SQL 语句依赖数据库,移植性较差
- SQL 语句编写工作量大
MyBatis 执行流程
- 加载 Mapper 配置的 SQL映射文件或注解的相关SQL内容
- 创建会话工厂(提供读取配置文件的信息来构造出会话工厂)
- 创建会话(会话对象是一个接口,包含对数据的增删改查)
- 创建执行器
- 封装SQL对象
- 操作数据库
1.MyBatis 和 Hibernate 有哪些不同?
- 灵活性:MyBatis 更加灵活,自己手写 SQL语句
- 可移植性:每个数据库的 SQL 不同,移植性差
- 开发效率:Hibernate 对 SQL 语句做了封装,可直接使用,效率高
- 门槛:MyBatis 入门比较简单
2.“#” 和 “$” 有什么区别?
"#" 是预编译处理,通过#{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换
#{}可以接受简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中可以是value或其他名称
使用 "#" 时,MyBatis 会将SQL 中的参数替换成 "?"配合 PreparedStatement set 方法赋值,有效的防止 SQL 注入。
"$" 是字符串替换。通过${} 可以将 parameterType 传入的内容拼接在 SQL 中且不进行 jdbc 类型转换
${} 可以接受简单数据类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,#{} 括号中只能是 value
3.MyBatis 有几种分页方式?
逻辑分页:使用 MyBatis 自带的RowBounds 进行分页,一次性查询很多数据,并非全部。
物理分页:手写 SQL 分页或分页插件。
4.RowBounds 是 一次性查询全部结果吗?
不是,因为 MyBatis 是对 JDBC 的封装
在 JDBC 驱动中有一个 FetchSize 的配置,它规定了每次最多能查询多少数据倘若要查询更多数据,会在执行 next() 的时候,去查询更多的数据。
5.什么是动态 SQL?
可以根据不同的参数信息来动态拼接不确定的SQL叫做动态SQL(if、choose、when、otherwise、where、set、foreach)
6.如何设置延迟加载?
延迟加载:在 MyBatis-config.xml 设置 <setting name="lazyLoadingEnabled" value="true"/>
7.JDBC和 MyBatis编程的比较
JDBC | MyBatis | |
---|---|---|
系统性能 | 数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能 | 可在配置文件中数据连接池,使用连接池管理数据库连接 |
Sql 语句 | Sql 语句写在代码中造成代码不易维护,实际应用 Sql 变化的可能较大,Sql 变动需要改变 Java 代码 | 将 Sql 语句配置在映射文件中与 Java 代码相分离 |
传参数 | 向 Sql语句传参数麻烦,因为 Sql 语句的 where 条件不一定,可能多也可能少,占位数需要和参数对应 | MyBatis 自动将 Java 对象映射至 Sql 语句,通过 Statement 中的 parameterType 定义输入参数的类型 |
结果解析 | 对结果集解析麻烦,Sql 变化导致解析代码变化,且解析前需要遍历 | MyBatis自动将 Sql 执行结果映射至 Java 对象,通过 Statement 中的 resultType 定义输出结果的类型 |
8.MyBatis 配置文件详解
配置环境以及数据池的配置
映射文件中的参数涵义
namespace 属性:取值必须是持久层(Dao)接口的全限定类名
resultType 属性:用于指定结果集的类型
parameterType 属性:用于指定传入参数的类型
mappers 映射器
<mapper resource=""/>: 使用相对于类路径的资源 <mapper resource="com/hyx/dao/IUserDao.xml"/>
<mapper class=""/>: 使用 mapper 接口类路径 <mapper resource="com.hyx.dao.UserDao"/>
<package name=""/>: 注册指定包下的所有 mapper 接口 <package name="com.hyx.mapper"/>
谢谢观看,待更新…