揭秘: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

相关文章

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

MyBatis-Plus常用注解详解与实战应用

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了大量的常用注解,使得开发者能够更方便地进行数据库操作。 MyBatis-Plus 提供的注解可以帮我们解决一些数据库与实体之间相互映射的问题。 @TableName @TableName 用来指定表名 在使用 MyBatis-Plus 实现基本的 C

MyBatis系列之分页插件及问题

概述 无论是C端产品页面,还是后台系统页面,不可能一次性将全部数据加载出来。后台系统一般都是PC端登录,用Table组件(如Ant Design Table)渲染展示数据,可点击列表的下一页(或指定某一页)查看数据。C端产品如App,在下滑时可查看更多数据,看起来像是一次性加载数据,实际上也是分批请求后台系统获取数据。而这,就是分页功能。 如果没有使用Hibernate或MyBatis这样的O

【MyBatis学习8】MyBatis中的二级缓存

1. 二级缓存的原理   前面介绍了,mybatis中的二级缓存是mapper级别的缓存,值得注意的是,不同的mapper都有一个二级缓存,也就是说,不同的mapper之间的二级缓存是互不影响的。为了更加清楚的描述二级缓存,先来看一个示意图:      从图中可以看出: sqlSession1去查询用户id为1的用户信息,查询到用户信息会将查询数据存储到该UserMapper的二级缓存中

【MyBatis学习7】MyBatis中的一级缓存

缓存的作用是减轻数据库的压力,提高数据库的性能的。mybatis中提供了一级缓存和二级缓存,先来看一下两个缓存的示意图:    从图中可以看出: 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。二级缓存是mappe

警惕!推广文章与视频的兼职骗局大揭秘

在互联网时代,我们常常会看到各种各样的推广兼职信息,承诺可以轻松赚钱,特别是在推广文章和视频方面。然而,在这些看似诱人的机会背后,往往隐藏着一些骗局。本文将为大家揭示这些骗局,帮助大家避免上当受骗。 一、骗局特征 1. **高额回报承诺**:骗子常常以高额的回报作为诱饵,声称只要转发文章、分享视频,就能获得丰厚的佣金或收益。然而,这种不切实际的高额回报往往是骗局的开始。 2. **简单操作

springboot+vue+mybatis旅游管理+PPT+论文+讲解+售后

随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.旅游管理系统将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本文以jsp为开发技术,实现了一个旅游网站系统。旅游网站系统的主要使用者分为管理员和用户,管理员权限如下;主页、个人中心、景点分类管理、景点信息

spring(一)--spring/springmvc/spring+hibernate(mybatis)配置文件

这篇文章用来总结一下spring,springmvc,spring+mybatis,spring+hibernate的配置文件 1.web.xml 要使用spring,必须在web.xml中定义分发器等信息,基本的配置信息如下: <?xml version="1.0" encoding= "UTF-8"?><web-app version= "3.0"xmlns="http://java.