本文主要是介绍揭秘: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.Mybatis
在java
和sql
之间提供更灵活的映射方案
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程序时, 比如执行测试方法, 程序员往往需要查看 程序底层发给MySQL的SQL语句, 到底长什么样子, 怎么办?
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初恋的甜蜜!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!