第1章 走进MyBatis
【本章内容】
1.MyBatis 简介
2.传统JDBC的问题
3.MyBatis示例程序
【能力目标】
1.能够搭建MyBatis运行环境
2.使用MyBatis添加数据
3.使用MyBatis修改数据
4.使用MyBatis查询数据
5.使用MyBatis删除数据
现在国内的软件公司在开发软件时都使用框架技术进行开发,因此框架技术是十分重要的。为更好地理解框架的概念,现在思考一个问题。
企业的HR —般让面试者按照企业的简历模板填写简历,这样做有哪些好处呢?
不用考虑布局、排版等问题,提高了简历制作效率;可专心将精力放在简历的内容上,使得简历质量更有保障;应聘者的简历结构统一,HR阅读简历会很方便,使用了简历模板,新手也可以做出很专业的简历。
如同制作简历一样,软件开发中的框架是一个应用程序的半成品,框架是成熟的、可复用的、不断升级的组件。框架已经帮我们实现了应用程序中的共性问题,我们只需要在框架上完成应用程序中的个性问题。使用框架,开发人员可以专心在业务逻辑的实现上,保证核心业务逻辑的开发质量。使用框架,使得程序开发结构统一、易于学习、易于维护。框架体现了前人的经验和智慧,可以帮助新手写出稳健、性能优良的高质量程序。
本书讲解时下流行的MyBatis框架、Spring框架、Spring MVC框架,这三个框架的整合用于开发Web应用程序,业界称这三个框架的组合为SSM框架。
1.1 什么是MyBatis
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO (Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis本是Apache的一个开源项目ffiatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis,实质上MyBatis对iBatis进行一些改进。
MyBatis通过XML 或注解的方式将要执行的各种statement (statement、preparedStatemnt、CallableStatement)配置起来,并通过Java对象和statement中的SQL进行映射生成*终执行的SQL语句,*后由MyBatis框架执行SQL并将结果映射成PO(persisent object)并返回。本书的案例是基于MyBatis 3.4.5版本基础上讲解的。
MyBatis中文官网网址是,官网提供了大量的学习资源,如图1.1所示。
图1.1 MyBatis官网学习资源
1.2 传统JDBC编程的问题
既然MyBatis是持久层框架,而传统的持久层是由JDBC实现的,那么我们就来分析传统JDBC存在哪些问题。传统JDBC程序是指直接使用JDBC组件操作数据库的程序,下面的代码展示了在Java应用程序开发中,使用传统JDBC程序开发操作数据库的代码。
public static void main(String[] args){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
try {
//加载数据库驱动
Class . forName (”com.mysql. jdbc. Driver");
//创建数据库连接对象
Connection = DriverManager,getConnection(njdbc:mysql://
localhost:3306/dbname","root","root");
//定义sql语句
String sql ="select * from userlnfo where username =?*;
//创建statement对象
preparedStatement = connection.prepareStatement(sql);
//设置SQL语句参数值
preparedStatement. set String (l,"林冲");
//执行SQL语句并获取结果
rs =preparedStatement.executeQuery ();
//解析查询结果集
while(rs.next 0){
System.out.println(rs.getString("idn);
System.out.println(rs.getString("username");
}
} catch (Exception e){
e.printStackTrace0;
}finally{
//释放资源
if(rs!=null){
try {
rs. close ();
} catch (SQLException e){
e.printStackTrace0;
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e){
e.printStackTrace0;
}
}
if(connection!=null){
try {
connection.close 0;
} catch (SQLException e){
e. printStackTrace ();
}
}
}
}
传统的JDBC编程步骤如下:
(1)加载数据库驱动;
(2)创建数据库连接对象;
(3)定义SQL语句;
(4)创建statement 对象;
(5)设置SQL语句参数值;
(6)执行SQL语句并获取结果;
(7)解析查询结果集;
(8)释放资源。
通过传统JDBC程序分析,发现如下问题:
(1)数据库连接对象的创建、释放频繁造成系统资源浪费,从而影响系统性能。
(2)SQL语句编写在Java代码中,这种硬编码造成代码不易维护,当SQL语句变动时需要修改Java源代码。
(3)使用PreparedStatement接口向占位符传参数存在硬编码。因为SQL语句的where条件中占位符的个数可能会变化,修改SQL还要修改Java源代码,系统不易维护。
(4)对结果集解析存在硬编码。SQL语句若发生变化会导致解析结果集的代码也要随之变化,系统不易维护。
1.3 MyBatis 架构
MyBatis是优秀的持久层框架,它能够解决JDBC编程中存在的问题。接下来先了解 MyBatis的架构,如图1.2所示。
图1.2是MyBatis的整体架构,从上至下依次的作用如下:
(l)SqlMapConfig.xml是配置文件,此文件作为MyBatis的全局配置文件,配置了MyBatis
的运行环境信息。
图1.2 MyBatis 架构
(2)mapper.xml是映射文件,在映射文件中配置了操作数据库的SQL语句。映射文件需要在配置文件SqlMapConfig.xml中加载。
(3)通过MyBatis环境配置信息构造SqlSessionFactory对象,SqlSessionFactory是会话工厂对象,用于创建SqlSession对象。
(4)SqlSession是会话对象,会话对象用于执行SQL语句。
(5)MyBatis底层自定义了Executor执行器接口来操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
(6)MappedStatement也是MyBatis的一个底层封装对象,它包装了 MyBatis配置信息及SQL映射信息等。mapper.xml文件中一个SQL语句对应一个Mapped Statement对象,SQL 语句的id就是Mapped Statement对象的id。
(7)输入参数映射。MappedStatement对象对SQL语句的输入参数进行映射,输入参数的类型包括HashMap、基本类型、POK)。Executor通过Mapped Statement在执行SQL语句前将输入的Java对象映射至SQL语句中。输入参数映射就是JDBC编程中对preparedStatement 设置参数。
(8)输出参数映射。MappedStatement对象对SQL语句的输出参数进行映射,输出参数的类型包括HashMap、基本类型、POJO。Executor通过Mapped Statement在执行SQL语句后将输出结果映射至Java对象中。输出结果映射过程相当于JDBC编程中对结果集的解析处理过程。
1.4 MyBatis示例程序
电子商务网站的功能包
1.4.1 需求描述
接下来以开发在线订购商品的电子商务网站为例讲解MyBatis。电子商务网站的功能包括用户管理、商品管理、订单管理。用户管理模块的具体业务包括:
(1)根据用户id查询用户;
(2)根据用户名模糊查询用户;
(3)添加用户;
(4)更新用户;
(5)删除用户。
1.4.2 表设计和数据初始化
根据电子商务网站的需求设计数据库。在MySQL数据库中创建数据库命名为eshop,在eshop数据库中创建用户表命名为userlnfo,创建商品表命名为goods,创建订单表命名为orders,创建订单明细表命名为orderDetail。表结构设计如图1.3所示。
图1.3 电子商务网站表结构设计
展开