版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MyBatis入门一 课程介绍l MyBatis概述()1 认识框架2 什么是ORM3 MyBatis的认识l MyBatis完成CRUD()1 MyBatis准备工作2 MyBatis核心配置文件的认识与设置3 对象与关系的映射(ORM)4 完成数据的CRUDl 工具类抽取()1 MyBatis的核心对象2 抽取MyBatis工具类3 抽取properties配置文件l MyBatis使用细节()1 添加时拿到返回的主键 2 查看MyBatis运行日志3 在Mybatis中为一个类取别名4 列名与属性名不对应的解决方案l 网页完成CRUD二 MyBatis概述MyBatis是一个ORM的数据
2、库持久化框架。很多同学一看这个概念,一定会想:什么是ORM?什么叫数据库持久化?什么又叫框架?好了,在正式讲MyBatis之前,咱们就先把ORM与框架的概念给大家讲一下。2.1 什么叫数据库持久化? 数据持久化就是将内存中的数据模型转换为存储模型。 常见的数据持久化有:磁盘持久化和数据库持久化。 数据库持久化是数据持久化的其中一种,就是把内存中的数据保存到数据库中。 Java中最简单的就是使用jdbc来完成数据库持久化:2.2 什么是框架带着问题来研究:什么是框架?框架从何而来?为什么使用框架?什么是框架框架(Framework)是一个框子指其约束性,也是一个架子指其支撑性。IT语境中的框架,
3、特指为解决一个开放性问题(而不是具体问题)而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展、安插更多的组成部分,从而更迅速和方便地构建完整的解决问题的方案。1)框架本身一般不完整到可以解决特定问题,但是可以帮助您快速解决特定问题; 没有框架所有的工作都从零开始做,有了框架,为我们提供了一定的功能,我们就可以在框 架的基础上开发,极大的解放了生产力。 不同的框架,是为了解决不同领域的问题。一定要为了解决问题才去学习框架。2)框架天生就是为扩展而设计的;3)框架里面可以为后续扩展的组件提供很多辅助性、支撑性的方便易用的实用工具(utilities),也就是说框架时常配套了一些帮助解
4、决某类问题的库(libraries)或工具(tools)。在java中就是一系列的jar包,其本质就是对jdk功能的扩展.约束性:针对解决特定问题的软件框架会首先定义问题的边界,进而将相关的软件组件约束在这个边界内,保持框架在解决问题方面上的内聚性。支撑性:框架本身是不解决什么问题的,但给了解决问题的相关组件一个插接、组合的底子,这个底子的科学性和易用性直接影响到在此之上进行进一步开发的科学性和方便性。多样性:当然某一领域框架会很多,每个人都可以抽取框架。这时候就会出现一些优秀实践,大家都拿来用框架从何而来?为什么要使用框架?最佳实践1、 实际上是无数程序员经历过无数次尝试之后,总结出来的处理
5、开发性问题的特定方法.2、 专门为某类开发性问题而设计并实现,开源出来让大家实践。最后被大家公认这个领域的最佳实践。 如果把程序员的自由发挥看作是一条通往成功的途径,最佳实践就是其中的最短路径,能极大的解放生产力.最佳实践三要素:可读性,可维护性,可拓展性.简单就是美:消除重复,化繁为简框架用起来真的比我们用底层的(原生的)简单嘛? 框架功能比底层的更加强大?2.3 什么是ORMORM:对象关系映射(Object Relational Mapping,简称ORM),是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术关系模型:一张二维表,由行(记录)和列(字段)来组成。ORM的概念OR
6、M 主要解决对象-关系的映射:对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。面向对象概念面向关系概念-类 表对象 表的行(记录)属性 表的列(字段)ORM的实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现
7、,程序员可以把对数据库的操作(insert,update,delete,select)转化为对对象的操作(保存对象、更新对象、删除对象、查询一个对象、查询集合对象)。这样操作的前提是对象-关系映射,可以采用元数据来描述对象-关系映射细节:元数据通常采用 XML 格式,并且存放在专门的对象-关系映射文件中。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。那怎么转换为数据库的操作呢 ? 当然像orm这样开发的经典的问题肯定有对应的框架了ORM框架的操作数据库关系的方式首先,通过jdbc也能实现对象实体和数据库关系的映射.那就是采用硬编码方式,为每一种可能的数据库访问操作提供
8、单独的方法。 也就是各种DAO(UserDAO DepartmentDAO等)。最大的缺点就是: 1、sql写在JAVA代码中改修改sql必须修改代码。 2、有很多重复性的操作(比如获取连接,释放资源等)Orm框架的操作数据库关系方式有很多种,常用的有两种: 1、Sql操作方式(对jdbc进行封装): 把SQL配置到配置文件中,通过不同SQL中完成对象实体和数据库关系相互转换的操作。(mybatis的实现方式) 完整操作: 直接映射的是对象实体和数据库关系映射。操作数据库关系,不用写SQL由框架自己生成。(hibenate实现方式) ORM框架工作原理1、 以一定的映射方式,把实体模型和数据库
9、关系的映射2、 ORM框架启动时加载这些映射和数据库配置文件3、 ORM通过对最原生jdbc的封装提供更加便利的操作API4、 Dao通过ORM提供的便捷API以对象的方式操作数据库关系。流行的ORM框架1.JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.2.Hibernate:目前最流行的ORM框架.设计灵巧,性能一般(自己去控制性能,非常不好控制),文档丰富.(完全操作方式)Hibernate是一个完整的ORM框架,我们不需要写一句SQL;3.MyBatis:本是apache的一个开源项目iBatis,提供的持久层框架包括SQL Maps和DAO,允许开发人员直接编
10、写SQL(更好灵活).(Sql操作方式)MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写SQL问题:以后工作是用Hibernate还是用MyBatis呢?面试题:ORM的认识?MyBatis与Hibernate的区别?上面有内容有认识与区别!大家先简单理解一下,以后学过Hibernate有了深刻的认识再来完善这一道面试题。2.4 MyBatis的认识再回到我们最初的认识:MyBatis是一个ORM的数据库持久化框架。咱们已经认识了ORM与框架,相信对于MyBatis的定义大家也有一个大致的了解了。现在,咱们再对MyBatis进行认识与总结。2.4.1 MyBatis的起源My
11、Batis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)2.4.2 MyBatis的介绍MyBatis 是一个支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和手工设置参数以及
12、结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。面试题:mybatis相较于jdbc的优点?1、 把sql语句从java代码中抽取出来,方便维护。并且修改sql时不用修改java代码2、 不用手动设置参数和对结果集的处理。准备步骤小贴士:1 导包 2 建表(product) 3 domain(Product)4 准备dao层(CRUD)5 测试(不是必需的)注意:我们要引哪些包?1 一定要引入驱动包(不要忘了)2 导入mybatis的核心包3 导
13、入mybatis的依赖包三 MyBatis完成CRUD3.1 操作前的准备工作创建一个java项目?略过 3.1.1 导入相应的jar包MyBatis是一个框架,咱们说了。在Java中框架就是一组Java类最后打成jar包。因此,不只是这个框架,以后咱们学习的所有框架。在使用前都要先导入相应 的jar包。在导入jar包之前,我们得先说一下,MyBatis是操作数据库的框架。咱们以前学JDBC的时候说过:要操作数据库,一定不要忘了导入相应的数据库驱动包。 注:驱动包就是各大数据库厂商根据JDBC规范实现的jar包(忘了的同学可以去看JDBC第一天的笔记)然后找到MyBatis(相关文件我们已经准
14、备好,大家也可以到网上进行自行下载),再导入MyBatis的核心包与依赖包。下图为我们使用MyBatis要导入的包:3.1.2 准备相应的表咱们对数据库进行操作,肯定需要准备表。这没啥好说的。现在直接引入我们准备好的表即可:3.1.3 准备相应的domain创建一个Product对象,和数据库的表对应注:类的名称和类型都和我们的product表相对应匹配public class Product privateLong id;/商品名称private String productName;/品牌private String brand;/供应商private String supplier;/零
15、售价private BigDecimal salePrice;/进价private BigDecimal costPrice;/折扣价private Double cutoff;/商品分类编号private Long dir_id; /提供getter与setter.3.1.3 product的dao层准备 注:dao层不清楚的同学请出门右转,JDBC第一天有相应的介绍/* * 商品的持久操作 * author Administrator */public interface IProductDAO /* * 添加一个商品 */void save(Product p);/* * 更新一个商品
16、*/void update(Product p);/* * 删除一个商品 */void delete(Long id);/* * 得到一个商品 */Product get(Long id);/* * 得到所有商品 */List findAll();3.1.4 来一个测试(非必需)写代码要测试,这是一个好习惯!3.2 MyBatis的入门与核心配置文件一切准备就绪。接下来就是开始使用MyBatis了。但是问题来了,怎么用呢?好了,拥有无比丰富的经验的我们,在经过dom4j与fileUpload组件的洗礼了。大家应该知道咱们马上要找文档了吧。不过MyBatis的文档与之前的文档可不一样。它直接提供
17、了一个pdf文件(相当于给了咱们一本书),虽然说我们很不愿意(其实心里偷着乐),但是也只能看着官方提供的书来进行学习了。不过这个文档似乎又是英文版!喔!NO!放心吧:早有好事的人把这个翻译成中文了,好了。又是我的名言:不要客气!好了,该文档虽然只有50多页,但是已经足够咱们学习了。咱们用MyBatis连接数据库,需要拿到一个对象做叫SqlSession(类似以前JDBC的Connection)而要拿到SqlSession,就需要拿到SqlSessionFactory对象先来入个门吧:入门开始,除了介绍什么是MyBatis之后,就在说一个核心对象:SqlSessionFactory,接下来,咱们
18、就是要想方设法拿到这个核心对象。那SqlSessionFactory对象怎么拿到:直接找到文档中的从 XML 中构建 SqlSessionFactory这一小节开始即可。从这一节中我们可以看出以下几个点:1 我们需要准备一个核心的xml文件 2 拿到SqlSessionFactory之前需要读取核心的xml配置文件 3 需要构造者(SqlSessionFactoryBuilder)来创建它好了,大概介绍完毕后,我们可以开始准备核心配置的xml文件了在资源文件夹下面创建一个文件,取名为mybatis-config.xml 以把文档中的配置拷备过来(先做了解测试,等功能可以用起来后,再自己去写这个
19、配置)下面是我对核心配置的一个简单介绍:我们需要准备几个东西需要一个环境environments environments 里面两个内容(transactionManager ,dataSource )dataSource : driver,url,username,password(连接数据库的最小单位) 核心文档已经搭建准备就绪,心里还有一点小激动。但是总是觉得,少了点什么? 是什么呢?请大家回顾与分析我们刚才学习的内容:MyBatis是一个ORM映射框架,请问ORM体现在哪?核心文件中有一个mappers,它指向了一个映射文件。映射文件在哪?不是说好的MyBatis要写SQL语句么?SQ
20、L语句又在哪里?一切的一切都会出现在我们的下一个章节:对象与关系的映射!敬请关注。现在直接写xml是没有提示了,在xml的约束中,咱们讲过,当有约束的时候,xml就会有提示。 提示:出门再拐 在xml那一章的schema与dtd约束 而现在咱们的约束是在网络上。在Eclipse中,我们可以找到相应的约束文件,然后配置到自己本地即可。3.3 对象与关系的映射(ORM)接下来,解决上一章的几个问题。直接找到我们文档中的探究已映射的SQL语句,在这里,我就可以看到一段xml(如下图),这个xml就是咱们需要的映射文件,它就可以体现出ORM,并且在这里面,也可以愉快的写sql语句了。在这里,我们可以看
21、懂一些配置的意思,但是也有一些东西不是很明白。在下面的实例中,我已经对每一句配置准备好了相应的解释:select * from product where id = #id 在上述文件中,希望大家注意几个规范: 我们的映射文件一般情况下是和它对应的domain实体类在同一个层级 这个映射文件的名称一般叫做 XxxMapper.xml (Xxx代表的是实体类名称) namespace的名称为了确定唯一性,请大家根据我的要求取名如我们有一个类:cn.itsource.domain.Product / cn.itsource.domain.Student那这里取名应该是:cn.itsource.do
22、main.ProductMapper /cn.itsource.domain.StudentMapper 除了MyBatis支持的类型,其它的类型都通通使用全限定名3.4 完成数据的CRUD核心文件有了,映射文件也有了。现在可以来完成咱们的CRUD了吧!但是应该从哪里开始好呢? 还记得咱们前面说过需要的核心对象SqlSessionFactory吧咱们说过,需要通过它去拿到一个SqlSession对象(相当于JDBC的连接)必需要有SqlSession这个对象,我们才可以去执行相应的Sql3.4.1 拿到SqlSession对象官方文档从XML 中构建 SqlSessionFactory这一章中
23、,除了配置的核心xml,在上面我们还可以看到几句代码(如下图),现在咱们就来详细分析一下这几句代码是什么意思: 我们简单解释一下上面的代码:读取核心文件,然后再通过SqlSessionFactoryBuilder构建者来创建一个SqlSessionFactory工厂。注:上面的sqlMapper其实是一个SqlSessionFactory工厂对象(它取名不是很直观)官方文档从SqlSessionFactory 中获取 SqlSession这一章中,我们可以看到代码(下图),然后再拿到SqlSession,并且在这里面,还附上了咱们怎么调用sql的代码。3.4.2 查询一条数据根据上面我们get
24、到的技能,使用MyBatis查询一条数据!大家要注意咱们传过去的参数,还有在SQL接收的参数!【课堂分析】传过去的变量名称和#里面的字符串名称不是一回事!讲到这里,咱们再对整个MyBatis的流程再进行一次分析。:我们需要核心文件(提供联系数据库的环境):需要映射文件(提供ORM与运行的SQL语句):拿到SqlSession对象,用于执行SQLMyBatis的执行流程我们已经清晰。在这里咱们先来研究一下日志的问题。因为当前用MyBatis框架来执行数据库的操作。在很多时候,MyBatis的功能到底是怎么完成的?我们还是要看到具体的执行的一些信息与它真正执行的Sql语句才可以确定。因此,把执行的
25、日志打出来,可以帮助咱们分析MyBatis的执行。先去MyBatis细节一章的查看MyBatis运行日志部分!3.4.3 查询所有数据3.4.4 添加一条数据注:添加的时候一定要记住提交事务(配置事务、表结构支持事务)添加数据的有时候咱们需要拿到当前数据的主键。咱们先移步到MyBatis细节一章的拿到返回主键部分!3.4.5 修改一条数据3.4.6 删除一条数据3.4.7 特别注意下面的点都很重要,是大家在使用MyBatis的时候经常出现的点。希望大家引起重视。出现问题的时候过来好好的来找。基本咱们使用MyBatis中出的错都在这里。使用框架的时候配置信息变多,在配置里写的都是字符串,而且经常
26、是要对应的。因为,这里希望大家要切记:写的时候细心,出现错误找字符串要耐心,1 主配置中未配置相应的mapper(当然,这个路径也可能写错)2 在代码中调用Sql的时候路径写错3 Sql写错,这个应该还好找4 当我们在配置文件中很多地方如果写错,即便是你还没有使用也可能会报错5 写Sql的标签不需要全部一致(如添加不一定必需使用insert),但是它的属性会不同6 在传入与返回参数时全限定名写错在开发的时候,要边做边测试。 在某一步出现错误后,删除新加的代码看有没有问题,如果删除部分代码后运行成功,就相应的可以缩小排错的范围。四 工具类的抽取对于MyBatis的工具类抽取,咱们直接使用枚举的单
27、例模式。注:几种单例模式的区别与使用(单例工具与静态工具的区别),大家可以去看基础加强那天的课程。但是在抽取之前,我们需要再详细的认识一下MyBatis的几个核心类:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession4.1 MyBatis三大核心对象1.1 SqlSessionFactoryBuilder建造者模式:我们最后拿到的这个对象是非常复杂的. 用这个建造者就它先为我们把这些复杂的代码完成. 这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactor
28、yBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好的方式是不需要保持它一直存在来保证所有XML解析资源,因为还有更重要的事情要做。 1.2 SqlSessionFactory 一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做
29、到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。 1.3 SqlSession每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSessio
30、n。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要, 为什么在这里我们要先说这三大核心对象呢,因为在我们必需要了解这三个对象的特性。才可以更好的根据这个特性来完成工具类代码。4.2 完成工具类4.3 抽取数据库信息配置文件现在咱们的关于数据库连接信息已经在配置文件(XML)中,但是更多时候,我们还是会把配置文件的信息放到perties中。(由于properties的结构简单,便于修改,而这个文件只放数据库的
31、连接信息也更好的体现了职责分离)。其实,在官方文档的核心文件配置,直接就是使用的推荐properties的方式只需要我们做如下修改即可: Dperties-db_driver=com.mysql.jdbc.Driverdb_url=jdbc:mysql:/test0303db_username=rootdb_password=admin这个名称加db_仅仅是为了防止以后有其它文件的key出现重名五 MyBatis的使用细节5.1 添加时拿到返回的主键注:若是忘了为什么要拿到主键。可以去看JDBC第二天的课程,那里咱们当时有详细的解释。insert into product (prod
32、uctName,dir_id,salePrice,supplier,brand,cutoff,costPrice)values (#productName,#dir_id,#salePrice,#supplier,#brand,#cutoff,#costPrice)主键就直接放到返回的对象里面5.2 查看MyBatis运行日志在使用MyBatis的很多时候,我们需要把日志打印出来,帮助我们进行分析与排错。特别是大家现在学习阶段,要求大家都MyBatis的日志打开。打开后我们可以看到执行的SQL语句,可以看到我们传递的参数。而MyBatis中打印日志使用的是Log4jLog4j简介:Log4j有
33、三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。要在项目中打开日志,大家在资源文件根目录下创建一个perties的文件,并把下面的代码拷备到里面。perties(日志文件:)log4j.rootLogger=ERROR, stdout#log4j.rootLogger=NONE.itsource=TRACElog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n注意:在上面的标红部分是我们需要修改的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省保定市莲池区2025-2026学年上学期期末八年级数学试卷(无答案)
- 北京市丰台区2025-2026学年高三上学期期末物理试卷(含答案)
- 2025-2026学年山西省太原市阳曲县龙城双语中学九年级(上)期末数学试卷(含答案)
- 五年级数学期末试卷及答案
- 初中数学介绍
- 关于万能学生检讨书合集5篇
- 兽医考试资格题库及答案
- 深圳辅警考试题目及答案
- 人力资源试题简答及答案
- 《GAT 543.25-2023公安数据元(25)》专题研究报告-新时代公安数据标准化的深度解码与实践前瞻
- 护理查房与病例讨论区别
- 土建资料管理课件
- 公司安全大讲堂活动方案
- GB/T 42186-2022医学检验生物样本冷链物流运作规范
- T/CA 105-2019手机壳套通用规范
- 重症胰腺炎的中医护理
- 部编版语文六年级上册第一单元综合素质测评B卷含答案
- 中央2025年全国妇联所属在京事业单位招聘93人笔试历年参考题库附带答案详解-1
- 2024-2025学年江苏省镇江市六年级语文上学期期末真题重组卷
- 学校空调设备维保方案
- 盘扣架施工技术交底记录
评论
0/150
提交评论