mybatis第一章朱磊孔.docx
- 文档编号:5427183
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:38
- 大小:274.75KB
mybatis第一章朱磊孔.docx
《mybatis第一章朱磊孔.docx》由会员分享,可在线阅读,更多相关《mybatis第一章朱磊孔.docx(38页珍藏版)》请在冰豆网上搜索。
mybatis第一章朱磊孔
安博A+精英软件人才培养工程系列教材
基于mybatis开发持久层应用
(第三阶段)
版本历史
版本
完成日期
修改人
说明
目录
第1章MyBatis基础3
核心技能部分5
1.MyBatis的总体架构及运行原理5
1.1.1什么是mybatis5
1.1.2mybatis功能架构6
1.1.3mybatis框架架构7
1.2mybatis入门8
1.2.1mybatis的基本配置8
1.2.2使用mybatis的操作数据库21
本章总结26
任务实训部分27
1:
创建Students项目27
2:
实现学生信息查询27
3:
实现学生管理系统学生信息添加30
巩固练习32
第1章MyBatis基础
学习内容
ØMyBatis介绍
ØMyBatis总体架构
ØMyBatis的基本配置管理
ØMyBatis对基本数据库的操作
能力目标
Ø理解MyBatis的总体架构及运行原理
Ø掌握MyBatis的基本配置
Ø使用MyBatis实现增、删、改、查
本章简介
以前的学习我们熟悉了使用JDBC操作数据库数据;本章我们首先介绍mybatis相对于JDBC的使用带来的优势,然后介绍myBatis的总体架构及运行原理,最后采用Mybatis对数据库表Dept的CRUD操作作为综合案例,介绍在使用Mybatis开发数据库DAO层的步骤、关键点。
为以后学习ORM框架打下基础。
核心技能部分
我们先看看我们最熟悉也是最基础的通过JDBC查询数据库数据,一般需要以下七个步骤:
(1) 加载JDBC驱动
(2) 建立并获取数据库连接
(3) 创建 JDBCStatements 对象
(4) 设置SQL语句的传入参数
(5) 执行SQL语句并获得查询结果
(6) 对查询结果进行转换处理并将处理结果返回
(7) 释放相关资源(关闭Connection,关闭Statement,关闭ResultSet)
对于我们看到的这七个步骤,我们考虑一下:
哪些步骤能进行封装来简化我们开发的代码量与操作呢?
第一:
数据库连接频繁的开启和关闭本身就造成了资源的浪费,影响系统的性能。
第二:
使用JDBC进行操作数据库时,SQL语句基本都散落在各个JAVA类中,这样既不利于sql统一管理,同时可读性也比较差。
第三:
SQL语句的参数传递与参数映射,如果有个动态的生成SQL及其参数可装配的,那么我们就无需使用占位符来一一匹配。
第四:
我们经常见的查询基本上是返回一个ResultSet的集合,我们必须在链接释放之前对它进行操作,存放到我们的对象临时存储起来。
这步操作还得每次编写一大堆的java代码来实现。
第五:
由于我们将所有SQL语句都放到配置文件中,这个时候会遇到一个SQL重复的问题,几个功能的SQL语句其实都差不多,有些可能是SELECT后面那段不同、有些可能是WHERE语句不同。
有时候表结构改了,那么我们就需要改多个地方,不利于维护。
1.MyBatis的总体架构及运行原理
1.1.1什么是mybatis
mybatis是一种“半自动化"的ORM实现。
ORM:
对象关系映射(ObjectRelationalMapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
程序员往往只需定义好了POJO到数据库表的映射关系,即可通过ORM框架或者OJB提供的方法完成持久层操作,程序员甚至不需要对SQL的熟练掌握,ORM框架/OJB会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
ORM不能解决的问题:
1.系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条SelectSQL(或存储过程)以获取所需数据,具体的表结构不予公开。
2.开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(如:
工商银行、中国银行、交通银行,都在开发规范中严格指定)
3.系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标。
“半自动化"的Mybatis,却刚好解决了这个问题。
Mybatis的着力点,在于POJO与SQL之间的映射关系。
也就是说,Mybatis并不会为程序员在运行期自动生成SQL执行。
具体的SQL需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。
1.1.2mybatis功能架构
把Mybatis的功能架构分为三层:
1.API接口层:
提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。
接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2.数据处理层:
负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。
它主要的目的是根据调用的请求完成一次数据库操作。
3.基础支撑层:
负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。
为上层的数据处理层提供最基础的支撑。
1.1.3mybatis框架架构
1.加载配置:
配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
2.SQL解析:
当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
3.SQL执行:
将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果.
4.结果映射:
将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
1.2mybatis入门
1.2.1mybatis的基本配置
1.2.1.1使用mybatis构建JDBC的核心类
下载需要的jar包并部署到项目中,本书案例使用mybatis-3.1.1版本
SqlSessionFactory:
一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。
没有理由来处理或重新创建它。
使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。
SqlSessionFactoryBuilder:
构建SqlSessionFactory对象实现类。
这个类可以被实例化,使用和丢弃。
一旦你创建了SqlSessionFactory后,这个类就不需要存在了。
SqlSession:
每个线程都应该有它自己的SqlSession实例。
SqlSession的实例不能被共享,也是线程不安全的。
因此最佳的范围是请求或方法范围。
绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。
也绝不能将SqlSession实例的引用放在任何类型的管理范围中。
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象的build方法构建完成。
上图可以看出配置信息可以以三种形式提供给SqlSessionFactoryBuilder的build方法,分别是InputStream(字节流)、Reader(字符流)、Configuration(类)XML中构建SqlSessionFactory。
在本书中我们提供Reader方式构建SqlSessionFactory。
从XML文件中构建SqlSessionFactory的实例非常简单,也是最常见的构建方式。
这里建议你使用类路径下的资源文件来配置,但是你可以使用任意的Reader实例,这个实例包括由文字形式的文件路径或URL形式的文件路径file:
//来创建。
MyBatis包含了一些工具类,称作为资源,这些工具类包含一些方法,这些方法使得从类路径或其他位置加载资源文件更加简单。
Stringresource="mybatisConfig.xml";
Readerreader=Resources.getResourceAsReader(resource);
SqlSessionFactorysqlMapper=newSqlSessionFactoryBuilder().build(reader);
XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
关于XML配置文件的详细内容可以在文档后面找到,这里给出一个简单的示例:
mybatisConfig.xml文件内容
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN"
"http:
//mybatis.org/dtd/mybatis-3-config.dtd">
当然,在XML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分。
要注意XML头部的声明,需要用来验证XML文档正确性。
configuration 的配置属性解释:
属性
说明
properties
属性:
可以用来引用外部的属性文件进行配置
如:
settings
设置:
对mybatis的一些行为进行设置
typeAliases
类型命名:
为一类设置别名,方便书写
如:
typeHandlers
类型处理器:
是将Java类型与数据库中类型进行匹配,在statement设值和ResultSet检索值时可以正确的转换,可以实现TypeHandler接口实现自己的类型处理器
objectFactory
对象工厂:
每次创建新的结果对象是调用这个ObjectFactory的对象来进行创建,它会比直接调用构造函数创建对象做更多的工作
plugins
插件:
用来实现拦截器的功能,使用到了动态代理,可以指定在某些操作时执行一些拦截操作,比如在一条记录插入数据库之前写入一条日志,或查询一下权限等等
environments
环境:
对于一个应用可能连接多个数据库,那就需要配置不同的环境来连接不同的数据库,每一个SqlSessionFactory对应一个environments,也可以设置不同的环境应用于开发或测试的环境如果环境被忽略,那么默认环境将会被加载,也就是default="development"的作用了
mappers
映射器:
用来注册映射文件
environments 的配置属性解释:
属性
说明
environment
多数据源开发环境,可以配置多个,ID是唯一标识符
environment>transactionManager
设置事务的管理类型是type="[JDBC|MANAGED]"
JDBC:
使用datasource的连接来管理事物范围。
MANAGED:
自己不进行事物的提交和回滚,依靠容器来管理事物,设置closeConnection为false,取消自动关闭连接。
environment>dataSource
设置数据源[UNPOOLED|POOLED|JNDI]
UNPOOLED:
每次被请求时简单打开和关闭连接。
POOLED:
JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间。
JNDI– 这个数据源的实现是为了使用如Spring或应用服务器这类的容器,容器可以集中或在外部配置数据源,然后放置一个JNDI上下文的引用。
1.2.1.2从SqlSessionFactory中获取SqlSession
获取到SqlSessionFactory对象后,基于同样的启示,就可以获得SqlSession的实例了。
SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。
可以用SqlSession实例来直接执行已映射的SQL语句。
例如:
publicstaticvoidmain(Stringargs){
SqlSessionsession=sqlMapper.openSession();
try{
Deptdept=
session.selectOne("org.mybatis.example.dao.DeptMapper.selectOne",1);
}finally{
session.close();
}
}
这种方法能起到作用,在这里来探究一下到底执行了什么。
1.首先准备本次案例的数据表。
2.创建Dept的映射文件DeptMapper.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN"
"http:
//mybatis.org/dtd/mybatis-3-mapper.dtd">
resultType="org.mybatis.example.Dept"> select*fromdeptwheredeptno=#{id} 映射文件可以看出,根标签是mapper,在命名空间org.mybatis.example.dao.DeptMapper中,定义了一个名(ID)为: "selectOne"的映射语句,这样它就允许你使用完全限定名"org.mybatis.example.dao.DeptMapper.selectone"来调用映射语句,在示例中也这样写到 Deptdept=session.selectOne("org.mybatis.example.dao.DeptMapper.selectOne",1); 要注意这个使用完全限定名调用Java对象的方法是相似的,这样做是有原因的。 这个命名可以直接给相同命名空间下的的映射类,使用一个名称,参数和返回值和已映射的查询语句都一样的方法即可。 这就允许非常容易地调用映射器接口中的方法,这和前面看到的是一样的,下面这个示例中它又出现了。 创建org.mybatis.example.dao.DeptMapper.java的接口,其中方法与映射文件ID相同,那么就可以使用第二种方式执行映射查询语句。 publicinterfaceDeptMapper{ publicDeptselectOne(intid); } publicstaticvoidmain(Stringargs){ SqlSessionsession=sqlMapper.openSession(); try{ DeptMappermapper=session.getMapper(DeptMapper.class); Deptdept=mapper.selectOne (1); }finally{ session.close(); } } 相比来说,第一种方法更灵活,第二种方法更更简洁、更安全。 命名空间的一些注释: 命名空间在之前版本的MyBatis中是可选项,非常混乱也没有帮助。 现在,命名空间是必须的,而且有一个目的,它使用更长的完全限定名来隔离语句。 命名空间使得接口绑定成为可能,就像看到的那样。 使用命名空间,并将它放在合适的Java包空间之下,将会使代码变得简洁,在很长的时间内提高MyBatis的作用。 命名解析: 为了减少输入量,MyBatis对所有的命名配置元素使用如下的命名解析规则,包括语句,结果映射,缓存等。 l1、直接查找完全限定名(比如“org.mybatis.example.mapper.selectOne"),如果发现就使用。 l2、短名称(比如“selectOne")可以用来引用任意含糊的对象。 而如果有两个或两个以上的(比如“com.foo.selectAllThings"和“com.bar.selectAllThings"),那么就会得到错误报告,说短名称是含糊的,因此就必须使用完全限定名。 1.2.1.3SQL映射的XML文件 XML文件是相当的简单。 当然如果将它们和对等功能的JDBC代码来比较,会发现映射文件节省了大约95%的代码量。 MyBatis的构建就是聚焦于SQL的,使其远离于普通的方式。 SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): 名称 解释 cache 配置给定命名空间的缓存。 cache-ref 从其他命名空间引用缓存配置。 resultMap 最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象。 parameterMap 已经被废弃了! 老式风格的参数映射。 内联参数是首选,这个元素可能在将来被移除。 这里不会记录。 sql 可以重用的SQL块,也可以被其他语句引用。 insert 映射插入语句 update 映射更新语句 delete 映射删除语句 select 映射查询语句 1.2.1.4使用mybatis操作数据库的步骤 使用mybatis数据操作方式的步骤: 1.解析并读取mybatisconfig.xml文件 Stringresource="mybatisConfig.xml"; Readerreader=Resources.getResourceAsReader(resource); 使用Resources读取映射文件,映射文件路径可以是绝对路径与相对路径,本例使用相对路径,src目录下。 Resources读取后产生Reader输入流对象。 2.创建SqlSessionFactory SqlSessionFactorysqlMapper=newSqlSessionFactoryBuilder().build(reader); 一个SqlSessionFactory实例对应一个数据源,可由SqlSessionFactory中获得到SqlSession实例。 SqlSessionFactory包括以下特点: a.线程安全。 同一个实例能够被应用的多个线程共享。 b.重量级。 不能随意创建或销毁。 3.打开SqlSession SqlSessionsession=sqlMapper.openSession(); SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。 你可以用SqlSession实例来直接执行已映射的SQL语句。 4.数据库操作 DeptMappermapper=session.getMapper(DeptMapper.class); Deptdept=mapper.selectOne (1); 5.提交(回滚)事务 mit();(session.rollback();) 6.关闭SqlSession session.close(); select 查询语句是使用MyBatis时最常用的元素之一。 直到从数据库取出数据时才会发现将数据存在数据库中是多么的有价值,所以许多应用程序查询要比更改数据多的多。 对于每次插入,更新或删除,那也会有很多的查询。 这是MyBatis的一个基本原则,也是将重心和努力放到查询和结果映射的原因。 对简单类别的查询元素是非常简单的。 比如: select*fromdeptwheredeptno=#{id} 这个语句被称作selectDepts,使用一个int(或Integer)类型的参数,并返回一个Map类型的对象,其中的键是列名,值是列对应的值。 注意参数注释: #{id} 这就告诉MyBatis创建一个预处理语句参数。 使用JDBC,这样的一个参数在SQL中会由一个“? "来标识,并被传递到一个新的预处理语句中,就像这样: Stringselectsql="SELECT*FROMdeptWHEREdeptno=? "; PreparedStatementps=conn.prepareStatement(selectsql); ps.setInt(1,id); 当然,这需要很多单独的JDBC的代码来提取结果并将它们映射到对象实例中,这就是MyBatis节省你时间的地方。 我们需要深入了解参数和结果映射。 那些细节部分我们下面来了解。 select元素有很多属性允许
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mybatis 第一章 朱磊孔