Mybatis系列-tkmybatis源码分析-01-mybatis、mybatis-spring和tkmybatis的关系

2024-06-19 18:32

本文主要是介绍Mybatis系列-tkmybatis源码分析-01-mybatis、mybatis-spring和tkmybatis的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mybatis、mybatis-spring和tkmybatis的关系

  • 定义

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

        MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 DataAccessException。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

        Tkmybatis 是基于 Mybatis 框架开发的一个工具,通过调用它提供的方法实现对单表的数据操作(相比于Mybatis-Spring默认操作更加丰富),不需要写任何 sql 语句,这极大地提高了项目开发效率。

        看了后面,再回过头来看定义就更清晰了。

 

  • jar包依赖关系

如图所示,

mapper-spring-boot-starter(tkmybatis基于springboot的依赖包)依赖于mybatis和mybatis-spring

 

mybatis-spring-boot-starter(mybatis-spring基于springboot的依赖包)依赖于mybatis和mybatis-spring

 

  • 使用方式

mybatis:从调用上来看,mybatis需要手动指定xml配置文件的位置,显示创建SqlSessionFactory,再根据SqlSessionFactory创建SqlSession,由SqlSession创建对应接口Mapper的代理类,然后执行SQL操作。从配置上来看,mybatis需要在xml配置文件中配置好数据源和mapper文件的路径。mapper接口的实现在对应名称的xml文件中。

调用部分示例代码:

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = factory.openSession();UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);List<Users> list = mapper.selectAll();list.forEach(item -> {log.info(item.toString());} );sqlSession.close();

xm配置部分代码:

<environments default="development"><environment id="development"><!--使用JDBC的事务管理机制,就是利用java.sql.Connection对象完成对事务的提交事务管理器完成以下工作:a、获得数据库连接 b、提交SQL c、事务回滚 d、关闭连接--><transactionManager type="JDBC" /><!--数据源配置--><dataSource type="UNPOOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://127.0.0.1:3306/foodie-shop?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;serverTimezone=GMT%2B8" /><property name="username" value="root" /><property name="password" value="123456" /></dataSource></environment></environments><mappers><!--通过mapper指定xml路径,mybatis根据该xml配置文件扫描mapper类,放到knownMappers里面,并且生成对应的mappedStatement所以,没有通过package指定mapper也没关系,mybatis可以通过xml解析出来mapper反之,只有package但是没有指定xml路径则是不行的,这样无法生成mappedStatement--><mapper resource="mapper/ItemsCommentsMapper.xml"/><!--package指定的是mapper类所在的包路径,mybatis会扫描路径下的mapper类,放到knownMappers里面去--><!--        <package name="com.example.demotkmybatisgenerator.mapper"/>--></mappers>

 

mybatis-spring:从调用上来看,mybatis-spring不再需要手动指定xml配置文件的位置,也不需要显示创建SqlSessionFactory这些。通过MapperScan注解指定mapper接口的包路径,即可自动扫描出对应的mapper接口并创建相应的代理类,该类由spring进行管理。代理类可以通过autowire注入到需要调用的位置。从配置上来看,mybatis-spring也不再需要xml配置文件,在application.properties进行配置。mapper接口的实现在对应名称的xml文件中或者是在接口上直接添加SQL注释(比如@select)。

调用部分示例代码:

@SpringBootApplication@MapperScan({"com.example.demotkmybatis.selfDefineMappers", "com.example.demonativemybatisgenerator.mapper"})public class DemoMybatisSpringApplication {public static void main(String[] args) {SpringApplication.run(DemoMybatisSpringApplication.class, args);}}

注入方式调用mapper:

@Servicepublic class UserService implements IUserService {@Autowiredprivate UsersMapper usersMapper;@Overridepublic List<Users> findAll() {return usersMapper.selectAll();}}

 

配置:

# datasource配置spring.datasource.driver_class_name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/foodie-shop?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8spring.datasource.username=rootspring.datasource.password=123456## mapper映射文件,配置xml位置接口,mapper类和pojo实体类的位置都可以通过xml文件找到,所以不用配置mybatis.mapper-locations=classpath*:mapper/*.xml## 所有POJO类所在包路径mybatis.type-aliases-package=com.example.demonativemybatisgenerator.pojo

 

tk-mybatis:和mybatis-spring比较相似,都通过application.properties文件完成属性配置,通过mapperscan扫描mapper所在包创建代理类。区别在于,tk-mybatis中mapper接口的实现不再是位于对应的xml文件或者是在接口上添加SQL注释,每一个mapper接口都指定了一个Provider实现类来完成具体的SQL操作。所以可以看到tk-mybatis的mapper接口及对应的xml是没有具体内容的,每个pojo对象对应的mapper接口都继承制Mapper<T>类(该类又继承了BaseMapper、ExampleMapper、RowBoundsMapper等接口),这些接口通过tk-mybatis自带的provider实现类提供了基本的增删查改、分页、条件查询等操作。相比于mybatis-spring,针对单表的操作更加丰富。由于底层基于mybatis和mybatis-spring,所以如果要自己扩展SQL的话,用xml或者是注解如@select的方式都可以。

调用部分示例代码:

@MapperScan("com.example.demotkmybatisgeneralsecond.mapper")public class DemoTkmybatisApplication {public static void main(String[] args) {SpringApplication.run(DemoTkmybatisApplication.class, args);}}

这篇关于Mybatis系列-tkmybatis源码分析-01-mybatis、mybatis-spring和tkmybatis的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075807

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java中注解与元数据示例详解

《Java中注解与元数据示例详解》Java注解和元数据是编程中重要的概念,用于描述程序元素的属性和用途,:本文主要介绍Java中注解与元数据的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参... 目录一、引言二、元数据的概念2.1 定义2.2 作用三、Java 注解的基础3.1 注解的定义3.2 内

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

JavaScript中的isTrusted属性及其应用场景详解

《JavaScript中的isTrusted属性及其应用场景详解》在现代Web开发中,JavaScript是构建交互式应用的核心语言,随着前端技术的不断发展,开发者需要处理越来越多的复杂场景,例如事件... 目录引言一、问题背景二、isTrusted 属性的来源与作用1. isTrusted 的定义2. 为

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

Java中Object类的常用方法小结

《Java中Object类的常用方法小结》JavaObject类是所有类的父类,位于java.lang包中,本文为大家整理了一些Object类的常用方法,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. public boolean equals(Object obj)2. public int ha

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机