任务2 搭建MyBatis环境
关键步骤如下。
➢ 下载需要的jar文件。
➢ 部署jar文件。
➢ 创建MyBatis核心配置文件configuration.xml。
➢ 创建持久化类(POJO)和SQL映射文件。
➢ 创建测试类。
1.2.1 什么是数据持久化
数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。例如,文件的存储、数据的读取等都是数据持久化操作。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。
结合以上的概念描述,我们思考一下,之前是否接触过数据持久化?是否做过数据持久化的操作?答案是肯定的。编写应用程序操作数据表,对数据表进行增删改查等操作,都是数据持久化操作。MyBatis和数据持久化之间有什么关系呢?带着这个问题来学习下面的内容。
1.2.2 MyBatis框架及ORM
1.MyBatis框架简介
MyBatis是一个开源的数据持久层框架。它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询、存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis作为持久层框架,其主要思想是将程序中的大量SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置。这样做能将SQL与程序代码分离,可以在不修改程序代码的情况下,直接在配置文件中修改SQL。
MyBatis的前身是iBatis,是Apache的一个开源项目,2010年这个项目由Apache Software Foundation迁移到了Google Code,并更名为MyBatis。2013年又迁移到Github。
MyBatis官网:http://mybatis.org。
Github:https://github.com/mybatis。
2.什么是ORM
持久化与ORM
对象/关系映射(Object/Relational Mapping, ORM)是一种数据持久化技术。它在对象模型和关系型数据库之间建立起对应关系,并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据,如图1.4所示。
图1.4 ORM映射关系
在实际开发中,程序员使用面向对象的技术操作数据,而当存储数据时,使用的却是关系型数据库,这样造成了很多不便。ORM在对象模型和关系数据库的表之间建立了一座桥梁,有了它,程序员就不需要再使用SQL语句操作数据库中的表,使用API直接操作JavaBean对象就可以实现数据的存储、查询、更改和删除等操作。MyBatis通过简单的XML或者注解进行配置和原始映射,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。
3.MyBatis是ORM解决方案
搭建MyBatis开发环境
基于ORM, MyBatis在对象模型和关系数据库的表之间建立了一座桥梁。通过MyBatis,可以建立SQL关系映射,便捷地实现数据存储、查询、更改和删除等操作。
1.2.3 搭建MyBatis环境
在MyEclipse中新建工程后,需做以下准备工作才可以使用MyBatis,如图1.5所示。
图1.5 MyBatis环境准备步骤
1.下载需要的jar文件
MyBatis的官网可以下载到最新发布版本的MyBatis,其他发布版本的MyBatis的jar文件也可以从官方网站下载。
提示
推荐下载mybatis-3.2.2.zip和mybatis-3-mybatis-3.2.2.zip(通过相应版本的“Source Code(zip)”链接下载)。
(1)mybatis-3.2.2.zip
mybatis-3.2.2.zip是MyBatis的jar文件,解压后的目录结构如图1.6所示。
图1.6 目录结构
注意查看根目录(mybatis-3.2.2)和lib目录。在根目录下存放着mybatis-3.2.2.jar和mybatis-3.2.2.pdf,后者为MyBatis官方使用手册。
lib目录下存放着编译依赖包,如图1.7所示。这些jar文件的作用如表1-1所示。
图1.7 MyBatis编译依赖包
表1-1 MyBatis编译依赖包中文件说明
(2)mybatis-3-mybatis-3.2.2.zip
mybatis-3-mybatis-3.2.2.zip是MyBatis的源码包,里面是MyBatis的所有源代码,解压后目录结构如图1.8所示。
图1.8 目录结构
2.部署jar文件
部署jar文件的具体操作步骤如下。
(1)将下载的mybatis-3.2.2.jar、mysql-connector-java-5.1.0-bin.ja(r MySQL数据库驱动jar文件)及log4j-1.2.17.jar(负责日志输出的jar文件)复制到建好的工程WEB-INF下的lib目录中。
(2)下面通过MyEclipse导入上述包。首先在MyEclipse中的工程上右击,选择“Build Path→Configure Build Path”选项,如图1.9所示。
图1.9 “Configure Build Path”选择界面
(3)在弹出的窗体中单击“Add JARs”按钮,如图1.10所示。
图1.10 “Add JARs”选用界面
(4)在弹出的“JAR Selection”窗体中选择lib下刚刚复制的jar文件,如图1.11所示。
图1.11 复制jar文件界面
(5)单击“OK”按钮,这时在工程中加入了所选的jar文件,如图1.12所示。
图1.12 导入支持的jar文件界面
为了更方便地学习MyBatis,可以在MyEclipse环境中设置当前工程中mybatis-3.2.2.jar的源码,具体步骤如下。
(1)选中mybatis-3.2.2.jar,单击右键弹出的快捷菜单如图1.13所示。
图1.13 右击mybatis-3.2.2.jar弹出的快捷菜单
(2)选择“Properties”选项,进入属性界面,选中“Java Source Attachment”选项,如图1.14所示。
图1.14 查看mybatis-3.2.2.jar的属性
(3)单击“External Folder”按钮,找到源码所在的目录,即/ mybatis-3-mybatis-3.2.2,如图1.15所示,选中目录后单击“确定”按钮即可。需要注意的是,若源码为jar文件,则单击“External File”按钮,找到源码所在的目录,选中jar文件即可,此处不再赘述。
图1.15 定位MyBatis源码所在目录
3.创建MyBatis核心配置文件configuration.xml
MyBatis核心配置文件主要用于配置数据库连接和MyBatis运行时所需的各种特性,包含了设置和影响MyBatis行为的属性。
为了方便管理以后各框架集成所需的配置文件,需在项目工程下新建Source Folder类型的resources目录,并在此目录下添加MyBatis的核心配置文件,默认文件名为“configuration.xml”。需要注意的是,为了在框架集成时更好地区分各个配置文件,我们一般将此文件命名为“mybatis-config.xml”。该文件需要配置数据库连接信息和MyBatis的参数,关键代码如示例1所示。
注意
MyBatis的示例和上机练习均使用超市订单管理系统,该系统使用MySQL数据库,在root用户下导入SQL脚本(smbms_db.sql)后,数据库为smbms,包括用户表、角色表、供应商表、订单表、地址信息表。在任务2最后的技能训练中会有超市订单管理系统的功能介绍。
如果没有特别说明,MyBatis的示例和上机练习都在测试类中运行,运行结果在控制台输出。
示例1
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <! -- 引入database.properties文件--> <properties resource="database.properties"/> <! -- 配置mybatis的log实现为LOG4J --> <settings> <setting name="logImpl" value="LOG4J" /> </settings> <! -- 配置mybatis多套运行环境 --> <environments default="development"> <environment id="development"> <! --配置事务管理,采用JDBC的事务管理 --> <transactionManager type="JDBC"></transactionManager> <! -- POOLED:mybatis自带的数据源,JNDI:基于tomcat的数据源 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <! -- 将mapper文件加入配置文件中 --> <mappers> <mapper resource="cn/smbms/dao/user/UserMapper.xml"/> </mappers> </configuration>
mybatis-config.xml文件中几个常用元素的作用如下。
(1)configuration:配置文件的根元素节点。
(2)properties:通过resource属性从外部指定properties属性文件(database. properties),该属性文件描述数据库连接的相关配置(数据库驱动、连接数据库的url、数据库用户名、数据库密码),其位置也是在/resources目录下。
(3)settings:设置MyBatis运行中的一些行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。
(4)environments:表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,该元素节点下可以配置多个environment子元素节点,但是必须指定其中一个为默认运行环境(通过default指定)。
(5)environment:配置MyBatis的一套运行环境,需指定运行环境ID、事务管理、数据源配置等相关信息。
(6)mappers:作用是告诉MyBatis去哪里找到SQL映射文件(该文件内容是开发者定义的映射SQL语句),整个项目中可以有一个或多个SQL映射文件。
(7)mapper:mappers的子元素节点,具体指定SQL映射文件的路径,其中resource属性的值表述了SQL映射文件的路径(类资源路径)。
编写MyBatis的核心配置文件
注意
mybatis-config.xml文件的元素节点是有一定顺序的,如果节点位置不按顺序排位,那么XML文件会报错。
完成了MyBatis的配置文件mybatis-config.xml的创建,接下来就要准备持久化类和SQL映射文件。
4.创建持久化类(POJO)和SQL映射文件
持久化类是指其实例状态需要被MyBatis持久化到数据库中的类。在应用的设计中,持久化类通常对应需求中的业务实体。MyBatis一般采用POJO(Plain Ordinary Java Object)编程模型来实现持久化类,与POJO类配合完成持久化工作是MyBatis最常见的工作模式。
POJO从字面上来讲就是普通Java对象。POJO类可以简单地理解为符合JavaBean规范的实体类,它不需要继承和实现任何特殊的Java基类或者接口。JavaBean对象的状态保存在属性中,访问属性必须通过对应的getter和setter方法。
下面首先以用户表(smbms_user)为例,定义用户POJO类。User.java的关键代码如示例2所示。
示例2
public class User { /* 字段 */ private Integer id; //id private String userCode; //用户编码 private String userName; //用户名称 private String userPassword; //用户密码 private Integer gender; //性别 private Date birthday; //出生日期 private String phone; //电话 private String address; //地址 private Integer userRole; //用户角色 private Integer createdBy; //创建者 private Date creationDate; //创建时间 private Integer modifyBy; //更新者 private Date modifyDate; //更新时间 //省略getter&setter方法 }
注意
在MyBatis中,不需要POJO类名与数据库表名一致,因为MyBatis是POJO与SQL语句之间的映射机制,一般情况下,保证POJO对象的属性与数据库表的字段名一致即可。
接下来,继续创建SQL映射文件,完成与POJO(实体类)的映射,该文件也是一个XML文件,名为UserMapper.xml,关键代码如示例3所示。
示例3
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.smbms.dao.user.UserMapper"> <! -- 查询用户表记录数 --> <select id="count" resultType="int"> select count(1) as count from smbms_user </select> </mapper>
经验
SQL映射文件一般都对应于相应的POJO,所以一般都是以POJO的名称+Mapper的规则来命名。当然该mapper文件属于DAO层的操作,应该放置在dao包下,并根据业务功能进行分包放置,如cn.smbms.dao.user.UserMapper. xml。
示例3中UserMapper.xml定义了SQL语句,其中各元素的含义如下。
➢ mapper:映射文件的根元素节点,只有一个属性namespace。
♦ namespace:用于区分不同的mapper,全局唯一。
➢ select:表示查询语句,是MyBatis最常用的元素之一,常用属性如下。
♦ id属性:该命名空间下唯一标识符。
♦ resultType属性:表示SQL语句返回值类型,此处通过SQL语句返回的是int数据类型。
5.创建测试类
在工程中加入JUnit4,创建测试类(UserMapperTest.java)进行功能测试,并在后台打印出用户表的记录数,具体的实现步骤如下。
(1)读取全局配置文件mybatis-config.xml,如以下代码所示:
String resource = "mybatis-config.xml"; // 获取mybatis-config.xml文件的输入流 InputStream is = Resources.getResourceAsStream(resource);
(2)创建SqlSessionFactory对象,此对象可以完成对配置文件的读取,如以下代码所示:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
(3)创建SqlSession对象,此对象的作用是调用mapper文件进行数据操作,必须先把mapper文件引入到mybatis-config.xml中才能生效,如以下代码所示:
int count = 0; SqlSession sqlSession = null; sqlSession = factory.openSession(); //MyBatis通过mapper文件的namespace和子元素的id来找到相应的SQL,从而执行查询操作 count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count"); logger.debug("UserMapperTest count---> " + count);
(4)关闭SqlSession对象,如以下代码所示:
sqlSession.close();
注意
本书所有的项目案例以及上机练习要求不再使用System.out.print进行后台日志的输出,一律使用log4j来实现日志的输出。这需要在resources目录下加入log4j.properties,并在MyBatis的核心配置文件(mybatis-config.xml)中设置MyBatis的LOG实现为log4j。
通过前面的学习,了解了MyBatis框架,学习了如何搭建MyBatis环境。接下来就根据上面的示例来对比JDBC,介绍一下MyBatis框架的优缺点。
1.2.4 MyBatis框架的优缺点及其适用场合
回顾DAO层代码,以查询用户表记录数为例,直接使用JDBC和MyBatis查询的两种实现方式的代码如图1.16所示。
图1.16 JDBC与MyBatis直观对比
用JDBC查询返回的是ResultSet对象,ResultSet往往不能直接使用,还需要转换成其他封装类型,因此通过JDBC查询并不能直接得到具体的业务对象,在整个查询的过程中就需要做很多重复性的转换工作,而使用MyBatis则可以将如下几行JDBC代码分解包装。
➢ 第1、2行:对数据库连接的管理,包括事务管理。
➢ 第3、4、5行:MyBatis通过配置文件来管理SQL以及输入参数的映射。
➢ 第6、7、8、9行:MyBatis获取返回结果到Java对象的映射,也通过配置文件管理。
1.MyBatis框架的优点
(1)与JDBC相比,减少了50%以上的代码量。
(2)MyBatis是最简单的持久化框架,小巧并且简单易学。
(3)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,既降低耦合度,又便于统一管理和优化,还可重用。
(4)提供XML标签,支持编写动态SQL语句。
(5)提供映射标签,支持对象与数据库的ORM字段关系映射。
2.MyBatis框架的缺点
(1)SQL语句的编写工作量较大,对开发人员编写SQL语句的功底有一定要求。
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
3.MyBatis框架适用场合
MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能要求很高的项目,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。
介绍完MyBatis框架的特点之后,接下来介绍超市订单管理系统,并完成相应的上机练习。
技能训练
超市订单管理系统是一个B/S架构的信息管理平台,该系统的主要业务需求包括:记录并维护某超市的供应商信息以及该超市与供应商之间的交易订单信息。包括三种角色:系统管理员、经理、普通员工。其主要结构如图1.17所示。
图1.17 超市订单管理系统
该系统使用MySQL数据库,请按图1.18所示的描述创建数据表。
图1.18 超市订单管理系统数据库表及表间关系
图1.18描述了超市订单管理系统中的五张表以及它们之间的关系,下面通过表1-2至表1-6对这五张表进行说明。
表1-2 用户表结构
表1-3 角色表结构
表1-4 供应商表结构
表1-5 订单表结构
表1-6 地址信息表结构
注意
数据表的字段命名按照Java的驼峰命名规则,这样在进行实体映射的时候,一是方便开发者的工作,二是使用MyBatis框架开发,也方便数据表字段与POJO的属性进行自动映射。
上机练习1——搭建MyBatis环境并实现对供应商表的总记录数的查询
需求说明
为超市订单管理系统搭建MyBatis环境,并实现对供应商表的总记录数的查询。
提示
(1)在MyEclipse中创建工程smbms,导入MyBatis所需的jar文件。
(2)创建MyBatis配置文件mybatis-config.xml。
(3)创建供应商表对应的实体类Provider和SQL映射文件ProviderMapper.xml。
(4)编写测试类ProvideMapperTest.java,后台运行输出结果。