MyBatis框架在数据持久层中的应用研究

2023-03-06 11:46欧阳宏基葛萌程海波
微型电脑应用 2023年1期
关键词:配置文件语句代码

欧阳宏基, 葛萌, 程海波

(咸阳师范学院, 计算机学院, 陕西, 咸阳 712000)

0 引言

JDBC是JavaEE平台中用来访问关系型数据库的原生API[1],它存在若干缺点:频繁进行Connection对象的创建和销毁,影响数据库性能;将SQL语句硬编码到Java代码中,导致SQL语句的修改,要重新编译Java代码;将PreparedStatement对象中的占位符参数硬编码到Java代码中,不利于系统维护;从结果集遍历数据时,需要编写数据表字段与对象属性的映射逻辑。

针对上述缺点,本文提出基于MyBatis框架的数据库持久层设计方案。首先分析了MyBatis框架的核心组件与执行流程,阐述了MyBatis实现DAO的两种方案并分析了优缺点,结合目标考核管理系统持久层的部分业务逻辑详细描述了MyBatis的应用过程,为数据持久层的开发提供了一定的借鉴。

1 MyBatis概述

1.1 基本概念

MyBatis对JDBC 进行了二次封装,能够与第三方数据库连接池集成,实现Connection对象的复用[2]。MyBatis使开发人员将主要精力放在编写SQL语句上,通过映射方式,半自动化地生成持久化代码。通过输入映射自动完成向preparedStatement中输入参数,通过输出映射自动将结果集映射成Java对象[3],实现了Java代码与JDBC API的解耦。使得开发人员无须花精力去处理诸如注册驱动、创建Connection、创建Statement、手动设置参数、结果集检索等繁琐的操作。

1.2 核心组件

MyBatis的核心组件包括以下部分[4],结构如图1所示。

图1 MyBatis框架核心组件

(1) 核心配置文件:它是MyBatis的全局配置文件,主要完成数据源、事务处理、延迟加载、缓存和加载映射文件等配置。

(2) 映射文件(mapper.xml):定义操作数据库的SQL语句,实现输入映射和输出映射。

(3) SqlSessionFactory(会话工厂):根据配置文件由SqlSessionFactoryBuilder创建会话工厂,从而创建SqlSession对象。

(4) SqlSession:定义了一组数据库操作的API。

(5) Executor:它是SqlSession内部真正操作数据库的对象。根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。

(6) MappedStatement:对映射信息进行封装,用于存储要映射的SQL语句的id、参数等。

1.3 执行流程

MyBatis的执行流程如图2所示。首先通过流加载核心配置文件,然后将流对象注入SqlSessionFactoryBuilder对象用于创建SqlSessionFactory对象,从SqlSessionFactory 对象中获取SqlSession,利用SqlSession的selectOne()、selectList()、insert()、 update()、delete()等方法操作数据库,最后关闭SqlSession对象。

图2 MyBatis框架的执行流程

2 MyBatis框架开发数据持久层的方法

数据持久层在Java EE中主要用来为业务逻辑层提供访问数据源的接口,封装操作数据源的逻辑和相关API,完成实体对象与数据库表的映射。普遍采用DAO设计模式来封装数据持久层的代码[5]。所以,MyBatis框架完成数据持久层开发主要就是实现DAO,如图3所示。MyBatis提供了两种实现DAO的方式:一种是传统DAO的实现方式,需要编写DAO接口、DAO的实现类、实体类和映射文件,在DAO实现类中调用MyBatis的API操作数据库;另一种实现方式是采用动态代理技术自动生成DAO 实现类的对象,开发人员只需编写DAO接口、实体类和映射文件,不需要编写DAO的实现类,通过SqlSession的getMapper()方法就能自动生成DAO实现类的对象。相比传统DAO的实现方式,此方式无需编写调用MyBatis API操作数据库的代码,能够提高数据持久层的开发效率。

图3 MyBatis开发持久层示意图

3 在目标考核管理系统中的应用

3.1 系统简介

高等院校目标考核管理系统是在高校多职能部门的配合下采用信息化手段进行人力资源管理的一个应用软件[6]。其功能模块包括:基础数据维护、教工信息管理、指标管理、信息查询、系统维护等[7]。用户角色包括:教工、各职能部门管理员、系统管理员、校领导。系统基于MVC模式、采用Java EE分层架构模型[8-9],数据持久层利用MyBatis框架进行设计与开发。

3.2 核心配置文件的实现

定义mybatis-config.xml作为核心配置文件,利用C3P0数据库连接池作为数据源。首先通过〈properties〉标签的resource属性加载C3P0.properties文件,该文件定义了数据库驱动、URL、用户名、密码、数据库连接池配置参数等信息。然后通过〈environments〉标签定义数据源,通过OGNL表达式读取C3P0.properties文件中的值。采用JDBC的事务管理,由MyBatis控制事务。通过〈settings〉标签进行全局参数配置,包括延迟加载和二级缓存。通过〈typeAliases〉标签以批量方式为POJO类定义别名。最后通过〈mappers〉标签来加载映射文件。

3.3 Mapper接口的实现

采用动态代理生成DAO实现类的方式作为持久层的开发方法。首先要定义DAO接口(Mapper接口),其中定义与实体类或角色对应的持久化方法。目标考核系统持久层一共定义了TeacherMapper.java、PaperMapper.java、TaskDetailMapper. java等53个Mapper接口。以系统中校领导角色为例,对应的Mapper接口中与查询科研数据有关的部分源码如下:

public interface XLDMapper{

public List〈Papaer〉 findPaper(PaperDTO paperDTO) throws Exception;

public List〈Patent〉 findPatent(PatentDTO patentDTO) throws Exception;

…………

}

3.4 实体类的实现

定义实体类与数据库表进行映射,其中的属性包括两类:一类是与表字段一一对应的基本属性;另一类是在联合查询中定义所关联的对象或对象集合。方法包括设置和获取属性的setter和getter方法。目标考核系统中所包含的实体类有:UserInfo、Teacher、Department、Role、Permission、Paper、ScientificProject、Patent、Monograph、Student、IndexLevelOne、IndexLevelTwo、IndexLevelThree等53个。

3.5 映射文件的实现

相对于原生JDBC,MyBatis框架将SQL语句转移到映射文件中定义,实现了与Java代码的解耦合。因此,编写映射文件是使用MyBatis框架的核心内容。映射文件中主要定义与Mapper接口中方法一一对应的Statement,主要包括Statement ID、SQL语句、输入映射和输出映射。其中,〈insert〉、〈delete〉、〈update〉和〈select〉标签分别定义数据库的增、删、改和查询操作。输入映射定义对应SQL语句所需要的参数,输出映射定义SQL语句所返回的数据类型。MyBatis在执行数据库操作时会把Statement解析成一条具体的SQL,将输入映射类型中的数据替换SQL语句中的?占位符,将执行结果转换成输出映射对应的Java数据类型。

以XLDMapper.xml为例,它是XLDMapper.java接口对应的映射文件。其中,findPaper()方法的逻辑是按照年份、学院、职称等条件相组合来查询发表的论文数据。PapaerDTO表示论文信息的数据传输对象,是输入映射的POJO类型,该类封装了查询语句需要的参数信息,具体包括UserInfo实体类、Department实体类和年份。执行结果转换成Paper类型,它是论文信息的实体类。考虑到用户在页面所选查询条件的不同,需要根据不同查询条件来动态拼接SQL语句。

3.6 MyBatisUtil工具类的实现

持久层的Mapper接口和映射文件定义完成后需要在JUnit中进行单体测试,确保逻辑正确后才能供业务层组件调用。将MyBatis操作数据库的共性步骤封装到工具类中,这样可以避免冗余代码。定义MyBatisUtil工具类将加载配置文件、创建SqlSessionFactory、创建SqlSession、释放资源等操作进行封装,并且确保SqlSessionFactory是一个单例对象[10]。

4 总结

数据持久层在Java EE分层架构中占据着举足轻重的地位,稳定、高效的持久层开发方案一直是JavaEE应用开发的重点。本文提出了基于MyBatis框架的数据持久层应用开发方法,并成功应用到目标考核管理系统数据持久层的设计与实现中。MyBatis框架通过映射文件分离了Java代码与SQL语句,通过输入映射、输出映射以及DAO的动态生成等功能简化了代码编写量,提高了数据持久层的开发效率。

猜你喜欢
配置文件语句代码
重点:语句衔接
互不干涉混用Chromium Edge
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
创世代码
创世代码
创世代码
创世代码
为View桌面准备父虚拟机
如何搞定语句衔接题