30分钟入门MyBatis

举报
SUNSKY 发表于 2019/10/12 14:44:57 2019/10/12
【摘要】 当项目框架SSH(spring Struts hibernate)日落西山时,SSM(spring SpringMVC、MyBatis)就大行其道,大部分项目都渐渐转至SSM,因此mybatis也成了Java程序员的必学之术,本文就mybatis的语法做一次小小的总结,旨在让读者用最少的时间学会使用MyBatis。

本文旨在用最通俗的语言讲述最枯燥的基本知识

当项目框架SSH(spring Struts hibernate)日落西山时,SSM(spring SpringMVC、MyBatis)就大行其道,大部分项目都渐渐转至SSM,因此mybatis也成了Java程序员的必学之术,本文就mybatis的语法做一次小小的总结,旨在让读者用最少的时间学会使用MyBatis。

文章提纲: 1. 什么是MyBatis 2. MyBatis的引入 3. MyBatis的初始化配置 4. MyBatis的SQL语法 5. 运行原理和实操一波

1. 什么是MyBatis

MyBatis的前身是Apache的一个开源项目ibatis,后来迁移到Google code就改名为MyBatis。

用网上已经说烂了的话来说就是:

MyBatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

2. MyBatis的引入

1.0.png

3. MyBatis的配置和初始化

在引入mybatis之后,接下来需要学习的mybatis的配置,虽然现在流行的框架像springboot等已经不需要用XML方式进行配置,但作为一名新手,我们还是需要学习一些关于mybatis的配置的解释,这样有助于我们理解mybatis的原理。 mybatis的基本配置:

1.1.png

这是一个标准的mybatis的配置文件,很多情况下,这个配置已经,但是为了在以后的使用有更好的认识,下面讲解配置文件中configuration标签下的常用子标签:

  1. properties标签:用于定义一些通用属性,便于配置文件中使用

  2. settings标签:用于设置一些改变MyBatis运行时行为的配置

  3. environments标签:用于配置成适应多种环境

  4. mappers标签:用于mapper映射器的设置

下面分别对每个标签做简单讲解:

####1.properties标签

当我们需要把一些值作为一个变量被配置中使用时,就可以在properties标签下增加一个property标签,其中属性name是指变量名称,属性value是值,如:

1.2.png

定义好之后,就可以在配置文件中使用了,如:

1.3.png

####1.settings标签

settings标签中的每一个setting都是用于调整mybatis的运行行为,我们在需要使用其中某些setting时加入即可,其常用的配置以及各个setting的解释如下:

1.4.png

3. environments

environments是为了配置多环境数据源而生,在我们定义好了各种环境之后,只需要在代码中设置从哪个环境中加载数据源即可,或者修改environments标签中的default也可以达到切换环境的效果。 environments的基本配置如下:

1.5.png

当我们需要增加一个环境配置时,只需要复制粘贴一份environment,修改其中属性的值即可。

4.mappers

mappers标签实际上是用于高速mybatis从哪找到我们写好的SQL语句,也就是映射文件。当我们写好一个表对应的mapper.xml时,我们只需要在mappers下增加一个mapper即可。

mappers查找mapper的方式有多种:

1. 根据mapper.xml文件定位:

这些mapper.xml在resources中的某个文件夹xxx中,则用resource属性设置

1.6.png

2. 根据映射器接口实现类的完全限定类名:

当我们在这些mapper.xml设置好了namespace之后,我们可以通过映射器接口实现类的全路径类来设置,如在AMapper.xml设置namespace为com.xxx.dao.AMapper类之后,我们在这里可以使用class属性指定查找的mapper,但前提是: AMapper.xml和AMapper.java必须在同一个包下。

1.7.png

3. 包映射

有人会说,如果我们表有很多,这样一行一行的写不是很费劲吗,mybatis为了便于使用,提供了package的方式引入映射器,但前提 所有的mapper.xml和mapper.java必须在同一个包下。

1.8.png

4. URL映射:

如果你的mapper不在项目中,而是放到了其他文件内,mybatis提供了通过URL的方式引入mapper.xml。

1.9.png

5. MyBatis的SQL语法

在现有的框架下编写代码,多数情况下都不需要理会mybatis底层的东西,而大量的工作都集中在编写mapper文件上。因此学会在mybatis下编写SQL语句是非常有必要的,我们首先来看一个标准的mapper文件的格式:

1.10.png

可以看出,一个mapper文件的根结构是mapper标签开始,而mapper标签中的namespace有什么用呢?他应该怎么写?

我们知道,有一种编程思想叫做面向接口编程,就是把业务需求中具体逻辑实现和接口分开,对外只暴露接口,通过接口实现业务。而在业务需求变化时,仅需要修改实现类,而不需要变动现有的对接代码,降低对系统的影响。

而mybatis正是基于这样的思想,在namespace中指定该mapper对应的接口之后,不需要编写接口实现类,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句。

如:在com.xxx.dao中创建一个XxxMapper.java的接口,需要编写一根据用户查询用户信息的方法。

1.11.png

此时我们就可以在mapper.xml中设置namespace对应到上面的接口来:

1.12.png

而在具体的业务实现类中,则是这样使用的:

1.13.png

可以看出,从编写SQL语句到最终业务调用SQL语句的过程中,我们并没有给XxxMapper接口编写任何的实现类,这就是基于接口编程的思想,mybatis已经把这些事情都处理好了,我们只需要在namespace中把SQL映射文件和接口类对应起来,就可以使用了。

知道根节点mapper怎么设置之后,接下来我们需要学习如何在mapper节点里编写SQL语句,在mapper标签后,mybatis提供了很多语义化的标签以便于我们编写SQL语句和配置映射文件,下面是几个非常常用子标签:

1. select:用于编写查询语句的标签 2. update:用于编写update语句的标签 3. insert:用于编写insert语句的标签 4. delete:用于编写delete语句的标签 5. sql:编写语句块的标签,可被其它语句引用 6. resultMap:定义数据库结果和实体属性的映射关系

这些标签都是我们在编写SQL语句中的必备标签,下面一一描述他们的使用。

####1. select标签

在一个项目中,大部分功能都涉及到查询,因此mybatis也为select元素配备了非常多的属性,一下仅列出最常用的几个属性以及作用解释:

1.14.png

####2. update标签

1.15.png

####3. insert标签

1.16.png

####4. delete标签

1.17.png

####5. sql标签

SQL节点用来编写那些可以被重用的SQL代码段,当我们用SQL编写好一个代码段之后,就可以在其他语句使用。

我们都知道,在写满了SQL之后,如果要修改表名,是一件很痛苦的事情,因为表名都写到了SQL语句中了,但是在mybatis中,我们可以利用sql标签来定义好表名,如果在所有的SQL中引入这个代码块即可:

1.18.png

类似的用法还有非常多,比如把查询字段一致的可以用sql块统一定义,然后在需要的地方调用...需要我们在实际使用过程,灵活运用这些标签来减轻SQL的代码量和降低复杂度。

####6. resultMap标签

resultMap标签用于表示数据库查询结果和实体对象的映射关系,它是映射文件中中所复杂的一个标签,常用的属性有两个:

1.19.png

而它的子节点则就非常多了:

1.20.png

如查询要把查询结果的字段用驼峰的写法映射,可以定义一个resultMap,把对象和实体属性一一对应起来:

1.21.png

在SQL用就可以直接使用这个resultMap作为返回类型:

1.22.png

上面的例子只用到resultMap中最常用的两个子标签: <id>、<result>。还有很多其它的标签可以写成高级的resultMap,由于篇幅较长,而文章旨在入门,因此在此暂不对每个标签举例子解释,有兴趣的可以自行百度。

6. 运行原理和实操一波

看完一波语法之后,脑子处于似懂非懂的状态,好像都是在讲配置文件和mapper的使用。当我们学会了编写这些mapper之后,究竟应该怎么使用它? 到这里我们就不得不提一下mybatis的运行过程了,先了解几个mybatis提供的接口/类:

  1. SqlSessionFactoryBuilder : SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了Builder设计模式。

  2. SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式。

  3. SqlSession:执行SQL的接口

由于mybatis的运行原理非常复杂,远远不是30分钟能掌握的,因此在此只是概括为最大的四个过程:

  1. 加载配置创建SqlSessionFacotry

  2. 通过sqlSessionFactory获取SqlSession

  3. SqlSession查找和转化Mapper

  4. SqlSession执行mapper中的SQL语句

知道了运行流程之后,我们就可以实操一波了,虽然主流的开发框架都已经看不见这些东西了,但作者还是决定抛弃一切框架,只用maven构建一个空白项目进行实操:

  1. 在idea上创建一个maven项目,并且在pom中引入mybatis和mysql依赖

这个简单,不多描述。 其中pom中的依赖为:

1.23.png

  1. 在resources中创建一个名为mybatis-config.xml的配置文件,内容为:

1.24.png

  1. 创建表结构:

1.25.png

  1. 在java下创建User.java的实体类(注意:为了简化代码,getter和serter已经去掉,实操时自行补上):

1.26.png

  1. 在java下创建UserMapper.java的映射类:

1.27.png

  1. 在resources下创建mapper文件夹,在mapper下创建UserMapper的xml文件:

1.28.png

  1. 启动mybatis执行SQL

根据上面的运行流程,就可以编写一个测试类:

1.29.png

查看输出:

1.30.png

大功告成!有兴趣的读者可以根据上面的过程,编写属于自己的原生态mybatis的测试项目,如果有问题或者需要源码请关注公众号留言或加微信:sisi-ceo,我们一起来征服写代码这做大山~

本文转载自异步社区。

原文链接:https://www.epubit.com/articleDetails?id=Ned4f8925-7427-4f56-ab52-200d50395b6c



【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。