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总线 机械特性...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...