mybatis依赖_这大概就是公司一直用Mybatis的原因!真的太强了

01 什么是MyBatis、Spring?MyBatis是什么?

它是一个SQL Mapping框架,它是一个持久化技术框架。再说得简单一点,它只不过是一个操作数据库的框架。Spring是什么?Spring就是一个大容器,不管是IoC还是AOP,都是以Spring容器为基础的,因此,Spring不管整合什么框架,其关键都是利用Spring容器来管理其他框架的核心组件。那么MyBatis编程的核心组件是什么?就是以下三个

  • SqlSessionFactory
  • Mapper组件
  • SqlSession

02 Java EE应用后端各层组件

此外,Java EE应用的后端大致可分为如图所示的几层。

24c16223169e659473cba3947058ee26.png

Java EE应用后端分层

Java EE应用后端各层组件的大致功能如下。

DAO(Data Access Object)层:本层组件主要负责操作数据库,因此各种持久化技术(如MyBatis、JPA等)、索引技术(如Lucene、Solr等)主要集中在该层。

Service层:本层组件主要负责业务逻辑实现,该层组件向下依赖于DAO层的持久化功能,向上对控制器组件提供服务。

控制器层:本层组件主要负责分发、处理请求,该层组件向下依赖于Service层的业务逻辑功能。控制器组件既可对外提供RESTful API接口,也可直接与视图技术结合生成Web页面。

Spring框架是一个大容器,它的作用就是负责创建并管理容器中的所有DAO组件、Service组件、控制器组件等,并负责将DAO组件注入Service组件,将Service组件注入控制器组件。

MyBatis实现DAO组件的方式有两种

  • 传统的基于SqlSession实现DAO组件。
  • 使用Mapper组件充当DAO组件。

不管采用哪种方式,在整合Spring之后都会将DAO组件纳入Spring容器管理之下,并为DAO组件注入它所依赖的资源。比如基于SqlSession的DAO组件需要依赖SqlSession,而Mapper组件则需要依赖SqlSessionFactory—Spring会负责将SqlSessionFactory或SqlSession注入DAO组件。

此外,既然DAO组件和Service组件都在Spring容器管理之下,那么Spring容器也会将DAO组件注入Service组件。

归纳起来,在MyBatis整合Spring之后,Spring可为MyBatis完成如下事情。

  • Spring容器负责管理SqlSessionFactory。
  • Spring容器负责创建、管理Mapper组件或DAO组件。
  • Spring容器负责将Mapper组件或DAO组件注入Service组件。
  • Spring容器负责为Mapper组件或DAO组件注入所依赖的SqlSessionFactory或SqlSession。
  • Spring的AOP机制还可负责管理Service层的事务。

03 快速入门Spring与MyBatis的整合示例

在开始整合之前,需要先下载MyBatis与Spring整合的插件,该插件由MyBatis团队提供(不是由Spring提供的,MyBatis官网提供了一个MyBatis-Spring项目,该项目用于支持MyBatis与Spring的整合。

登录 链接9 站点下载MyBatis-Spring的最新版本,不要下载1.x系列的最新版本(1.x支持Spring 3.2及以上版本和Java 1.6及以上版本),要下载2.x系列(2.x支持Spring 5.0及以上版本和Java 1.8及以上版本),本书下载的是MyBatis-Spring 2.0.2,下载完成后得到一个mybatis-spring-2.0.2.jar文件,它就是MyBatis整合Spring的插件JAR包。

此外,既然要让Spring整合MyBatis,那么当然还需要为项目添加Spring的21个JAR包,以及MyBatis的核心JAR包:mybatis-3.5.2.jar。

接下来按照前面介绍的方式开发Mapper组件:Mapper接口+XML Mapper(或注解)。下面是Mapper接口的代码。

public interface BookMapper
{int saveBook(Book book);Book getBook(int id);
}

该Mapper组件对应的XML Mapper映射文件如下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.crazyit.app.dao.BookMapper"><insert id="saveBook">insert into book_inf values(null, #{title}, #{author}, #{price})</insert><select id="getBook" resultType="book">select book_id id, book_title title, book_author author,book_price price from book_inf where book_id=#{id}</select>
</mapper>

为了更好地模拟Java EE应用的架构,本示例也为应用提供了Service组件(接口+实现类)。下面是BookService接口的代码。

public interface BookService
{int saveBook(Book book);Book getBook(int id);
}

可能有读者感到疑惑:该Service组件内定义的两个方法与DAO组件内定义的两个方法是完全相同的吗?此时确实是这样的,这是由于本例只是一个演示技术的示例,它不涉及业务逻辑。

对于实际项目而言,Service组件的每个方法应该负责处理、实现一个业务逻辑功能,这个业务逻辑功能通常需要组合调用多个DAO组件的方法—具体来说,比如实现一个转账逻辑,该Service方法要调用DAO组件修改转出账户的余额,还要修改转入账户的余额,还要调用DAO组件插入一条转账记录。

总之,实现一个业务逻辑方法,通常需要按顺序调用多个DAO组件的方法。

本示例的Service组件很简单,它不涉及任何业务功能,因此它的每个方法只要调用一次DAO组件的方法即可。下面是该Service组件的实现类。

public class BookServiceImpl implements BookService
{private BookMapper bookMapper;//依赖注入Mapper组件所需的setter方法public void setBookMapper(BookMapper bookMapper){this.bookMapper = bookMapper;}@Overridepublic int saveBook(Book book) {return bookMapper.saveBook(book);}@Overridepublic Book getBook(int id) {return bookMapper.getBook(id);}
}

该Service组件定义了BookMapper变量代表它所依赖的DAO组件。为了让Spring容器为Service组件注入它所依赖的DAO组件,程序还为该DAO组件提供了setter方法—如果Service组件需要调用多个DAO组件的方法,就为每个DAO组件都定义对应的成员变量,并提供setter方法即可。至此,本示例的Mapper组件(DAO组件)和Service组件都已开发完成。

接下来需要将它们配置在Spring容器中,并让Spring容器来管理它们之间的依赖关系。下面是本示例的Spring配置文件。

<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="com.mysql.cj.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/spring?serverTimezone=UTC"
p:user="root"
p:password="32147"/>
<!-- 配置MyBatis的核心组件:SqlSessionFactory,并为该SqlSessionFactory配置它依赖的DataSource,还指定将类加载路径下的mybatis-config.xml文件作为MyBatis的核心配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatis-config.xml"/>
<!-- 使用MapperFactoryBean工厂Bean配置Mapper组件,并为该Mapper组件配置它所依赖的SqlSessionFactory -->
<bean id="bookMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"
p:mapperInterface="org.crazyit.app.dao.BookMapper"
p:sqlSessionFactory-ref="sqlSessionFactory"/>
<!-- 配置Service组件,并为该Service组件配置它所依赖的Mapper组件 -->
<bean id="bookService" class="org.crazyit.app.service.impl.BookServiceImpl"
p:bookMapper-ref="bookMapper"/>
</beans>

上面配置文件中一共配置了4个Bean,其中第一个Bean是一个基于C3P0的数据源Bean,这与前面配置的数据源Bean并没有任何区别。

第二个Bean是SqlSessionFactoryBean,它是一个工厂Bean,它负责配置MyBatis的核心组件:SqlSessionFactory。

配置SqlSessionFactory为它注入了两个属性:dataSource和configLocation,其中configLocation指定MyBatis的核心配置文件,本示例指定使用类加载路径下的mybatis-config.xml作为MyBatis的核心配置文件。该文件的代码如下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<!-- 为org.crazyit.app.domain包下的所有类指定别名 -->
<package name="org.crazyit.app.domain"/>
</typeAliases>
</configuration>

将该配置文件与MyBatis独立应用的mybatis-config.xml进行对比,可以看到该文件主要少了两个元素:<environments.../>和<mappers.../>—这是由于Spring已为SqlSessionFactory注入了dataSource(数据源),不再需要配置数据源环境。另外,Spring容器接管了Mapper组件的发现、注册,也就不需要在mybatis-config.xml文件中配置<mappers.../>元素了。

Spring配置文件中的第三个Bean是Mapper组件(DAO组件),此处使用MapperFactoryBean来配置Mapper组件—所有的Mapper组件都使用该工厂Bean配置,程序获取该Bean时,实际返回的只是该工厂Bean的产品。

在使用MapperFactoryBean工厂Bean配置Mapper组件时,需要通过mapperInterface指定该Mapper组件的接口,并通过sqlSessionFactory属性为Mapper组件注入它所依赖的SqlSessionFactory。

Spring配置文件中的第四个Bean是Service组件,它已经没有任何特别之处了,就是简单地配置该Service组件,并为它注入所依赖的Mapper组件。

接下来,主程序即可获取Spring容器中配置的Service组件,并调用它的业务方法。

上面程序通过Spring容器获取了Service组件,并调用了Service组件的方法—Service组件依赖于DAO组件(Mapper组件),而Mapper组件则由MyBatis实现,该程序运行完成后将会看到book_inf表多了一条记录,并看到程序显示了id为1的Book实体的title、price,这说明Spring与MyBatis整合成功。

public class SpringTest {
public static void main(String[] args) throws Exception {var ctx = new ClassPathXmlApplicationContext("beans.xml");// 获取容器中的Service组件var bookService = ctx.getBean("bookService", BookService.class);// 调用Service组件的方法bookService.saveBook(new Book(null, "疯狂Java讲义", "李刚", 109.0));var b = bookService.getBook(1);System.out.println(b.getTitle() + "-->" + b.getPrice());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php excelreader 中文,如何解决php excel reader导出excel中文乱码?

解决php excel reader导出excel中文乱码的方法&#xff1a;1、如果不使用dump函数&#xff0c;可以通过修改【_defaultEncoding】变量解决问题&#xff1b;2、如果使用dump函数导出excel&#xff0c;需要修改htmlentities函数解决。解决php excel reader导出excel中文乱码的方法…

python画同心圆程序_Python Turtle:使用circle()方法绘制同心圆

I am not at this point interested in an efficient way of producing concentric circles: I want to see what I have to do to get this way to work 为了解决OP的问题&#xff0c;对其原始代码进行更改以使其正常工作是很简单的&#xff1a;turtle_pos(trl, [trl.xcor() …

绕过宝塔禁止的php函数,宝塔disable functions函数全被禁命令执行+加域服务器如何无限制执行命令...

本地搭建实验环境时遇到了不少小问题实验环境2008 R2宝塔搭建的IIS discuz3.2X手动上传shell冰蝎连接(ps:有表哥使用冰蝎的时候提示文件存在但是无法获取密钥&#xff0c;解决办法&#xff0c;使用最新版本的冰蝎即可&#xff0c;具体详情看更新日志)连接上shell发现无法执行命…

anaconda和python区别_初学 Python 者自学 Anaconda 的正确姿势是什么?

事实上Anaconda 和 Jupyter notebook已成为数据分析的标准环境。 简单来说&#xff0c;Anaconda是包管理器和环境管理器&#xff0c;Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。 接下来我详细介绍下Anaconda&#xff0c;并在最后给出Jupyter …

oracle 24756,关于ORA-24756: transaction does not exist的问题

最近在检查一个数据库时&#xff0c;发现跟踪日志有大量的错误( ORA-24756: transaction does not exist)1、主机系统环境IBM P740#oslevel -s6100-06-05-11152、数据库版本11.2.0.3 RAC ASM两节点3、在数据库跟踪日志中出现大量错误。(alert文件太大无法上传&#xff0c;几乎…

python 函数 全局变量_python3函数内全局变量使用global

原博文 2017-08-16 23:08 −def p_num(): global num num 10 print (num) num 5 p_num() print(num) ... 相关推荐 2019-12-11 15:55 − 如果需要在函数内部改变函数外部的变量&#xff0c;就可以通过在函数内部声明变量为global变量。这样当程序运行至global变量便会替换外部…

java 切面_Java笔试面试精心整理得到89道Spring 核心知识【收藏向】

点击上方"蓝字"&#xff0c;关注了解更多Spring Framework 简称 Spring&#xff0c;是 Java 开发中最常用的框架&#xff0c;地位仅次于 Java API&#xff0c;就连近几年比较流行的微服务框架 SpringBoot&#xff0c;也是基于 Spring 实现的&#xff0c;SpringBoot 的…

经济学原理 下载 曼昆_2021南开经济学考研全年规划

先介绍一下本文的作者&#xff0c;本人本科来自于某双非财经类院校&#xff0c;于2019年考入南开大学某应用经济学专业&#xff0c;在2019年考研初始专业课826经济学基础&#xff08;也就是20年的823&#xff09;中拿到了138分的成绩&#xff0c;自认为对专业课的复习有一定心得…

excel中如何对矩阵得对角线进行求和_如何利用图卷积网络进行图形深度学习(第2部分)...

图上的机器学习是一项艰巨的任务&#xff0c;由于高度复杂但信息量丰富&#xff0c;本文是关于如何利用图卷积网络(GCN)进行深度学习的系列文章中的第二篇。我将简要回顾一下上一篇文章&#xff1a;图形卷积网络的高级介绍具有谱图卷积的半监督学习(本文)简要回顾一下在上一篇关…

linux 开放5222端口,ejabberd 安装配置

ejabberdejabberd是基于Jabber/XMPP协议的即时通讯服务器&#xff0c;由GPLv2授权(免费和开放源码)&#xff0c;采用Erlang/OTP开发。它的特点是&#xff0c;跨平台&#xff0c;容错&#xff0c;集群和模块化。ejabberd安装&#xff1a;1. 下载安装包&#xff1a;2.给权限&…

docker查找镜像_5 款非常好用的开源 Docker 工具,get一波~

本文同步Java知音社区&#xff0c;专注于Java作者&#xff1a;Shekhar Gulatihttp://dzone.com/articles/5-docker-utilities-you-should-know导读Docker 社区已经创建了许多开源工具&#xff0c;它们能帮我们处理各种用例。作者在本文中推荐了 5 款认为最有用的 Docker 工具&a…

else应输入一个语句是什么意思_Python学习基础篇 -4: Python中的转弯---分支语句

前言&#xff1a;本专栏以Python为主题&#xff0c;并尽可能保持每星期两到三更&#xff0c;直到将Python的基础知识浅析和讲解完毕&#xff0c;同时&#xff0c;有一定基础的同学可以移步 Python实战专栏 。背景&#xff1a;对于该系列文章的前三篇&#xff0c;自己读过的同学…

ofdm原理_OFDM技术简介

今日光电有趣、有料、有深度光电技术及科技资讯分享让整个世界变得温暖&#xff0c;他人因你的分享而变好&#xff01;欢迎分享有价值的东西&#xff01;今日光电因你而变&#xff0c;欢迎留言、分享...我们一起用科技光耀世界、温暖人间……OFDM技术作为4/5G物理层重要技术之一…

linux 内核被污染,导致Linux 4.20性能下降的STIBP已被Kernel 4.19系列内核移除

因为Linux Kernel 4.20默认启用了Spectre补丁STIBP&#xff0c;所以导致性能的下降&#xff0c;下降幅度甚至达到了50%&#xff0c;目前STIBP已经被移除&#xff0c;在最新发布的Linux Kernel 4.19.4、4.14.83内核当中已经移除了STIBP补丁。据称Linux Kernel 4.20就是启用了Spe…

a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

小编今天为大家讲解NSGA-II多目标优化算法&#xff0c;提到多目标优化&#xff0c;大家可能第一个就想到NSGA-II算法&#xff0c;今天小编就带领大家解开NSGA-II的神秘面纱。NSGA-II全称是快速非支配排序遗传算法&#xff0c;这个算法的精髓体现在“快速非支配排序”这7个字上&…

octobercms 执行php代码_PHP7语言执行原理

常用的高级语言有很多种&#xff0c;根据运行的方式不同&#xff0c;大体分为两种&#xff1a;编译型语言和解释型语言。编译是指在应用源程序执行之前&#xff0c;就将程序源代码“翻译”成汇编语言&#xff0c;然后进一步根据软硬件环境编译成目标文件。一般称完成编译工作的…

convert.todatetime指定日期格式_JDK1.8新增日期时间类型

如果我们可以跟别人说&#xff1a;“我们在1502643933071见面&#xff0c;别晚了&#xff01;”那么就再简单不过了。但是我们希望时间与昼夜和四季有关&#xff0c;于是事情就变复杂了。Java1.0中包含了一个Date类&#xff0c;但是它的大多数方法已经在Java 1.1引入Calendar类…

facebook对话链接_如何应用防错原则,看看 Facebook 和 Gmail 是怎么做的

欢迎来到有言有料&#xff0c;让思考更有张力本文共 3873 字&#xff0c;预计阅读 10 分钟作者&#xff5c;Siddharth Gulati译者&#xff5c;张聿彤本文翻译已获得作者的正式授权(授权截图如下)在用户界面(UI)设计中&#xff0c;重要的是要注意最细微的细节&#xff0c;以使用…

模拟灰度传感器循迹的程序_PLC编程,实例讲解西门子PLC模拟量编程

给大伙分享的是关于西门子S7-300PLC模拟量方面的实例&#xff0c;包含了以下几个方面的要点&#xff1a;1、对变送器进行取值&#xff0c;并进行控制2、对模数功能块 FC105 进行调用3、对 AI 模块进行设置4、对 AI 量程块进行选择这个实例&#xff0c; 调试的是一个流量调节回路…

作业调度C语言编写,【作业调度方案】 (C语言代码)

解题思路:如图所示&#xff0c;对于第一组样例输入&#xff0c;按照总工序提供的顺序&#xff0c;对于每个工件的工序从小到大&#xff0c;每次寻找有空闲机器的“空档”插入&#xff0c;就能让总加工时间最短。注意事项:按照约定&#xff0c;最短方案有且只有一种。参考代码:#…