MyBatis从入门到精通(一):MyBatis入门

article/2025/10/11 1:08:21

最近在读刘增辉老师所著的《MyBatis从入门到精通》一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸!

1. MyBatis简介

​ 2001年,Clinton Begin发起了一个名为iBATIS的开源项目,最初侧重于密码软件的研发,后来发展成为一款基于Java的持久层框架。

​ 2004年,Clinton将iBATIS的名字和源码捐赠给了Apache软件基金会。

​ 2010年,核心开发团队决定离开Apache软件基金会,并且将iBATIS改名为MyBatis。

​ MyBatis是一款优秀的支持自定义SQL查询、存储过程和高级映射的持久层框架,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用XML或注解进行配置和映射,MyBatis通过将参数映射到配置的SQL形成最终执行的SQL语句,最后将执行SQL的结果映射成Java对象返回。

​ 与其他的ORM(对象关系映射)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。

说明:以上内容了解下即可,因为按我的风格,特别不喜欢纯理论纯文字的东西,看过我以往博客的读者可能有这个意识,我更喜欢具体代码实战,比如如何使用一个新技术,某一段代码是为了解决什么问题……

2. 创建Maven项目

关于Maven的相关内容,大家可以参考我之前的博客Spring入门(四):使用Maven管理Spring项目。

我一直认为,理解一门技术最好的方式,是通过一个具体的例子,比如Hello World,哈哈。

所以,首先我们要新建个Maven项目,使用IDEA新建Maven项目的方法如下所示:

424537-20190628155058990-1931684847.png

424537-20190628155105481-1717309866.png

424537-20190628155112103-3781079.png

刚新建完的Maven项目结构如下所示:

424537-20190628155117612-971828331.png

默认生成的pom.xml文件的内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zwwhnly</groupId><artifactId>mybatis-action</artifactId><version>1.0-SNAPSHOT</version></project>

424537-20190628160902978-533516141.png

首先,我们设置源代码的编码方式为UTF-8:

<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

接着,设置编译源代码的JDK版本,这里暂时用1.6,可根据自己的实际需要修改,比如修改成1.8:

<build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins>
</build>

然后,添加重要的MyBatis的依赖坐标和mysql驱动的依赖坐标:

<dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency></dependencies>

最后,添加下用到的Log4j、JUnit的依赖坐标,最终的pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zwwhnly</groupId><artifactId>mybatis-action</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.6</source><target>1.6</target></configuration></plugin></plugins></build>
</project>

在IDEA中,如果没有特殊配置过,修改完pom文件,需要手动导入下,否则是下图这样的情况:

424537-20190628162456167-774403847.png

怎么手动导入呢?点击下IDEA右下角提示的Import Changes即可。

424537-20190628162650566-2059835293.png

424537-20190628162843224-1293242241.png

至此,Maven项目创建完毕。

3. 简单示例

3.1 数据准备

首先执行如下语句创建数据库mybatis_action_db:

CREATE DATABASE mybatis_action_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

然后执行如下语句创建表country,并添加一些数据:

use mybatis_action_db;CREATE TABLE country
(id          INT          NOT NULL AUTO_INCREMENT,countryname VARCHAR(255) NULL,countrycode VARCHAR(255) NULL,PRIMARY KEY (id)
);INSERT country(countryname, countrycode)
VALUES ('中国', 'CN'),('美国', 'US'),('俄罗斯', 'RU'),('英国', 'GB'),('法国', 'FR');

3.2 配置MyBatis

首先在src/main/resources目录下创建mybatis-config.xml配置文件,为了后续更快速的创建mybatis-config.xml文件,我们可以按照如下步骤添加模版:

424537-20190628164125624-810243073.png

424537-20190628164145369-439013650.png
424537-20190628164151637-1217126880.png
424537-20190628164157321-872224975.png

424537-20190628164202783-1818348455.png

然后输入如下内容:

<?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><settings><setting name="logImpl" value="LOG4J"/></settings><typeAliases><package name="com.zwwhnly.mybatisaction.model"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"><property name="" value=""/></transactionManager><dataSource type="UNPOOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mybatis_action_db"/><property name="username" value="root"/><property name="password" value=""/></dataSource></environment></environments><mappers><mapper resource="com/zwwhnly/mybatisaction/mapper/CountryMapper.xml"/></mappers>
</configuration>

配置简单讲解:

  • <settings>节点中的logImpl属性配置指定使用LOG4J输出日志。
  • <typeAliases>元素下面配置了一个包名,通常确定一个类的时候需要使用类的全限定名称,例如com.zwwhnly.mybatisaction.model.Country。在MyBatis中需要频繁用到类的全限定名称,为了方便使用,我们配置了com.zwwhnly.mybatisaction.model包,这样配置后,在使用类的时候不需要写包名的部分,只使用Country即可。
  • <environments>环境配置中主要配置了数据库连接,如这里我们使用的是本机MySql中的mybatis_action_db数据库,用户名为root,没有密码(大家可根据自己的实际情况修改数据库及用户名和密码)。
  • <mappers>中配置了一个包含完整类路径的CountryMapper.xml,这是一个MyBatis的Sql语句和映射配置文件。

3.3 创建实体类和Mapper.xml文件

在src/main/java下新建包:com.zwwhnly.mybatisaction,然后在这个包下再创建包:model。

在model包下创建数据库表country表对应的实体类Country:

package com.zwwhnly.mybatisaction.model;public class Country {private Integer id;private String countryname;private String countrycode;// 按Alt+Insert快捷键生成get和set方法
}

在src/main/resources下创建目录com/zwwhnly/simple/mapper目录,然后在该目录下创建CountryMapper.xml文件,为了后续更快速的创建Mapper.xml文件,我们可以参考上面的添加mybatis-config.xml模版的方法,这里不再赘述。

最终的CountryMapper.xml文件内容如下:

<?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="com.zwwhnly.mybatisaction.mapper.CountryMapper"><select id="selectAll" resultType="Country">SELECT id,countryname,countrycode from country</select>
</mapper>

配置简单讲解:

  • mapper:XML的根元素,属性namespace定义了当前XML的命名空间。
  • select:我们所定义的一个Select查询。
  • id属性:定义了当前Select查询的唯一id。
  • resultType:定义了当前查询的返回值类型,此处就是指实体类Country,前面配置中提到的包名主要用于这里,如果没有设置包名,此处就需要写成resultType="com.zwwhnly.mybatisaction.model.Country"。
  • SELECT id,countryname,countrycode from country:查询Sql语句。

3.4 配置Log4j以便查看MyBatis操作数据库的过程

在src/main/resources下新建log4j.properties配置文件,输入如下内容:

log4j.rootLogger=ERROR, stdout
log4j.logger.com.zwwhnly.mybatisaction.mapper=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 

3.5 编写测试代码

在src/test/java下创建包:com.zwwhnly.mybatisaction.mapper,然后创建测试类CountryMapperTest类,代码如下:

package com.zwwhnly.mybatisaction.mapper;import com.zwwhnly.mybatisaction.mapper.model.Country;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;import java.io.IOException;
import java.io.Reader;
import java.util.List;public class CountryMapperTest {private static SqlSessionFactory sqlSessionFactory;@BeforeClasspublic static void init() {try {Reader reader = Resources.getResourceAsReader("mybatis-config.xml");sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);reader.close();} catch (IOException e) {e.printStackTrace();}}@Testpublic void testSelectAll() {SqlSession sqlSession = sqlSessionFactory.openSession();try {List<Country> countryList = sqlSession.selectList("selectAll");printCountryList(countryList);} finally {sqlSession.close();}}private void printCountryList(List<Country> countryList) {for (Country country : countryList) {System.out.printf("%-4d%4s%4s\n", country.getId(), country.getCountryname(), country.getCountrycode());}}
}

运行测试代码,输出日志如下:

DEBUG [main] - ==> Preparing: SELECT id,countryname,countrycode from country

DEBUG [main] - ==> Parameters:

TRACE [main] - <== Columns: id, countryname, countrycode

TRACE [main] - <== Row: 1, 中国, CN

TRACE [main] - <== Row: 2, 美国, US

TRACE [main] - <== Row: 3, 俄罗斯, RU

TRACE [main] - <== Row: 4, 英国, GB

TRACE [main] - <== Row: 5, 法国, FR

DEBUG [main] - <== Total: 5

1 中国 CN

2 美国 US

3 俄罗斯 RU

4 英国 GB

5 法国 FR

4. 源码及参考

源码地址:https://github.com/zwwhnly/mybatis-action.git,欢迎下载。

刘增辉《MyBatis从入门到精通》

IntelliJ IDEA中创建xml文件

5. 最后

打个小广告,欢迎扫码关注微信公众号:「申城异乡人」,定期分享Java技术干货,让我们一起进步。

424537-20190716113923826-55678474.png

转载于:https://www.cnblogs.com/zwwhnly/p/11104020.html


http://chatgpt.dhexx.cn/article/mDk9cwcF.shtml

相关文章

沈定刚,雷柏英,李超 | Cell Press Live:人工智能在医学影像中的应用

交叉学科 Interdisciplinary 医学影像是临床医疗诊断的重要依据之一。近些年来&#xff0c;随着信息技术的飞速发展&#xff0c;人工智能即AI也更加广泛地应用于医学影像的处理分析中&#xff0c;包括对图像的分割分类及预测等。AI提高了诊断的精准程度和效率&#xff0c;同时也…

汇纳科技张宏俊:加强布局AI大数据,为实体商业服务

数字经济是继农业经济、工业经济之后的主要经济形态,更是稳定经济,推动经济转型的最强劲动力之一。在今年两会政府工作报告中,数字经济的关注程度远比以往更高,首次以“单独成段”的方式进行表述,并重点明确了“深入实施创新驱动发展战略,巩固壮大实体经济根基”。 从中不…

【Java架构:基础技术】一篇文章搞掂:MyBatis

本文篇幅较长&#xff0c;建议合理利用右上角目录进行查看&#xff08;如果没有目录请刷新&#xff09;。 本文主要总结于刘增辉的《MyBatisc从入门到精通》一书&#xff0c;有兴趣的朋友可以自行研读 建议仔细研读官方文档&#xff1a; http://www.mybatis.org/mybatis-3/zh/ …

Oracle的minus使用

Oracle的minus使用 minus 连接两个结果集&#xff0c;最终生成一个结果集。 功能是&#xff1a;第二个结果集&#xff0c;不会出现在最终结果集中&#xff1b; 如果第一个结果集的内容&#xff0c;在第二个结果集之内有包含&#xff0c;则包含的部分在最终结果集被舍弃。 其实…

MySQL MINUS-差集 [猿教程]

https://yuanjiaoc.com/tutorial/article/10143 在本教程中&#xff0c;您将了解 SQL MINUS 运算符以及如何在 MySQL 中使用 join 模拟 MINUS。 请注意&#xff0c;MySQL 不支持 MINUS 运算符。本教程向您展示如何使用连接子句在 MySQL 中模拟 MINUS 运算符。 SQL MINUS 运算符…

oracle函数之 minus

“minus”直接翻译为中文是“减”的意思&#xff0c;在Oracle中也是用来做减法操作的 Oracle的minus是按列进行比较的&#xff0c;所以A能够minus B的前提条件是结果集A和结果集B需要有相同的列数&#xff0c;且相同列索引的列具有相同的数据类型。此外&#xff0c;Oracle会对m…

Sql server中intersect, minus的用法

Sql server中intersect, minus的用法 一&#xff0c;Intersect Intersect常用来选择两个表格中相关联的事物&#xff0c;它是对两个SQL语句所产生的结果作处理的.它的作用有点像and的用法&#xff0c;就是说所选择的这个值要存在于第一句和第二句才会被选择出&#xff0c;上面…

编译原理 C-Minus 语法分析(Flex / Bison)

C-Minus 源代码 语法分析 文章目录 C-Minus 源代码 语法分析一、实现目标二、实现过程1. 综述2. 实现功能介绍&#xff08;1&#xff09;检测词法错误&#xff08;2&#xff09;检测文法错误&#xff08;3&#xff09;生成语法分析树 3. 代码详解&#xff08;1&#xff09;synt…

编译原理 C-Minus 代码生成(Flex / Bison)

C-Minus 源代码 代码生成 文章目录 C-Minus 源代码 代码生成一、实现目标二、实现过程&#xff08;一&#xff09;内容综述&#xff08;二&#xff09;代码分析1. 中间代码的表示2. 中间代码生成与优化3. 目标代码生成 三、结果分析1. 测试内容一2. 测试内容二 四、源代码放送s…

minus

minus指令是运用在两个SQL语句上&#xff0c;它先找出第一个SQL语句所产生的结果&#xff0c;然后看这些有没有在第二个SQL语句的结果中。如果有的话&#xff0c;那这笔资料就被去除&#xff0c;而不会在最后的结果中出现。如果第二个SQL语句所产生的结果并没有存在于第一个SQL…

MySql中的minus用法

MySql中的minus用法 在DB2和Oracle中&#xff0c;我们经常会用到minus这个函数&#xff0c;但是MySql中是没有minus的&#xff0c;那么要怎么办呢&#xff1f; 下面以一个小栗子来说下&#xff1a; 用例基础 表信息 mysql> show tables; ---------------- | Tables_in_tes…

MINUS 使用

1. sql minus运算符简介 除了union&#xff0c;union all和intersect运算符之外&#xff0c;sql还为我们提供了minus运算符&#xff0c;用于从另一个结果集中减去一个结果集。 以下是minus运算符的语法。 selectid froma minus selectid fromb;要使用minus运算符&#xff…

流形学习的解释

作者&#xff1a;知乎用户 链接&#xff1a;https://www.zhihu.com/question/24015486/answer/194284643 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 最近发现我的这篇回答被人洗稿&#xff08;未署名&#xff…

Log-Euclidean metric on Riemannian manifold 黎曼流形上的Log-Euclidean测度

Log-Euclidean测度是黎曼流形上一种常用的测度&#xff0c;Log-Euclidean测度形式简单&#xff0c;方便计算&#xff0c;因此在基于黎曼流形的算法中被广泛应用。 1.什么是测度 在黎曼流形上&#xff0c;要衡量两个点之间的距离&#xff0c;不能像欧式空间那样直接用范数计算&…

阅读笔记7:多类运动想象脑电信号识别及其在BCI中的应用研究

文章目录 论文信息笔记1.摘要2.绪论2.1 EEG信号处理方法国内外研究进展2.2存在的问题 3.脑电信号采集及预处理方法3.1 共平均参考&#xff08;CAR&#xff09;3.2Butterworth 带通滤波器 4.运动想象EEG信号特征提取4.1 基于 AF-CSP 方法的特征提取研究4.1.1 经验模态分解4.1.2共…

流形学习的基本思想

流形学习的观点是认为&#xff1a;我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的。由于数据内部特征的限制&#xff0c;一些高维中的数据会产生维度上的冗余&#xff0c;实际上只需要比较低的维度就能唯一地表示。 举个例子&#xff0c;比如说我们在平面上有…

什么是流形

高等数学同济六版下册 流形上的微积分 拓扑学导论 拓扑学导论

干货!图像集分类大杀器--混合黎曼度量学习

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 随着视频数据量的不断增加&#xff0c;图像集分类近年来受到了计算机视觉和模式识别研究社区的广泛关注。然而&#xff0c;表征的类内多样性和类间模糊性仍然是重大挑战。为了解决这一问题&#xff0c;研究人员…

流形学习的数学基础

文章目录 1 Optimization Algorithms on Matrix Manifolds2 Riemannian gradient descent3 一些流形优化的博客参考文献 1 Optimization Algorithms on Matrix Manifolds Optimization Algorithms on Matrix Manifolds - Full Online Text P.-A. Absil, R. Mahoney, and Rodol…