MyBatis
MyBatis 是一款优秀的ORM(对象关系映射)框架,可以通过对象和数据库之间的映射,将程序中的对象自动存储到数据库中。它内部封装了 JDBC ,使开发者只需要关注 SQL语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。通过 XML 和注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中的动态参数进行映射生成最终执行的 Sql 语句,最后要 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。
MyBatis提供了普通 SQL 查询、事物、存储过程等功能。
优点
- 相比于 JDBC 需要编写的代码更少
- 使用灵活,支持动态 SQL
- 提供映射标签,支持对象与数据库的字段关系映射
缺点
- SQL 语句依赖数据库,移植性较差
- SQL 语句编写工作量大
MyBatis 工作流程
工作流程旨在要完成MyBatis的初始化工作,具体的做法是
第一步要创建一个mybatis-config.xml文件,这个文件中包含了环境配置,全局设置项以及mapper声明这样的核心配置信息,这个mybatis-config.xml文件起到了一个全局配置作用;
SqlSessionFactoryBuilder --构建–》 SqlSessionFactory --构建–》SqlSession(保证全局唯一)
第二步是在我们程序运行的过程中,通过SqlSessionFactoryBuilder这个构建器对象来构建SqlSessionFactory,用于创建SqlSession对象,SqlSession必须保证全局唯一。通过这个SqlSessionFactory对象创建了对应的SqlSession,是我们对数据表进行增删改查的核心。
第三部对应的mapper.xml文件包含了大量的SQL语句,我们通过session来访问mapper.xml,进而来执行与之对应的增删查改SQL语句,那么对于写操作来说,执行完以后,千万不要忘记我们对事务及时进行commit的提交或者是rollback回滚,只有这样才能保证我们的数据被成功写入到数据库中。
最后通过session.close来关闭会话任务。
MyBatis数据查询步骤
创建实体类
创建Mapper XML
编写 SQL 标签
开启驼峰命名映射
新增
SQLSession执行select语句
resultType 指的是某个具体的对象
resultType=“com.*.students”:返回的是单表查询的对象或结果集
resultType=“java.util.Map”:返回的是多表查询的Map结果集
resultMap可以将查询结果映射为复杂类型的Java对象,适合于Java对象保存多表关联结果,支持对象关联查询
parameterType: 外侧要传入的参数的类型
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"/>
谢谢观看,待更新…