MyBatis基础知识概述

一、依赖配置

添加依赖即可,jar包或pom依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version>
</dependency>

二、SqlSessionFactory

2.1 什么是SqlSessionFactory?

SqlSessionFactory是MyBatis的核心类,它是单个数据库映射关系经过编译后的内存镜像。主要功能是提供用于操作数据库的SqlSession。

2.2 构建SqlSessionFactory?

SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。

后者可以从一个xml配置文件(mybatis-config.xml文件)或预定制的Configuration实例中构建出SqlSessionFactory,每一个MyBatis应用都以一个SqlSessionFactory实例为核心,同时SqlSessionFactory也是线程安全的SqlSessionFactory一旦被创建,应该在应用执行期间都存在于内存中,应用运行期间不要重复创建多次,建议使用单例模式。

xml配置文件中包含了对mybatis系统的核心设置,包括获取数据库连接实例的数据源DataSource和决定事务作用域和控制方式的事务管理器TransactionManager。一个简单的mybatis-config.xml(未与spring整合)的例子如下:

<?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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

上面的配置信息是关键的部分。xml头部声明用来验证xml文档正确性。environment元素体中包含了事务管理和连接池的配置。mappers元素则是包含一组mapper映射器(这些mapper的xml文件包含了SQL代码和映射定义信息)

构建(如果使用像spring这样的框架,或者更高级一点的springboot,这些工作全都不用我们来做了,开箱即用):

SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);

三、SqlSession

3.1 什么是SqlSession?

SqlSession是MyBatis的关键对象,是持久化操作的独享,类似于jdbc中的Connection,它是应用程序与持久层之间执行交互操作的一个单线程对象。SqlSession对象包含全部的以数据库为背景的SQL操作方法,底层封装jdbc连接,可以用SqlSession实例来直接执行被映射的SQL语句。但是记住,SqlSession应该是线程私有的,因为它不具备线程安全性。

3.2 SqlSession的获取?

SqlSession的实例需要从SqlSessionFactory中获取。SqlSession涵盖了对数据库执行SQL命令所需的全部方法。

SqlSession session = sqlSessionFactory.openSession();// 通过SqlSessionFactory对象来获取
try {Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {session.close();
}

上面这种代码比较偏旧。现在有一种更直白的方式。使用对于给定语句能够合理描述参数和返回值的接口,现在不但可以执行更清晰的类型安全的代码,而且还不用担心易错的字符串字面量以及强制类型转换。例如:

SqlSession session = sqlSessionFactory.openSession();
try {BlogMapper mapper = session.getMapper(BlogMapper.class);Blog blog = mapper.selectBlog(101);
} finally {session.close();
}

四、探究已映射的SQL语句

一个查询的SQL,基于xml的映射语句的实例如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>

在一个xml映射文件中,定义多少个映射语句都是可以的。命名空间“org.mybatis.example.BlogMapper”定义了一个名为“selectBlog”的映射语句,这样它就允许你使用指定的完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。

这种使用全限定名调用映射语句的方式和通过全限定名调用Java对象的方法是相似的,这是因为mybatis通过这种方式可以直接映射到在命名空间中同名的Mapper类(实际上命名空间就是用于定义对应Mapper类的全限定名的),并将已映射的select语句中的名字、参数、返回值类型匹配成方法。这样就可以轻松的调用到位于Mapper接口中对应的同名方法。

使用如下的代码:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

更有优势,首先它不是基于字符串常量的,就会更安全;其次,对于已经映射的SQL语句,对于id = "selectBlog",IDE可以自动为我们补全方法或提示。

五、命名空间

命名空间(namespace)在之前版本的mybatis中是可选的,但是在目前版本的mybatis中是必须的

命名空间使得我们所见的接口绑定成为可能,出于长远考虑,使用命名空间,并将它置于合适的Java包命名空间之下,将拥有一份更加整洁的代码并提高mybatis的可用性。

5.1 命名解析

为了减少输入量,mybatis对所有的命名配置元素(包括语句,结果映射,缓存等)使用如下的命名解析规则。

1.全限定名(如“com.package.Mapper.selectAllThings”),将被直接查找并且找到即用。

2.短名称(如“selectAllThings”),如果全局唯一也可以作为一个单独的引用。如果不唯一,就会在使用时收到错误报告,提示短名称不是唯一的,这种情况下必须使用完全限定名。

六、基于注解的SQL映射

映射器类(Mapper class 实际上是一个仅仅包含一系列定义方法签名和返回值类型的interface)还有另一种不是用xml来映射SQL语句的方法————Java注解,如下所示:

package org.mybatis.example;
public interface BlogMapper {@Select("SELECT * FROM blog WHERE id = #{id}")Blog selectBlog(int id);
}

但是注解中的SQL语句毕竟限制性太强,稍微复杂一点的SQL语句会使得代码非常混乱,因此我们应当合理权衡注解和xml的SQL映射。

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

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

相关文章

Mybatis Plus————代码生成器

代码生成器 MyBatis Plus是MyBatis的扩展框架&#xff0c;而代码生成器是MP的核心功能之一&#xff0c;另外还有 “条件构造器”和“通用CRUD”等功能。 步骤演示 mp的代码生成器有两种方式自动生成代码&#xff0c;一种是通过main方法来执行程序&#xff0c;另一种是通过maven…

Spring MVC 流程图解析

Spring MVC 流程图解析Spring MVC工作流程图图一图二 SpringMVC工作流程描述DispatcherServlet&#xff0c;HandlerMapping&#xff0c;HandlerExecutionChain&#xff0c;HandlerAdapter&#xff0c;HttpMessageConveter&#xff0c;BindingResult&#xff0c;ModelAndView&am…

Java并发编程实战————可重入内置锁

引言 在《Java Concurrency in Practice》的加锁机制一节中作者提到&#xff1a; Java提供一种内置的锁机制来支持原子性&#xff1a;同步代码块。“重入”意味着获取锁的操作的粒度是“线程”&#xff0c;而不是调用。当某个线程请求一个由其他线程持有的锁时&#xff0c;发出…

java的守护进程与非守护进程

java的守护进程与非守护进程 最近重新研究Java基础知识&#xff0c;发现以前太多知识知识略略带过了&#xff0c;比较说Java的线程机制&#xff0c;在Java中有两类线程&#xff1a; User Thread(用户线程)、Daemon Thread(守护线程) &#xff0c;&#xff08;PS:以前忽略了&a…

双剑合璧————Spring Boot + Mybatis Plus

引言 最近在学习Mybatis Plus的使用&#xff0c;希望通过spring boot快速将mybatis plus整合进来。 对于springboot项目&#xff0c;mybatis plus团队也有自己的启动器 &#xff1a;mybatis-plus-boot-starter。这个依赖内部已经整合了mybatis-spring&#xff0c;也包括非快速…

Java中常用的类,包,接口

Java中常用的类&#xff0c;包&#xff0c;接口包名说明java.lang该包提供了Java编程的基础类&#xff0c;例如 Object、Math、String、StringBuffer、System、Thread等&#xff0c;不使用该包就很难编写Java代码了。java.util该包提供了包含集合框架、遗留的集合类、事件模型、…

Collection框架介绍

Collection&#xff1a;List列表&#xff0c;Set集&#xff0c; Map&#xff1a;Hashtable&#xff0c;HashMap&#xff0c;TreeMapCollection 是单列集合 List 元素是有序的、可重复 有序的 collection&#xff0c;可以对列表中每个元素的插入位置进行精确地控制。 可以根据…

Git初学札记(一)————Git简介与安装

前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。&#xff08;在这里再一次致敬Linus大神&#xff09;特点 分布式相比于集中式的最…

Hashtable、HashMap、TreeMap总结

Hashtable、HashMap、TreeMap总结三者均实现了Map接口&#xff0c;存储的内容是基于key-value的键值对映射&#xff0c;一个映射不能有重复的键&#xff0c;一个键最多只能映射一个值。 &#xff08;元顺初线&#xff09;&#xff08;1&#xff09; 元素特性HashTable中的key、…

Git初学札记(二)————EGit导入远程Git仓库项目(Clone操作)

引言 我们在实际开发项目的时候&#xff0c;难免要使用像Eclipse或者IDEA这样的继承开发工具&#xff0c;除了部分“牙牙学语”的程序员需要手动输入javac去编译程序以外&#xff0c;在实际开发中手动编译并运行项目的“猿族”应该是已经绝种了。 我个人认为&#xff0c;使用gi…

int和Integer的比较

int和Integer的比较1 int和IntegerJDK1.5引入了自动装箱与自动拆箱功能&#xff0c;Java可根据上下文&#xff0c;实现int/Integer,double/Double,boolean/Boolean等基本类型与相应对象之间的自动转换&#xff0c;为开发过程带来极大便利。最常用的是通过new方法构建Integer对象…

Git初学札记(三)————创建Git版本库

引言 版本库即所谓的Git仓库&#xff0c;英文名称是Repository&#xff0c;可以简单理解为一个目录&#xff08;.git folder&#xff09;&#xff0c;这个目录可以记录并保存直接父级及其子目录下的全部文本文件的修改操作&#xff0c;谓之“版本控制”&#xff01; 手动建库 不…

Git初学札记(四)————Git Push的常规操作与Pull冲突解决

目录 引言 Git命令行的远程Push EGit Push操作中的冲突问题 同步 工作区与本地库同步 工作区与远程库同步 图标 重点 引言 在团队开发当中&#xff0c;Git Push是多人协作环节中的最重要的一环可能没有之一。同SVN一样&#xff0c;push操作可以看做是对远端程序的提交…

一篇博客读懂设计模式之---动态代理与反射

一篇博客读懂设计模式之---动态代理与反射 先来讲一下反射&#xff1a; 1 关于反射反射最大的作用之一就在于我们可以不用在编译时就知道某个对象的类型&#xff0c;而在运行时通过提供完整的”包名类名.class”得到。注意&#xff1a;不是在编译时&#xff0c;而是在运行时。…

Git初学札记(五)————Branch分支管理

引言 正如之前的博客中提到的&#xff0c;Git区别于Svn的一个最明显的功能就是分支管理功能。 那么什么是分支&#xff1f;分支又能为我们的开发带来什么翻天覆地的变化呢&#xff1f;&#xff08;为了使博客的内容更具权威性和专业性&#xff0c;以下部分内容摘自官方文档《Gi…

多线程中 start()和run()方法的区别

多线程中 start&#xff08;&#xff09;和run&#xff08;&#xff09;方法的区别&#xff1a;Java线程一直是一个比较容易困扰的地方,首先&#xff0c;我们来认识下怎样生存线程。认识 Thread 和Runnablejava中实现多线程有两种途径&#xff1a;继承Thread类或者实现Runnabl…

Git初学札记(六)————在远程新建本地Branch与在本地新建远程Branch

引言 本篇博客介绍将现有的本地分支以新的分支形式推送到远程库中&#xff0c;和以新的分支的形式从远程库中拉取一个分支。这两个功能都是比较简单的操作&#xff0c;但是在实际开发中&#xff0c;可能会在开发初期有所触及。比如我们希望将远程的dev分支拉取到本地来进行开发…

Git初学札记(七)————合并分支(merge)

目录 引言 开始Merge 1、History视图 2、Team菜单 3、Git Repositories视图 巧用Git Staging视图 放弃Merging 可能的Merge结果 引言 Git鼓励开发者使用分支来进行程序的开发。但是最终只会有一个版本发行出去&#xff0c;因此&#xff0c;我们需要将开发好的分支merg…

公钥,私钥和数字签名这样理解轻松入门!

公钥&#xff0c;私钥和数字签名这样理解轻松入门&#xff01;参考博文&#xff1a;https://blog.csdn.net/21aspnet/article/details/7249401 &#xff08;公钥和私钥是成对出现的&#xff0c;可以把他们看成锁头和钥匙的关系&#xff0c;公钥为锁头&#xff0c;私钥是钥匙&am…

Spring Boot + JSP

目录 引言 Maven依赖 JSP页面 application.properties配置 controller 结果展示 引言 在尝试使用shiro的时候需要页面登录的加持&#xff0c;但是长期的前后端分离工作&#xff0c;导致页面的知识几乎忘光。突然想通过jsp这种简单的形式来学习其他的技术&#xff0c;作为…