Java程序依靠Java数据库连接(Java Database Connectivity,JDBC)实现对数据库的操作,但是在大型企业项目中由于程序与数据库交互次数较多且读写数据量较大,仅仅使用传统JDBC操作数据库无法满足性能要求。同时,JDBC的使用也会带来代码冗余、复用性低等问题,因此,企业级开发中一般使用MyBatis等ORM框架操作数据库。下面将对MyBatis框架涉及的基础知识进行详细讲解。
JDBC是Java程序实现数据访问的基础,它提供了一套数据库操作API。JDBC实现数据库操作的步骤包括加载驱动、获取连接、获取执行者对象、发送SQL语句等,操作比较烦琐,并且传统的JDBC编程存在一定的局限性。JDBC的劣势主要有以下几个方面。
● 频繁地创建、释放数据库连接会造成系统资源浪费,从而影响系统性能。
● 代码中的SQL语句硬编码,会造成代码不易于维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要更改Java代码,违反了开闭原则。
● 使用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不确定,如果有修改SQL的需求,必须要修改代码,这样会导致系统难以维护。
● JDBC 对结果集解析存在硬编码(查询列名),SQL 变化导致解析代码变化,使得系统不易于维护。
由于JDBC编程存在上述缺陷,故企业中常使用ORM框架完成数据库的编程操作。常用的ORM框架有MyBatis和Hibernate,因为MyBatis容易掌握,而Hibernate学习门槛较高,所以本书主要针对MyBatis进行讲解。
MyBatis是一个支持普通SQL查询、存储及高级映射的持久层框架,它几乎消除了JDBC的冗余代码,无须手动设置参数和对结果集进行检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJO映射成数据库中的记录,使Java开发人员可以使用面向对象的编程思想来操作数据库。
MyBatis框架是一个ORM框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的数据表中。ORM框架的工作原理如图1-1所示。
图1-1 ORM框架的工作原理
从图1-1可以看出,使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(Persisent Object,PO),ORM框架会通过映射关系将这些面向对象的操作转换成底层的SQL操作。
MyBatis作为一个优秀的持久层框架,它对 JDBC 操作数据库的过程进行了封装,使开发者只需要关注SQL本身,而不需要花费精力去处理注册驱动、创建Connection对象、创建Statement对象、手动设置参数、结果集检索等JDBC繁杂的过程代码。
针对1.2.1节提到的JDBC编程的劣势,MyBatis提供了以下解决方案,具体如下。
问题一:频繁地创建、释放数据库连接会造成系统资源浪费,从而影响系统性能。
解决方案:在SqlMapConfig.xml中配置数据连接池,使用数据库连接池管理数据库连接。
问题二:代码中的SQL 语句硬编码,会造成代码不易于维护。在实际应用的开发中,SQL 变化的可能性较大。在传统JDBC编程中,SQL变动需要更改Java代码,违反了开闭原则。
解决方案:MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。
问题三:使用PreparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件不确定,如果有修改SQL的需求,必须要修改代码,这样会导致系统难以维护。
解决方案:MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。
问题四:JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,使得系统不易于维护。
解决方案:MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。