揭秘:MyBatis初恋的甜蜜!

2024-02-28 22:04
文章标签 mybatis 揭秘 甜蜜 初恋

本文主要是介绍揭秘:MyBatis初恋的甜蜜!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

💖MyBatis的爱情故事💖

  • 🌹 第一次遇见
    • 官方文档
    • 概述
    • 为什么需要MyBatis
    • 基本介绍
    • MyBatis工作原理
    • 学习主线
  • 🎈 第一次约会
    • 需求说明
    • 代码实现
    • 日志输出-查看SQL
    • 课后练习
  • 💌 我们的情书
    • MyBatis整体架构分析
    • 搭建MyBatis底层机制开发环境
    • 设计思路
    • 自己实现MyBatis底层机制

在这里插入图片描述

🌹 第一次遇见

简化数据库操作的持久层框架

官方文档

https://mybatis.org/mybatis-3/zh/index.html
https://mybatis.net.cn/

Maven仓库
https://mvnrepository.com
在这里插入图片描述

概述

为什么需要MyBatis

●传统的Java程序操作DB分析

1.工作示意图, 一图胜千言
在这里插入图片描述

2.传统方式问题分析(如上)

3.引出MyBatis

基本介绍

1.MyBatis 是一个持久层框架

2.前身是ibatis, 在ibatis3.x时, 更名为 MyBatis

3.Mybatisjavasql之间提供更灵活的映射方案

4.mybatis可以将对数据库的操作(sql, 方法)等等直接剥离, 写到xml配置文件, 实现和java代码的解耦

5.mybatis通过SQL操作DB, 建库建表的工作需要程序员完成

MyBatis工作原理

MyBatis工作示意图
在这里插入图片描述

学习主线

在这里插入图片描述

🎈 第一次约会

需求说明

开发一个MyBatis项目, 通过MyBatis的方式可以完成对monster表的crud操作

代码实现

1.创建mybatis数据库 - moster

CREATE DATABASE mybatis;
USE mybatis;
-- 建议表名和字段名带上反引号
CREATE TABLE `monster` (
`id` INT NOT NULL AUTO_INCREMENT,
`age` INT NOT NULL,
`birthday` DATE NOT NULL,
`email` VARCHAR(255) NOT NULL,
`gender` TINYINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`salary` DOUBLE NOT NULL,
PRIMARY KEY(id)
)CHARSET=utf8

2.创建maven项目, 方便项目需要jar包管理 版本: IntelliJ IDEA 2022.3.2
在这里插入图片描述在这里插入图片描述
mybatis\pom.xml 作为父项目 pom.xml, 引入相关依赖

<dependencies>
<!--mysql依赖-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
<!--mybatis依赖-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>
<!--junit依赖-->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><!--如果这里有一个scope-test, 表示该jar的作用范围在test目录, 后面还要专门学习maven--><scope>test</scope>
</dependency>
</dependencies>

3.创建子项目
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
pom文件发生的变化

父项目的pom.xml

<!--
解读
1.将mybatis作为父项目管理多个子模块/子项目
2.父项目完整的坐标 groupId[组织名]+artifactId[项目名]
3.后面该父项目会管理多个子模块/子项目, 将来父项目引入的依赖可以直接给子项目用, 这样开发简单, 提高复用性, 也便于管理
4.<packaging>pom</packaging> 表示父项目以多个子模块/子项目管理工程
-->
<groupId>com.zzw</groupId>
<artifactId>mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!--modules指定管理了哪些子模块-->
<modules><module>mybatis_quickstart</module>
</modules>

子项目的pom.xml

<!--解读
1.parent指定了该模块的父项目的完整坐标 groupId+artifactId
2.artifactId 子模块的名称
3.当前模块的groupId 就是 com.zzw
4.这样配置后, 该模块就可以使用/引用到父项目的依赖
-->
<parent><groupId>com.zzw</groupId><artifactId>mybatis</artifactId><version>1.0-SNAPSHOT</version>
</parent><artifactId>mybatis_quickstart</artifactId>

4.创建mybatis_quickstart/src/main/resouces/mybatis-config.xml 不一定非叫 mybatis-config
!!在这里插入链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=your-image-url.jpg&pos_id=img-iVEDeAzf-17.新建com.zzw.mapper.MonsterMapper.xml, 可以不叫MonsterMapper.xml, 但尽量保持一样
在这里插入图片描述

打开文档, 复制模板

在这里插入图片描述

先在数据库写好VALUES前面要有空格

-- 添加语句 建议表名和字段名带上反引号
INSERT INTO `monster`
(`age`, `birthday`, `email`, `gender`, `name`, `salary`)
VALUES (10, NOW(), '9789@qq.com', 1, 'king', 1000);
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"<  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
!-- 解读替1. 这是个mapper xml 文件2. 该文件可以去实现对应一的接口的方法3. namespace 指定该xml文件和哪个接口对应!!!
-->
<mapper namespace="com.zzw.mapper.MonsterMapper"><!--配置addMonster1. id="addMonster" 就是接口的方法名2. parameterType="com.zzw.entity.Monster" 放入的形参的类型3. 注意"com.zzw.entity.Monster" 可以简写4. 写入sql语句=> 建议: 先在 sqlyog 写完-测试通过, 再拿过来5. (`age`, `birthday`, `email`, `gender`, `name`, `salary`) 表的字段6. (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary}) 是从传入的monster对象属性来的7. 这里 #{age} age 对应monster对象的属性名, 其它一样--><insert id="addMonster" parameterType="com.zzw.entity.Monster">INSERT INTO `monster`(`age`, `birthday`, `email`, `gender`, `name`, `salary`)VALUES (#{age}, #{birthday}, #{email}, #{gender}, #{name}, #{salary})</insert>
</mapper>

8.修改mybatis-config.xml

在这里插入图片描述

<!--说明
1. 这里我们配置需要管理的Mapper.xml
2. 这里我们可以通过菜单 Path From Source Root
-->
<mappers><mapper resource="com/zzw/mapper/MonsterMapper.xml"/>
</mappers>

9.新建com.zzw.util.MyBatisUtils

/*** MyBatisUtils 工具类, 可以得到SqlSession*/
public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;//编写静态代码块-初始化sqlSessionFactorystatic {try {//指定资源文件, 配置文件mybatis-config.xmlString resource = "mybatis-config.xml";//获取到配置文件mybatis-config.xml 对应的inputStream//这里说明: 在加载文件时, 默认到resources目录=>运行后的工作目录target/classes//org.apache.ibatis.ioSTDOUT_LOGGINGInputStream resourceAsStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);System.out.println("sqlSessionFactory=" + sqlSessionFactory);} catch (IOException e) {throw new RuntimeException(e);}}//编写方法, 返回SqlSession对象-会话public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}

10.在test/java目录下新建com.zzw.mapper.MonsterMapperTest
在这里插入图片描述

public class MonsterMapperTest {//属性private SqlSession sqlSession;private MonsterMapper monsterMapper;/*** 解读* 1. 编写方法完成初始化* 2. 当方法标注 @Before, 表示在执行你的目标测试方法前, 会先执行该方法* 3. 这里在测试的时候, 可能小伙伴们会遇到一些麻烦, 老师说了解决方案*/@Beforepublic void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//获取到MonsterMapper对象 monsterMapper=class com.sun.proxy.$Proxy7 代理对象//, 底层是使用了动态代理机制, 后面我们自己实现mybatis底层机制时, 会讲到monsterMapper = sqlSession.getMapper(MonsterMapper.class);System.out.println("monsterMapper=" + monsterMapper.getClass());}@Testpublic void addMonster() {System.out.println("t1()...");}
}

11.测试, 看看是否可以添加成功, 这时会出现找不到 XxxMapper.xml 错误, 分析原因
在这里插入图片描述
12.解决找不到Mapper.xml配置文件问题, 温馨提示: 如果顺利, 你会很快解决; 不顺利, 你会干到怀疑人生.

在父工程的pom.xml 加入 build 配置

<!--在build中配置resources, 来防止我们资源导出失败的问题解读1. 不同的idea/maven 可能提示的错误不一样2. 不变应万变, 少什么文件, 就增加相应配置即可3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录的资源文件 xml 和 properties, 在build项目时, 导出到对应的target目录下
-->
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources>
</build>

在这里插入图片描述在这里插入图片描述在这里插入图片描述

13.添加: 修改addMonster

@Test
public void addMonster() {for (int i = 0; i < 2; i++) {Monster monster = new Monster();monster.setAge(10 + i);monster.setBirthday(new Date());monster.setEmail("978964140@qq.com");monster.setGender(1);monster.setName("松鼠君-" + i);monster.setSalary(1000 + i * 10);monsterMapper.addMonster(monster);System.out.println("添加对象--" + monster);}//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("保存对象...");
}

14.返回自增长的id

<insert id="addMonster" parameterType="com.zzw.entity.Monster" useGeneratedKeys="true" keyProperty="id">

useGeneratedKeys在文档中的位置
在这里插入图片描述

for (int i = 0; i < 2; i++) {Monster monster = new Monster();monster.setAge(10 + i);monster.setBirthday(new Date());monster.setEmail("978964140@qq.com");monster.setGender(1);monster.setName("狐狸精-" + i);monster.setSalary(1000 + i * 10);monsterMapper.addMonster(monster);System.out.println("添加对象--" + monster);System.out.println("添加到表中后, 自增长的id=" + monster.getId());
}

在这里插入图片描述

15.删除: 修改MonsterMapper接口, 增加方法

//根据id删除一个Monster
public void delMonster(Integer id);

在数据库中测试一下sql语句

-- 删除语句
DELETE FROM `monster` WHERE id = 1;

修改MonsterMapper.xml

<!--配置/实现delMonster方法
1.这里 java.lang.Integer 这是Java类型, 可以简写成 Integer
2.这里写入delete语句
-->
<delete id="delMonster" parameterType="java.lang.Integer">DELETE FROM `monster` WHERE id = #{id}
</delete>

MonsterMapperTest.java 新增测试方法

@Test
public void delMonster() {monsterMapper.delMonster(2);//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("删除成功...");
}

16.修改: MonsterMapper接口, 增加方法

//修改Monster
public void updateMonster(Monster monster);

在数据库中测试一下sql语句

-- 更新语句
UPDATE `monster` SET `age` = 23, `birthday` = NOW(), `email` = 'galaxy.com', `gender` = 1, `name` = 'tom',
`salary` = 6000 WHERE id = 3;

修改MonsterMapper.xml

<!--配置/实现updateMonster方法
1. com.zzw.entity.Monster 可以简写, 一会再次讲解
-->
<update id="updateMonster" parameterType="com.zzw.entity.Monster">UPDATE `monster` SET `age` = #{age}, `birthday` = #{birthday}, `email` = #{email},`gender` = #{gender}, `name` = #{name}, `salary` = #{salary} WHERE id = #{id}
</update>

MonsterMapperTest.java 新增测试方法

@Test
public void updateMonster() {Monster monster = new Monster();monster.setAge(23);monster.setBirthday(new Date());monster.setEmail("978964140@qq.com");monster.setGender(0);monster.setName("梅花鹿精");monster.setSalary(2000);monster.setId(3);monsterMapper.updateMonster(monster);//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("修改成功...");
}

17.查询根据id: mybatis-config.xml 配置类型别名

类型别名在文档中的位置
在这里插入图片描述

<!--配置别名-->
<typeAliases><typeAlias type="com.zzw.entity.Monster" alias="Monster"/>
</typeAliases>

MonsterMapper接口, 增加方法

//查询-根据id
public Monster getMonsterById(Integer id);

在数据库中测试一下sql语句

-- 查询语句-根据id
SELECT * FROM `monster` WHERE id = 3;

修改MonsterMapper.xml

<!--配置/实现getMonsterById-->
<select id="getMonsterById" resultType="Monster">SELECT * FROM `monster` WHERE id = #{id}
</select>

MonsterMapperTest.java 新增测试方法

@Test
public void getMonsterById() {Monster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//查询语句, 释放连接还是有必要的if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");
}

17.查询全部: MonsterMapper接口, 增加方法

//查询所有的Monster
public List<Monster> findAllMonster();

修改MonsterMapper.xml

<!--配置/实现findAllMonster-->
<select id="findAllMonster" resultType="Monster">SELECT * FROM `monster`
</select>

MonsterMapperTest.java 新增测试方法

@Test
public void findAllMonster() {List<Monster> monsters = monsterMapper.findAllMonster();for (Monster monster : monsters) {System.out.println("monster="+ monster);}//查询语句, 释放连接还是有必要的if (sqlSession != null) {sqlSession.close();}System.out.println("查询成功");
}

日志输出-查看SQL

●看一个需求
1.在开发MyBatis程序时, 比如执行测试方法, 程序员往往需要查看 程序底层发给MySQLSQL语句, 到底长什么样子, 怎么办?

2.解决方案: 日志输出

●配置日志-具体操作
1.查看文档
日志文档: https://mybatis.org/mybatis-3/zh_CN/logging.html

配置日志: https://mybatis.org/mybatis-3/zh_CN/configuration.html#settings
在这里插入图片描述
在这里插入图片描述
2.修改mybatis-config.xml, 加入日志输出配置, 方便分析SQL语句

<!--配置MyBatis自带的日志输出-查看原生的sqlDOCTYPE规定 <settings/>节点/元素 必须在前面, 放在后面会报错
-->
<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

在这里插入图片描述

课后练习

MyBatis入门练习 - 创建一个Monk类 - 自己创建个新的项目完成
要求属性
1. 编号- id
2. 法号 -nickname
3. 本领 - skill
4. 级别 - grade
5. 薪水 - salary
6. 出生日期 - birthday (要求可以保存 年-月-日 时:分:秒)
7. 入寺庙时间 - entry (只保留 年-月-日)

完成功能
1. 可以添加一个和尚
2. 可以修改和尚信息
3. 可以删除和尚
4. 可以取出一个和尚
5. 取出所有和尚

代码实现
1.在mybatis数据库下, 创建 monk

CREATE TABLE `monk` (
`id` INT NOT NULL AUTO_INCREMENT,
`nickname` VARCHAR(255) NOT NULL,
`skill` VARCHAR(255) NOT NULL,
`grade` VARCHAR(255) NOT NULL,
salary DOUBLE NOT NULL,
birthday DATETIME NOT NULL,
entry DATE NOT NULL,
PRIMARY KEY(id)
)CHARSET=utf8

2.创建JavaBean: com.zzw.entity.Monk.java

public class Monk {private Integer id;private String nickname;private String skill;private String grade;private double salary;private Date birthday;private Date entry;//有参, 无参构造器, setter, getter, toString方法
}

3.创建com.zzw.mapper.MonkMapper接口

/*** 1. 这是一个接口* 2. 该接口用于声明操作monk表的方法* 3. 这些方法可以通过注解或者xml文件来实现*/
public interface MonkMapper {//添加一个和尚public void addMonk(Monk monk);
}

4.新建com.zzw.mapper.MonkMapper.xml, 可以不叫MonkMapper.xml, 尽量保持一样
在这里插入图片描述打开文档, 复制模板

在这里插入图片描述先在数据库写好SQL. 注意: VALUES前面要有空格

-- 添加语句 建议表名和字段名带上反引号
INSERT INTO `monk`(`nickname`, `skill`, `grade`, `salary`, `birthday`, `entry`)
VALUES ('一休', '打坐', '小和尚', 2000, NOW(), NOW());

写入到MonkMapper.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="com.zzw.mapper.MonkMapper"><insert id="addMonk" parameterType="com.zzw.entity.Monk">INSERT INTO `monk`(`nickname`, `skill`, `grade`, `salary`, `birthday`, `entry`)VALUES (#{nickname}, #{skill}, #{grade}, #{salary}, #{birthday}, #{entry});</insert>
</mapper>

返回自增长的id - useGeneratedKeys在文档中的位置
在这里插入图片描述

mybatis-config.xml中配置类型别名 - 类型别名在文档中的位置
在这里插入图片描述

<!--配置别名-->
<typeAliases><typeAlias type="com.zzw.entity.Monk" alias="Monk"/>
</typeAliases>

修改后的sql语句

<insert id="addMonk" parameterType="Monk" useGeneratedKeys="true" keyProperty="id">INSERT INTO `monk`(`nickname`, `skill`, `grade`, `salary`, `birthday`, `entry`)VALUES (#{nickname}, #{skill}, #{grade}, #{salary}, #{birthday}, #{entry});
</insert>

5.修改mybatis-config.xml

<!--说明
1. 这里我们配置需要管理的Mapper.xml
2. 这里我们可以通过菜单 Path From Source Root
-->
<mappers><mapper resource="com/zzw/mapper/MonkMapper.xml"/>
</mappers>

修改mybatis-config.xml, 加入日志输出配置, 方便分析SQL语句

<!--配置MyBatis自带的日志输出-查看原生的sqlDOCTYPE规定 <settings/>节点/元素 必须在前面, 放在后面会报错
-->
<settings><setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

新建com.zzw.util.MyBatisUtils

/*** MyBatisUtils 工具类, 可以得到SqlSession*/
public class MyBatisUtils {private static SqlSessionFactory sqlSessionFactory;//编写静态代码块-初始化sqlSessionFactorystatic {try {//指定资源文件, 配置文件mybatis-config.xmlString resource = "mybatis-config.xml";//获取到配置文件mybatis-config.xml 对应的inputStream//这里说明: 在加载文件时, 默认到resources目录=>运行后的工作目录target/classes//org.apache.ibatis.ioSTDOUT_LOGGINGInputStream resourceAsStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);System.out.println("sqlSessionFactory=" + sqlSessionFactory);} catch (IOException e) {throw new RuntimeException(e);}}//编写方法, 返回SqlSession对象-会话public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}

6.在test/java目录下新建com.zzw.mapper.MonkMapperTest

public class MonkMapperTest {//属性private SqlSession sqlSession;private MonkMapper monkMapper;/*** 解读* 1.编写方法完成初始化* 2.当方法标注 @Before, 表示在执行目标测试方法前, 会先执行该方法*/@Beforepublic void init() {//获取到sqlSessionsqlSession = MyBatisUtils.getSqlSession();//获取到MonkMapper对象 monkMapper=org.apache.ibatis.binding.MapperProxy@37d31475//底层使用了动态代理机制, 后面自己实现mybatis底层机制时, 会讲到monkMapper = sqlSession.getMapper(MonkMapper.class);System.out.println("monkMapper=" + monkMapper);}@Testpublic void addMonk() throws ParseException {for (int i = 0; i < 2; i++) {Monk monk = new Monk();monk.setNickname("一休" + i);monk.setSkill("打坐");monk.setGrade("和尚");monk.setSalary(3000 + i * 10);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date birthday = sdf.parse("2000-10-15 12:12:12");monk.setBirthday(birthday);monk.setEntry(new Date());monkMapper.addMonk(monk);System.out.println("添加对象--" + monk);}//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("新增成功...");}
}

在父工程的pom.xml 加入 build 配置

<!--在build中配置resources, 来防止我们资源导出失败的问题解读1. 不同的idea/maven 可能提示的错误不一样2. 不变应万变, 少什么文件, 就增加相应配置即可3. 含义是将 src/main/java目录和子目录 和 src/main/resources目录和子目录的资源文件 xml 和 properties, 在build项目时, 导出到对应的target目录下
-->
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include><include>**/*.properties</include></includes></resource></resources>
</build>

在这里插入图片描述在这里插入图片描述

💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐模板💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐
新增/修改/删除/查询: 修改MonkMapper接口, 增加方法


在数据库中测试一下sql语句


修改MonkMapper.xml


MonkMapperTest.java 新增测试方法


💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐💐


7.删除: 修改MonkMapper接口, 增加方法

//删除和尚信息
public void delMonk(Integer id);

在数据库中测试一下sql语句

-- 删除语句
DELETE FROM `monk` WHERE id = 5;

修改MonkMapper.xml

<!--配置/实现delMonk方法
1.这里的java.lang.Integer, 可以简写成Integer
2.这里写入delete语句
-->
<delete id="delMonk" parameterType="Integer">DELETE FROM `monk` WHERE id = #{id}
</delete>

MonkMapperTest.java 新增测试方法

@Test
public void delMonster() {monkMapper.delMonk(2);//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("删除成功...");
}

在这里插入图片描述

7.修改: 修改MonkMapper接口, 增加方法

//修改和尚信息
public void updateMonk(Monk monk);

在数据库中测试一下sql语句

UPDATE `monk` SET `nickname` = '一休', `skill` = '打坐', `grade` = '和尚', 
`salary` = 6000, `birthday` = NOW(), `entry` = NOW() WHERE `id` = 3;

修改MonkMapper.xml

<!--
1.配置/实现updateMonk方法
2.com.zzw.entity.Monk 可以简写成 Monk
-->
<update id="updateMonk" parameterType="Monk">UPDATE `monk` SET `nickname` = #{nickname}, `skill` = #{skill}, `grade` = #{grade},`salary` = #{salary}, `birthday` = #{birthday}, `entry` = #{entry} WHERE `id` = #{id}
</update>

MonkMapperTest.java 新增测试方法

@Test
public void updateMonk() throws ParseException {Monk monk = new Monk();monk.setNickname("一休呀");monk.setSkill("打坐呀");monk.setGrade("和尚呀");monk.setSalary(5999);monk.setBirthday(new Date());monk.setEntry(new Date());monk.setId(3);monkMapper.updateMonk(monk);//如果是增删改, 需要提交事务if (sqlSession != null) {sqlSession.commit();sqlSession.close();}System.out.println("修改成功...");
}

8.查询根据id: 修改MonkMapper接口, 增加方法

//取出一个和尚
public Monk getMonkById(Integer Id);

在数据库中测试一下sql语句

SELECT * FROM `monk` WHERE id = 3;

修改MonkMapper.xml

<!--配置/实现getMonkById方法-->
<select id="getMonkById" parameterType="Integer">SELECT * FROM `monk` WHERE id = #{id}
</select>

MonkMapperTest.java 新增测试方法

@Test
public void getMonkById() {Monk monk = monkMapper.getMonkById(3);//查询不需要提交, 但是也需要释放资源if (sqlSession != null) {sqlSession.close();}System.out.println("monk=" +monk);
}

9.查询所有: 修改MonkMapper接口, 增加方法

//取出所有和尚
public List<Monk> findAllMonk();

修改MonkMapper.xml

<!--配置/实现findAllMonk方法-->
<select id="findAllMonk" resultType="Monk">SELECT * FROM `monk`
</select>

在这里插入图片描述

MonkMapperTest.java 新增测试方法

@Test
public void findAllMonk() {List<Monk> monks = monkMapper.findAllMonk();//查询不需要提交, 但是也需要释放资源if (sqlSession != null) {sqlSession.close();}for (Monk monk : monks) {System.out.println("monk=" + monk);}
}

💌 我们的情书

MyBatis整体架构分析

💐一图胜千言

MyBatis核心框架示意图

在这里插入图片描述

2.对上图的解读
1)mybatis的核心配置文件
mybatis-config.xml: 进行全局配置, 全局只能有一个这样的配置文件
XxxMapper.xml: 配置多个SQL, 可以有多个XxxMapper.xml配置文件

2)通过mybatis-config.xml配置文件得到SqlSessionFactory
3)通过SqlSessionFactory得到SqlSession, 用SqlSession就可以操作数据了
4)SqlSession底层是Executor(执行器), 有2个重要的实现类, 有很多方法
在这里插入图片描述在这里插入图片描述

5)MappedStatement是通过XxxMapper.xml中定义, 生成的statement对象
6)参数输入执行并输出结果集, 无需手动判断参数类型和参数下标位置, 且自动将结果集映射为Java对象

搭建MyBatis底层机制开发环境

1.创建Maven项目zzw-mybatis 参考
在这里插入图片描述

2.修改 pom.xml

<!--引入必要的依赖-->
<dependencies><!--引入dom4j--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><!--引入mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><!--引入lombok-简化entity/javabean/pojo开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.4</version></dependency><!--junit依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>

3.创建数据库和表

CREATE DATABASE `zzw_mybatis`;
USE `zzw_mybatis`;CREATE TABLE `monster` (
`id` INT NOT NULL AUTO_INCREMENT,
`age` INT NOT NULL,
`birthday` DATE NOT NULL,
`email` VARCHAR(255) NOT NULL,
`gender` TINYINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`salary` DOUBLE NOT NULL,
PRIMARY KEY(id)
)CHARSET=utf8INSERT INTO `monster` (`age`, `birthday`, `email`, `gender`, `name`, `salary`)
VALUES (10, NOW(), '9789@qq.com', 1, 'king', 1000);

设计思路

1.自己实现Mybatis的底层设计实现
在这里插入图片描述

自己实现MyBatis底层机制

未完待续…
在这里插入图片描述
💐💐💐💐💐💐💐💐给个赞, 点个关注吧, 各位大佬!💐💐💐💐💐💐💐💐

💐💐💐💐💐💐💐💐祝各位2024年大吉大运💐💐💐💐💐💐💐💐💐💐
请添加图片描述

这篇关于揭秘:MyBatis初恋的甜蜜!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

Mybatis官方生成器的使用方式

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map... 目录1. MyBATis Generator 简介2. MyBatis Generator 的功能3

Mybatis提示Tag name expected的问题及解决

《Mybatis提示Tagnameexpected的问题及解决》MyBatis是一个开源的Java持久层框架,用于将Java对象与数据库表进行映射,它提供了一种简单、灵活的方式来访问数据库,同时也... 目录概念说明MyBATis特点发现问题解决问题第一种方式第二种方式问题总结概念说明MyBatis(原名

SpringBoot基于MyBatis-Plus实现Lambda Query查询的示例代码

《SpringBoot基于MyBatis-Plus实现LambdaQuery查询的示例代码》MyBatis-Plus是MyBatis的增强工具,简化了数据库操作,并提高了开发效率,它提供了多种查询方... 目录引言基础环境配置依赖配置(Maven)application.yml 配置表结构设计demo_st

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

MyBatis延迟加载的处理方案

《MyBatis延迟加载的处理方案》MyBatis支持延迟加载(LazyLoading),允许在需要数据时才从数据库加载,而不是在查询结果第一次返回时就立即加载所有数据,延迟加载的核心思想是,将关联对... 目录MyBATis如何处理延迟加载?延迟加载的原理1. 开启延迟加载2. 延迟加载的配置2.1 使用

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。