目录
为什么会出现mybatis、hibernate等来代替而不是直接使用JDBC?
什么是mybatis
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
为什么会出现mybatis、hibernate等来代替而不是直接使用JDBC?
那时候操作数据库是按照找个步骤写的:
- 注册驱动;
- 获取数据库连接;
- 拼接sql语句,设置sql参数;
- 执行sql语句;
- sql返回结果;
- 执行语句和数据库连接;
从上面可以看出来,我们每次都要做大量的相同的操作,并且还要对执行sql语句过程中所出现的各种异常和资源释放进行处理,而真正涉及到业务功能的代码其实很少,这明显影响了效率。
再有就是当你接收数据库返回的结果集的时候,需要赋值给程序中的实体,使用jdbc需要你手动写代码去遍历每一条记录赋值给对应的实体list集合中,使用 JDBC 意味着需要更多的代码来提取结果并将它们映射到对象实例中,
每当这时候都会有牛人出来,帮助大伙解决问题。这时候Hibernate和Mybatis(前身ibatis)变横空出世了。它们帮我们把哪些复杂的重复性的工作进行了抽象,从业务处理逻辑中剥离了,使得我们不需要再写这些我们不想写还非要写的代码。
一句话总结:因为MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 的真正强大在于它的映射语句
MyBatis 的真正强大在于它的映射语句,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 为聚焦于 SQL 而构建,以尽可能地为你减少麻烦。拿select举个例子
查询语句是 MyBatis 中最常用的元素之一,光能把数据存到数据库中价值并不大,只有还能重新取出来才有用,多数应用也都是查询比修改要频繁。对每个插入、更新或删除操作,通常间隔多个查询操作。这是 MyBatis 的基本原则之一,也是将焦点和努力放在查询和结果映射的原因。
结果映射
MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们不总都是这样。 如果能有一种完美的数据库映射模式,所有应用程序都可以使用它,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。
在简单的场景下,MyBatis 可以为你自动映射查询结果。但如果遇到复杂的场景,你需要构建一个结果映射。 也可以混合使用这两种策略。让我们深入了解一下自动映射是怎样工作的。
当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。
通常数据库列使用大写字母组成的单词命名,单词间用下划线分隔;而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase 设置为 true。
甚至在提供了结果映射后,自动映射也能工作。在这种情况下,对于每一个结果映射,在 ResultSet 出现的列,如果没有设置手动映射,将被自动映射。在自动映射处理完毕后,再处理手动映射。 在下面的例子中,id 和 userName 列将被自动映射,hashed_password 列将根据配置进行映射。
小结
关于原理及源码,后续再讲,敬请关注!