MyBatis基本使用
一、简介
-
MyBatis 中文文档
https://mybatis.org/mybatis-3/zh/index.html
1.什么是 MyBatis
-
概述:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
-
源码地址:
https://github.com/mybatis/mybatis-3
- 源码下载

- MyBatis 前身是 iBatis

2.和 JDBC 对比
JDBC 缺点:
-
需要自己封装结果集
-
需要自己处理参数
-
没有共用性
-
SQL 写在 java 代码里面,耦合度很高
二、入门
1.引入依赖
引入 MyBatis 依赖
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency>
引入数据库驱动依赖
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version>
</dependency>
引入 junit 测试依赖(一般创建项目自带)
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
2.创建MyBatis 项目
创建mybatis 空项目,添加模块
3.创建 MyBatis 核心配置文件
3.1简单使用 MyBatis 核心配置
核心配置概述:XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
核心配置 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/>
<!-- 数据库环境--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments>
<!-- 映射文件--><mappers><mapper resource="cn/wjcoder/mapper/0.EmployeeMapper.xml"/></mappers>
</configuration>
4.创建 MyBatis 映射文件
4.1创建 xml 映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.wjcoder.mapper.EmployeeMapper"><select id="selectEmployee" resultType="cn.sycoder.domain.Employee">select * from Blog where id = #{id}</select>
</mapper>
4.2创建 mapper 接口
public interface EmployeeMapper {/*查询员工信息*/Employee selectEmployee(@Param("id") Long id);
}
4.3项目结构


5.准备数据库
5.1数据库名称 mybatis

5.2数据表 employee 并向里面添加两条数据
insert into employee(name,age,address) values('wj',18,'上海'),('zs',19,'北京')

6.从 XML 中构建 SqlSessionFactory
6.1获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
注意,创建mapper 目录的时候,一定要避免建成一个文件,要用斜杠不能用点

7.从 SqlSessionFactory 中获取 SqlSession
SqlSession:提供了执行 SQL 的所有方法
try (SqlSession session = sqlSessionFactory.openSession()) {//获取自定义的mapperEmployeeMapper mapper = session.getMapper(EmployeeMapper.class);//使用自定义mapper操作方法Employee employee = mapper.selectEmployee(1L);System.out.println(employee);
}
三、XML 配置
1.配置概述
1.配置概述
-
概述:MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息,层级结构如下
-
configuration(配置)
-
properties(属性)
-
settings(设置)
-
typeAliases(类型别名)
-
typeHandlers(类型处理器)
-
objectFactory(对象工厂)
-
plugins(插件)
-
environments(环境配置)
-
environment(环境变量)
-
transactionManager(事务管理器)
-
dataSource(数据源)
-
-
-
databaseIdProvider(数据库厂商标识)
-
mappers(映射器)
-
2.属性 properties
使用Properties:作用这些属性可以在外部进行配置,并可以进行动态替换
2.1db.properties 配置
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456
2.2先引入 db.properties 配置文件
<!--引入properties--><properties resource="db.properties"><!-- ... --><property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/><!-- 启用默认值特性 --></properties>
注意:要按顺序创建标签,否则会报错

2.3可以通过 ${} 去把配置文件中的值取出来
<dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>
启用默认值之后可以采用如下的方式配置
<dataSource type="POOLED"><property name="driver" value="${driver:com.mysql.cj.jdbc.Driver}"/> <!-- 如果 driver 空取后面值 --><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/>
</dataSource>
3.设置(settings)
作用:改变 MyBatis 的运行时行为
3.1常用设置
| 设置名 | 描述 | 有效值 | 默认值 |
|---|---|---|---|
| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 | true | false | true |
| lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType属性来覆盖该项的开关状态。 | true | false | false |
| mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 | true | false | False |
XML配置
<settings>
<!-- 设置数据库经典下划线命名方式转换成驼峰方式--><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
4.类型别名(typeAliases)
作用:类型别名可为 Java 类型设置一个缩写名字,它仅用于 XML 配置,意在降低冗余的全限定类名书写。
4.1使用全限定类名配置
<typeAliases>
<!-- type 类全限定类名-->
<!-- alias 表示别名--><typeAlias type="cn.wjcoder.domain.Employee" alias="emp"></typeAlias></typeAliases>
4.2使用包名方式
<typeAliases><package name="cn.sycoder.domain"/>
</typeAliases>
4.3使用注解方式
@Alias("author")
public class Author {...
}
4.4常见的 Java 类型内建的类型别名的规律
- 基本类型前面加下划线

- 引用数据类型使用首字母小写

5.环境配置(environments)
作用:可以获取多数据源,可以选用适合要求的数据源。开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。
注意:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境
代码操作
<environments default="test">
<!-- 开发环境--><environment id="development"><transactionManager type="JDBC"/>
<!-- 配置数据库连接要素--><dataSource type="POOLED"><property name="driver" value="${driver:com.mysql.cj.jdbc.Driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment>
<!-- 测试环境--><environment id="test"><transactionManager type="JDBC"/><!-- 配置数据库连接要素--><dataSource type="POOLED"><property name="driver" value="${driver:com.mysql.cj.jdbc.Driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
5.1事务管理器(transactionManager)
MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")。
- JDBC-这个配置直接使用了 JDBC 的提交和回滚功能,如果不需要自动提交,可以通过设置属性关掉
<transactionManager type="JDBC"><property name="skipSetAutoCommitOnClose" value="true"/>
</transactionManager>
- MANAGED – 这个配置几乎没做什么,不提交或回滚一个连接,默认情况下它会关闭连接,可以设置手动关闭
<transactionManager type="MANAGED"><property name="closeConnection" value="false"/>
</transactionManager>
5.2数据源(dataSource)
概述:dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
- 三种内建的数据源类型
-
UNPOOLED:不使用数据库连接池,每次操作数据库都需要获取连接
-
POOLED:使用数据库连接池,就是把建立的连接缓存起来,下次使用直接拿,不需要新建
-
poolMaximumActiveConnections-在任意时间可存在的活动(正在使用)连接数量,默认值:10 poolMaximumIdleConnections – 任意时间可能存在的空闲连接数。
-
-
JNDI:满足 EJB 或应用服务器这类容器中使用需求,可以调用上下文的数据源
6.映射器(mappers)
6.1作用:帮助MyBatis 寻找 sql 语句,寻找映射文件
6.2 配置方式:
- 使用相对于类路径的资源引用
<mappers><mapper resource="cn/wjcoder/mapper/EmployeeMapper.xml"/>
</mappers>
- 使用映射器接口实现类的完全限定类名
<mappers><mapper class="cn.wjcoder.mapper.EmployeeMapper"/>
</mappers>
- 将包内的映射器接口全部注册为映射器(使用这种必须保证 mapper.xml 和 mapper 文件在同一包下 )
<mappers><package name="cn.wjcoder.mapper"/>
</mappers>
四、日志
为什么现在开始使用日志?早学会早使用,方便观察sql的参数信息。
Mybatis 通过使用内置的日志工厂提供日志功能,具体的实现:
SLF4J, Apache Commons Logging,Log4j 2, Log4j (3.5.9 起废弃), JDK logging

使用前加上配置
<settings>...<setting name="logImpl" value="LOG4J"/>...</settings>
logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING
1.Log4j 配置示例
1.1导入依赖
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
1.2创建 log4j.properties
log4j.rootLogger=ERROR, stdoutlog4j.logger.cn.sycoder.mapper.EmployeeMapper=TRACElog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
1.3设置 mybatis-config.xml
<settings>
<!-- 设置数据库经典命名下划线方式字段转换成驼峰方式--><setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 配置日志--><setting name="logImpl" value="LOG4J"/>
</settings>
注意:忘记配置 setting 也能够自动装载,具体请看源码
ERROR WARN INFO DEBUG
五、使用MyBatis增删改查
1.添加操作
1.1添加接口方法
void insert(@Param("emp") Employee emp);
1.2添加xml 配置
<insert id="insert">insert into employee value(null,#{emp.name},#{emp.age},#{emp.address},#{emp.empDetail})
</insert>
2.删除
2.1添加接口方法
void delete(@Param("id")Long id);
2.2添加xml 配置
<delete id="delete">delete from employee where id = #{id}
</delete>
3.修改
3.1添加接口方法
void update(@Param("emp")Employee emp);
3.2添加xml 配置
<update id="update">update employee set name = #{emp.name} where id = #{emp.id}
</update>
4.查询
4.1添加接口方法
Employee selectEmployee(@Param("id") Long id);
4.2添加xml 配置
<select id="selectEmployee" resultType="cn.wjcoder.domain.Employee">select * from employee where id = #{id}
</select>
相关文章:
MyBatis基本使用
一、简介 MyBatis 中文文档 https://mybatis.org/mybatis-3/zh/index.html 1.什么是 MyBatis 概述:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBa…...
如何运行YOLOv6的代码实现目标识别?
YOLOv6是由美团视觉团队开发的1.环境配置我们先把YOLOv6的代码clone下来git clone https://github.com/meituan/YOLOv6.git安装一些必要的包pip install pycocotools2.0作者要求pytorch的版本是1.8.0,我的环境是1.7.0,也是可以正常运行的pip install -r requirement…...
新品BCM6755A1KFEBG/MT7921LE/MT7921AU WiFi芯片
博通在WiFi市场具有相当的实力。在WiFi6上有下面这几个解决方案:型号:BCM6755 BCM6755A1KFEBG类型:四核1.5GHz CPU封装:BGA批次:新BCM6755和BCM6750还是A7架构,更多的用在中低端型号上。BCM6755和BCM6750 C…...
析构函数、拷贝构造
1、析构函数析构函数的定义方式函数名和类名相同,在类名前加~,没有返回值类型,没有函数形参(不能重载)当对象生命周期结束的时候,系统会自动调用析构函数先调用析构函数,再释放对象的空间析构函…...
光学镜头是制作过程阶段理解
光学镜头是由多组镜片组合而成,它是摄影机投影一及显微镜上必不可少的部件。那么光学镜头是如何制造的呢?光学镜头的制作分为以下四个阶段:第一、首先将一大块光学玻璃用钻石锯片进行切片,然后用钻头在每一块玻璃切片上钻出多块冰…...
实验室设计|实验室设计要点SICOLAB
一、实验室设计规划要素1、实验室布局:实验室的布局要符合实验室工作流程,可以将实验室划分为干净区和污染区,以确保实验室的卫生和实验的准确性。2、设备选购:根据实验需要选择适当的设备,并确保设备的质量和性能符合…...
I.MX6ULL_Linux_系统篇(16) uboot分析-启动流程
原文链接:I.MX6ULL_系统篇(16) uboot分析-启动流程 – WSY Personal Blog (cpolar.cn) 前面我们详细的分析了 uboot 的顶层 Makefile,了解了 uboot 的编译流程。本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 …...
【C#】async关键字修饰后有无await的影响
文章目录测试总结拓展:js的async await问题参考测试 来自微软官网的说法: 异步方法通常包含 await 运算符的一个或多个匹配项,但缺少 await 表达式不会导致编译器错误。 如果异步方法未使用 await 运算符标记悬挂点,则该方法将作…...
Interspeech2022 | 一种基于元辅助学习的低资源口语语义理解方法
中国移动研究院首席科学家冯俊兰博士带领人工智能与智慧运营中心语音团队共同撰写的文章《Meta Auxiliary Learning for Low-resource Spoken Language Understanding》被语音国际顶会Interspeech2022接收。 关于Interspeech Interspeech 是国际最大且最全面关于言语科学与技…...
File类的用法和InputStream,OutputStream的用法
这里写自定义目录标题一、File类1.构造方法2.普通方法二、InputStream1.方法2.FileInputStream3.Scanner类的应用三、OutputStream1.方法2.FileOutputStream3.PrintWriter类的应用一、File类 1.构造方法 签名说明File(File parent, Stringchild)根据父目录 孩子文件路径&…...
Java多线程——Thread类的基本用法
一.线程的创建继承Thread类//继承Thread类class MyThread extends Thread{Overridepublic void run() {System.out.println("线程运行的代码");} } public class Demo1 {public static void main(String[] args) {MyThread t new MyThread();t.start();//启动线程&a…...
【C++】类和对象练习——日期类的实现
文章目录前言1. 日期的合法性判断2. 日期天数(/)2.1 和的重载2.2 对于两者复用的讨论3. 前置和后置重载4. 日期-天数(-/-)5. 前置- -和后置- -的重载6. 日期-日期7. 流插入<<重载8. 流提取>>重载9. 总结10. 源码展示前…...
[LeetCode周赛复盘] 第 333 场周赛20230219
[LeetCode周赛复盘] 第 333 场周赛20230219 一、本周周赛总结二、 [Easy] 6362. 合并两个二维数组 - 求和法1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6365. 将整数减少到零需要的最少操作数1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6364. 无平方子集计数1. 题目描…...
数字化时代,如何做好用户体验与应用性能管理
引言 随着数字化时代的到来,各个行业的应用系统从传统私有化部署逐渐转向公有云、行业云、微服务,这种变迁给运维部门和应用部门均带来了较大的挑战。基于当前企业 IT 运维均为多部门负责,且使用多种运维工具,因此,当…...
Python爬虫(7)selenium3种弹窗定位后点击操作,解决点击登录被隐藏iframe无法点击的登陆问题
之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Python爬虫(2)-Selenium控制浏览…...
如何对项目健康度进行测量?评估项目健康状况
项目驱动变革,大部分公司逐步由运营驱动转变为项目驱动,带来更多重新和商业价值。对组织而言,从商业角度看,项目旨在推动组织从一个状态转到另一个状态,从而达成特定目标。项目的健康情况如何关乎项目和变革的成本&…...
美国原装二手keysight E4980A(安捷伦)2MHZ LCR表
Agilent E4980A、Keysight E4980A、LCR 表,20 Hz - 2 MHz E4980A 是 Agilent 的 2 MHz LCR 表。LCR表是一种电子测试设备,用于测量电子元件的电感(L)、电容(C)和电阻(R)。LCR 表可…...
《clean coder》:关于摆烂,争论和心态
“凡是不能在五分钟之内解决的争论,都不能依靠辩论解决” ---- Kent Beck 作为一个码农,我并不是一个喜欢争论的角色。很长一段时间会陷入一种摆烂的,被动的状态。“既然其他人想要这么做,就这么办吧”。这可能是非专业的行为中最…...
jenkins下载与简单使用
1.jenkins下载 因为我仍然使用的是jdk1.8进行开发,所以我下载的是jenkins2.332.1版本(jenkins2.346.1版本在2022年末不再支持java8,如果项目使用的是jdk11可以继续使用该jenkins版本),更多版本下载请点击jenkins下载 …...
3|物联网控制|计算机控制-刘川来胡乃平版|第3章:计算机总线技术 补充串行总线部分|课堂笔记|ppt
2022年 10月 10日 3.3 外部总线 3.3.2 RS-232-C总线 机械特性...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
