Java EE轻量级框架应用实战:SSM框架(Spring MVC+Spring+MyBatis)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 MyBatis框架的入门程序

通过学习,相信读者对MyBatis框架已经有了初步了解,现在就通过一个用户模块的入门案例来讲解MyBatis框架的基本使用方法。

1.4.1 查询用户

在实际开发中通常会涉及单条数据的精确查询,以及多条数据的模糊查询。那么怎样使用MyBatis框架进行这两种查询呢?下面讲解使用MyBatis框架根据用户编号查询信息,以及根据用户名模糊查询信息的方法。

1.根据用户编号查询信息

根据用户编号查询信息主要是通过查询用户表中的主键(这里表示唯一的用户编号)来实现的,其具体实现步骤如下。

(1)在MySQL数据库中,利用已创建名为dsscm的数据库,并使用“tb_user”表。

(2)在MyEclipse中,创建一个名为“Ch01_02”的Java项目,将MyBatis的核心jar包、lib目录的依赖jar包,以及MySQL数据库的驱动jar包都添加到项目的lib目录中,并发布到类路径中。

(3)MyBatis默认使用log4j输出日志信息,故可在项目的resources目录中创建log4j.properties文件,并编辑其内容。

(4)在src目录中创建一个cn.dsscm.pojo包,并在该包下创建持久化类User,且声明相关属性及其对应的getter/setter方法,如示例2所示。

(5)在src目录中创建一个cn.dsscm.mapper包,并在该包中创建映射文件UserMapper.xml,编辑后见示例5。

img【示例5】 UserMapper.xml

img

在示例5中,第2~3行是MyBatis的约束配置,第4~9行是需要开发人员编写的映射信息,其中<mapper>元素是配置文件的根元素,它包含一个namespace属性,通常设置成“包名+SQL映射文件名”的形式。子元素<select>中的信息用于执行查询操作的配置,其id属性是<select>元素在映射文件中的唯一标识;parameterType属性用于指定传入参数的类型,这里表示传递给执行SQL的是一个Integer类型的参数;resultType属性用于指定返回结果的类型,这里表示返回的数据是Customer类型。在定义的查询SQL语句中,“#{}”表示一个占位符,相当于“?”,而“#{id}”则表示该占位符待接收参数的名称为id。

(6)在resources目录中创建MyBatis框架的核心配置文件mybatis-config.xml,编辑后如示例1所示。

(7)在src目录中创建一个cn.dsscm.test包,在该包中创建测试类UserTest.java,并在类中编写测试方法findUserByIdTest(),见示例6。

img【示例6】 UserTest.java

img

在示例6的findUserByIdTest()方法中,通过输入流读取配置文件后,根据配置文件构建SqlSessionFactory对象,然后通过SqlSessionFactory对象创建SqlSession对象,并使用SqlSession对象的selectOne()方法执行查询操作。selectOne()方法的第1个参数表示映射SQL的标识字符串,它由CustomerMapper.xml中<mapper>元素的namespace属性值+<select>元素的id属性值组成;第2个参数表示查询所需要的参数,这里查询的是用户表中id为1的用户,可使用输出语句查询结果信息。最后,程序执行完毕时关闭SqlSession。

至此,整个项目完成,其项目结构如图1.20所示。

使用JUnit4测试执行findUserByIdTest()方法后,控制台的输出结果如下所示。

img

从运行结果可以看出,使用MyBatis框架已成功查询出id为1的用户信息。

img

图1.20 项目结构

2.根据用户名模糊查询信息

了解使用MyBatis框架根据用户编号查询信息后,接着讲解根据用户名来模糊查询相关信息的方法。

模糊查询的实现非常简单,只需在映射文件中使用<select>元素编写相应的SQL语句,并通过SqlSession的查询方法执行该SQL即可,其具体实现步骤如下。

(1)在映射文件UserMapper.xml中,添加根据用户名模糊查询信息列表的SQL语句,具体实现代码见示例7。

img【示例7】 UserMapper.xml

img

与根据用户编号查询相比,上述配置代码中的属性id、parameterType和SQL语句都发生了相应的变化,其中SQL语句中的“${}”表示拼接的是SQL字符串,即可不加解释原样输出。“${value}”表示拼接的是简单类型参数。

img

在使用“${}”进行SQL字符串拼接时,无法防止SQL注入问题的发生,所以对上述映射文件UserMapper.xml中模糊查询的select语句进行修改,并使用MySQL的concat()函数进行字符串拼接,就可以实现模糊查询,同时又能防止SQL注入修改,代码如下所示。

img

(2)在测试类MybatisTest中,添加一个测试方法findCustomerByNameTest(),其代码见示例8。

img【示例8】 UserTest.java

img

从上述代码可以看出,findUserByNameTest()方法只是在第4步时与根据用户编号查询的测试方法有所不同,其他步骤都一致。在第4步时,由于查询出的是多条数据,所以调用SqlSession的selectList()方法来查询返回结果的集合对象,并使用for循环输出结果集对象。使用JUnit4执行findUserByNameTest()方法后,控制台输出的结果如下。

img

从控制台的输出结果可以看出,使用MyBatis框架已成功查询出用户表中用户名称带有“张”的两条用户信息。至此,查询功能就已经讲解完成。从上面两个查询方法中可以发现,MyBatis框架的操作大致可分为以下5个步骤。

(1)读取配置文件。

(2)根据配置文件构建SqlSessionFactory对象。

(3)通过SqlSessionFactory创建SqlSession对象。

(4)使用SqlSession对象操作数据库(包括查询、添加、修改、删除和提交事务等)。

(5)关闭SqlSession对象。

1.4.2 技能训练1

上机练习2 实现供应商表的查询

需求说明

(1)分别按下列条件查询订单表。

①供应商名称(模糊查询)。

②供应商(供应商id)。

(2)查询结果列显示:供应商信息。

1.4.3 添加用户

在MyBatis的映射文件中可通过<insert>元素来实现添加操作。如向数据库的tb_user表中插入一条数据,可以通过如下配置来实现,其代码见示例9。

img【示例9】 UserMapper.xml

img

在上述配置代码中,传入的参数是一个Customer类型,该类型的参数对象被传递到语句中时,#{username}会查找参数对象User的username属性(#{userCode}和#{userPassword}也是一样),并将其属性值传入SQL语句中。为了验证上述配置是否正确,可编写一个测试方法来执行添加操作。

在测试类UserTest.java中,添加测试方法addUserTest(),其代码见示例10。

img【示例10】 UserTest.java

img

在上述代码的第4步操作中,先创建User对象且添加属性值,然后使用SqlSession对象的insert()方法执行插入操作,并通过该操作返回的数据来判断插入操作是否能执行成功,最后通过SqlSesseion对象的commit()方法提交事务,并使用close()方法关闭SqlSession对象。

使用JUnit4执行addUserTest()方法后,控制台的输出结果如下:

img

从运行结果可以看到,已经成功插入了1条数据。为了验证是否真的插入成功,可查询数据库中的tb_user表,如图1.21所示。

img

图1.21 tb_user表1

可以看出,使用MyBatis框架已为15的用户成功新增了一条id信息。

1.4.4 更新用户

MyBatis框架的更新操作在映射文件中是通过配置<update>元素来实现的。如果需要更新用户数据,可以通过配置来实现,其代码见示例11。

img【示例11】 UserMapper.xml

img

与插入数据的配置相比,更新操作配置中的元素与SQL语句都发生了相应变化,但其属性名却没有变。为了验证配置是否正确,下面以1.4.3节中新插入的数据为例更新客户的测试。

在测试类MybatisTest中,添加测试方法updateUserTest(),并对id为15的信息进行修改,其代码见示例12。

img【示例12】 UserTest.java

img

与添加用户的方法相比,更新操作的代码增加了id属性值的设置,并调用SqlSession对象的update()方法,对id为15用户的信息进行修改。使用JUnit4执行updateUserTest()方法后,控制台的输出结果如下。

img

此时tb_user表中的数据如图1.22所示。

img

图1.22 tb_user表2

可以看出,使用MyBatis框架已经成功更新了id为15的用户信息。

1.4.5 删除用户

MyBatis框架的删除操作在映射文件中是通过配置<delete>元素来实现的。在映射文件UserMapper.xml中添加删除用户信息的SQL语句,其代码见示例13。

img【示例13】 UserMapper.xml

img

从上述配置的SQL语句中可以看出,只要传递一个id值就可以将数据表中相应的数据删除。测试删除操作使用SqlSession对象的delete()方法传入需要删除数据的id值即可。在测试类MyBatisTest中添加测试方法deleteUserTest(),该方法将用于id为15的用户信息删除,其代码见示例14。

img【示例14】 UserTest.java

img

使用JUnit4执行deleteUserTest()方法后,控制台的输出结果如下:

img

此时,再次查看表tb_user中的数据信息,如图1.23所示。

img

图1.23 tb_user表3

可以看出,使用MyBatis框架已经成功删除id为15的用户信息。

1.4.6 技能训练2

上机练习3 实现供应商表的查询

需求说明

在上机练习2的基础上,完成以下操作。

(1)实现供应商表的增加操作。

(2)实现根据供应商id修改供应商信息的操作。

(3)实现根据供应商id删除供应商信息的操作。

img

(1)增加和修改供应商。

使用元素insert和update。

parameterType:Java实体类Provider。

DAO层接口方法的返回类型:int。

(2)删除供应商。

使用delete元素。

至此,MyBatis入门程序的“增删改查”操作已经讲解完成。本章只需要了解所使用的元素即可,关于程序中映射文件和配置文件中的元素信息,将在第2章进行详细讲解。

img

createBy和creationDate、modifyDate和modifyBy这4个字段应根据方法的增加或修改进行灵活操作。

本章总结

➢ 框架是一个提供可重用公共结构的半成品。它为构建新的应用提供了极大的便利。

➢ 数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

➢ ORM即对象关系映射,也可以理解为一种数据持久化技术。

➢ MyBatis框架的基本要素包括核心对象、核心配置文件和SQL映射文件。

本章作业

—、选择题

1.下列关于MyBatis框架的优、缺点描述错误的是( )。

A.MyBatis框架简单,因此只能适用于简单查询

B.MyBatis框架是一个优秀的ORM框架,它在SQL语句和实体类之间建立了映射关系

C.使用MyBatis框架进行开发,需要开发人员编写SQL语句,且可移植性差

D.MyBatis框架方便维护,并可使用程序代码进行调试

2.数据库信息配置文件(database.properties)如下:

img

MyBatis框架的核心配置文件(mybatis-config.xml)的内容片段如下:

img

请补全下列空白处的代码( )。

A.①${driver} ②${url} ③${username} ④${password}

B.①${driverClass} ②${url} ③ $ {username} ④{password}

C.①${driverClass} ②${url} ③${user} ④${password}

D.①${com.mysql.jdbc.Driver} ②${jdbc:mysql ://127.0.0.1:3306/dsscm} ③${root} ④${1234}

3.有关MyBatis框架的删除操作说法错误的是( )。

A.MyBatis框架的删除操作在映射文件中是通过配置<delete>元素来实现的

B.MyBatis框架的删除操作也需要进行事务提交

C.MyBatis框架的删除操作执行SqlSession对象的delete()方法

D.MyBatis框架的删除操作和添加操作都需要封装整个实体类

4.关于MyBatis框架模糊查询进行SQL字符串拼接时,说法错误的是( )。

A.使用“${}”进行SQL字符串拼接时,无法防止SQL注入问题

B.可以使用MySQL框架中的concat()函数进行字符串拼接

C.使用MySQL框架的concat()函数进行字符串拼接,也无法防止SQL注入

D.使用MySQL框架的concat()函数进行字符串拼接,可导致数据库移植性变差

5.有关MyBatis框架的工作原理说法错误的是( )。

A.MyBatis框架的全局配置文件配置了MyBatis框架的运行环境等信息,其中主要内容是获取数据库连接

B.MyBatis框架映射文件配置了操作数据库的SQL语句,需要在MyBatis框架的全局配置文件中加载才能执行

C.可以通过MyBatis框架环境等配置信息构建会话SqlSession对象

D.SqlSession对象中包含执行SQL的所有方法

二、简答题

1.简述MyBatis框架的内容。

2.简述MyBatis框架的操作步骤。

3.简要介绍MyBatis框架的工作原理。

三、操作题

某机械设备管理系统的详细设计文档,如表1-2所示。

表1-2 机械设备表(device_info)

img

(1)编写SQL语句创建数据表,并为数据库添加如下备件信息,如表1-3所示。

表1-3 添加备件信息

img

(2)搭建MyBatis框架环境,编写对应POJO和SQL的映射文件,以及MyBatis框架的核心配置文件。

(3)实现机械设备表的“增删改查”操作。

(4)编写测试类,并在控制台中输出结果。