【MyBatis】| JavaWeb基础教程学习笔记(上)

01-MyBatis简介

什么是MyBatis?

  • MyBatis是一款优秀的持久层框架,用于简化JDBC开发
  • MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github
  • 官网:https://mybatis.net.cn/getting-started.html

什么是持久层?

  • 负责将数据保存到数据库的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层

什么是框架?

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

JDBC的缺点--->MyBatis将其解决

两个缺点:硬编码和操作繁琐。

MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。

市面上持久层框架有:

02-MyBatis快速入门

查询user表中所有数据,步骤:

  1. 创建user表,添加数据
  2. 创建模块,导入坐标
  3. 编写MyBatis核心配置文件 ---> 替换连接信息 解决硬编码问题
  4. 编写SQL映射文件 ---> 统一管理sql语句,解决硬编码问题
  5. 编码
    1. 定义POJO类
    2. 加载核心配置文件,获取SqlSessionFactory对象
    3. 获取SqlSession对象,执行SQL语句
    4. 释放资源

1. 创建user表,添加数据

-- 创建数据库
CREATE DATABASE mybatis;-- 使用数据库
USE mybatis;-- 如果存在,则删除表 tb_user
DROP TABLE IF EXISTS tb_user;-- 创建表 tb_user
CREATE TABLE tb_user (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(20),password VARCHAR(20),gender CHAR(1),addr VARCHAR(30)
);-- 插入数据
INSERT INTO tb_user (username, password, gender, addr) VALUES ('zhangsan', '123', '男', '北京');
INSERT INTO tb_user (username, password, gender, addr) VALUES ('李四', '234', '女', '天津');
INSERT INTO tb_user (username, password, gender, addr) VALUES ('王五', '345', '男', '西安');

2. 创建模块,导入坐标(创建Maven,添加依赖

什么是导入坐标?在Maven中,“导入坐标”是指在项目的`pom.xml`文件中添加依赖项的行为。这里的“坐标”指的是Maven仓库中的依赖项的唯一标识符。叫添加依赖不行吗?非要叫导入坐标

        打开IDEA创建一个Maven项目。要使用 MyBatis,方法一你只需要将 mybatis-x.x.x.jar 文件添加到你的项目的类路径(classpath)中。

方法二如果你使用 Maven 来构建你的项目,你需要将以下依赖代码添加到你的 pom.xml 文件中。

pom.xml:
    <dependencies><!-- MyBatis 依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version></dependency><!-- ... 其他依赖 ... --></dependencies>

        请注意,你需将 x.x.x 替换为当前的 MyBatis 版本号。本例3.5.16

        从 MyBatis 的官方网站或者 Maven 中央仓库以获取最新的版本号,并替换上述代码中的 x.x.x 以确保你使用的是最新稳定版本的 MyBatis。

完整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>org.example</groupId><artifactId>javaweb_b_mybatis</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- MyBatis 依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><!-- 例如数据库驱动,这里以MySQL为例 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- junit 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency><!-- 添加slf4j日志api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.20</version></dependency><!-- 添加logback-classic依赖 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- 添加logback-core依赖 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.2.3</version></dependency></dependencies>
</project>
logback.xml:

logback除了要添加依赖,还需要一个配置文件logback.xml

3. 编写MyBatis核心配置文件 ---> 替换连接信息 解决硬编码问题

  • 从XML中构建SqlSessionFactory
  • xml配置文件mybatis-config.xml
  • 放在src.main.resources下
mybatis-config.xml:
<?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><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库连接信息--><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><!--加载sql映射文件--><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>

MyBatis 配置文件中,有【数据库连接信息】需要根据你的实际环境进行修改:

  • ${driver}:数据库驱动类名称,需要替换为实际的驱动类,例如 com.mysql.cj.jdbc.Driver
  • ${url}:数据库连接 URL,需要替换为实际的数据库连接字符串,例如 jdbc:mysql://localhost:3306/mybatis或者jdbc:mysql://mybatis?useSSL=false
  • ${username}:数据库用户名,需要替换为实际的数据库用户名,例如:root。
  • ${password}:数据库密码,需要替换为实际的数据库密码,例如:123456。
  • mapper文件是同级,本例改为mapper resource="UserMapper.xml"

4. 编写SQL映射文件 ---> 统一管理sql语句,解决硬编码问题

  • sql语句映射文件
  • 假设操作的是user表,文件名就叫UserMapper.xml
  • 放在src.main.resources下
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--
mapper根标签
namespace名称空间
-->
<mapper namespace="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>
  • namespace:namespace="org.mybatis.example.BlogMapper":这是命名空间,通常是接口的全限定名。你需要根据实际项目的包结构来修改这个值。本例改为test
  • select id:id="selectBlog":这是查询的唯一标识符,用于在代码中引用。如果你有多个查询,需要确保每个查询的 id 都是唯一的。本例是selectAll
  • resultType:resultType="Blog":这指定了查询结果应该映射到哪个 Java 类。你需要根据实际的 Java 类名来修改这个值。本例是com.itheima.pojo.User
  • SQL语句:select * from Blog where id = #{id}:这是实际的 SQL 查询语句。你需要确保表名 Blog 和字段名 id 与数据库中的表和字段匹配。此外,如果使用了参数,需要确保它们与方法调用中的参数一致。本例是select * from tb_user

5. 编码

5.1定义POJO类
  • com.itheima.pojo.User
  • 放在src.main.java下
  • 定义属性、getter 和 setter 方法、toString方法
User.java:

什么是POJO类? 

POJO是Plain Old Java Object的缩写,直译为“简单老式Java对象”。它是一个简单的Java类。

5.2加载核心配置文件,获取SqlSessionFactory对象
  • com.itheima.MyBatisDemo
  • 放在src.main.java下
  • 从官网复制粘贴
  • 5.3获取SqlSession对象,执行SQL语句
  • 5.4释放资源

MyBatisDemo.java:
package com.itheima;import com.itheima.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Mybatis 快速入门代码*/
public class MyBatisDemo {public static void main(String[] args) throws IOException {// 1. 加载 MyBatis 的核心配置文件,获取 SqlSessionFactoryString resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.获取 SqlSession对象,用它来执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();// 3.执行sqlList<User> users = sqlSession.selectList("test.selectAll");System.out.print(users);// 4.释放资源sqlSession.close();}
}

03-解决SQL语句警告提示

解决SQL映射文件的警告提示

  • 产生原因:IDEA和数据库没有建立连接,不识别表信息
  • 解决方式:在IDEA中配置MySQL数据库连接

tips:在IDEA敲sql语句

04-Mapper代理开发

目的:

  • 解决原生方式中的硬编码
  • 简化后期执行SQL
  • IDEA写代码可以有代码补全功能,很方便

1.定义接口

定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

  • 在resources下创建包package发现只有目录directory?
  • 在resources下创建包时要使用斜杠/表示层次结构

        因为路径更改了,所以mybatis-config.xml文件中的路径也需要更改。从 UserMapper.xml改为om/itheima/mapper/UserMapper.xml。

2. 设置SQL映射文件的namespace属性为Mapper接口全限定名

把前面临时起的名称空间test改成com.itheima.mapper.UserMapper

3. 定义方法

在Mapper接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

package com.itheima.mapper;import com.itheima.pojo.User;
import java.util.List;public interface UserMapper {List<User> selectAll();
}

 细节:从select * from tb_user明确的知道返回的是集合,所以用泛型List,而不是User对象。(很多个用集合,单个就用独立的实体类对象

4. 编码

4.1 通过SqlSession的getMapper方法获取Mapper接口的代理对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
4.2 调用对应方法完成sql的执行
List<User> users = userMapper.selectAll();
 MyBatisDemo2.java完整代码:
package com.itheima;import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** Mybatis 代理开发*/
public class MyBatisDemo2 {public static void main(String[] args) throws IOException {// 1. 加载 MyBatis 的核心配置文件,获取 SqlSessionFactoryString resource = "mybatis-config.xml"; // 注意路径InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.获取 SqlSession对象,用它来执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();// 3.执行sql//List<User> users = sqlSession.selectList("test.selectAll");//3.1 获取UserMapper接口的代理对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<User> users = userMapper.selectAll();System.out.println(users);// 4.释放资源sqlSession.close();}
}
  MyBatisDemo2.java运行结果展示:

5. 映射文件的加载

细节:如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。

优点:可以简化配置,不需要在 MyBatis 配置文件中显式指定每个 Mapper XML 文件的位置。这可以减少配置文件的复杂性,特别是对于拥有大量映射文件的项目。


 

到现在为止完整目录如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双11必买物品清单有哪些?双11推荐购买清单推荐分享

随着一年一度的“双十一”购物狂欢节的到来&#xff0c;各大电商平台纷纷推出了各种优惠活动和促销策略&#xff0c;让消费者在享受购物乐趣的同时也能获得实实在在的优惠。然而&#xff0c;面对琳琅满目的商品和纷繁复杂的促销活动&#xff0c;双11必买物品清单有哪些成为了一…

【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;迈向AGI的新跨越&#x1f4af;BoT与CoT的技术对比技术原理差异推理性能提升应用范围和通用性从错误中学习的能力总结 &#x1f4af;BoT的工作流程和机制初始化过程生成推…

网上摄影工作室:Spring Boot框架的应用实例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Redis——缓存

目录 前言 一、缓存基本概念 1.概念 2.二八定律 二、使用 Redis 作为缓存 三、缓存的更新策略 1.定期生成 2.实时生成 四、Redis 内存淘汰机制 1.通用淘汰策略 &#xff08;1&#xff09;FIFO &#xff08;2&#xff09;LRU &#xff08;3&#xff09;LFU &#…

buildroot制作自己的软件包(可以理解为应用程序)

以helloworld为例记录使用步骤 一&#xff1a;书写自己的源程序以及Makefile helloworld.c #include <stdio.h>int main(int argc, char **argv) {printf("hello world\r\n");return 0; }Makefile all: helloworldhelloworld: helloworld.o$(CC) -o hellow…

模型训练识别手写数字(二)

模型训练识别手写数字&#xff08;一&#xff09;使用手写数字图像进行模型测试 一、生成手写数字图像 1. 导入所需库 import cv2 import numpy as np import oscv2用于计算机视觉操作。 numpy用于处理数组和图像数据。 os用于文件和目录操作。 2. 初始化画布 canvas np.z…

Kaggle竞赛——灾难推文分类(Disaster Tweets)

目录 1. 准备工作2. 资源导入3. 数据处理4. 绘制词云图5. 数据可视化5.1 词数和字符数可视化5.2 元特征可视化5.3 类别可视化 6. 词元分析6.1 一元语法统计6.2 多元语法统计 7. 命名实体识别8. 推文主题提取9. 构建模型9.1 数据划分与封装9.2 模型训练与验证 10. 模型评估11. 测…

SQL:Windows下MySQL的安装教程(超详细)

一.系统环境&#xff1a; 操作系统&#xff1a; Windows11&#xff1b; MySQL版本&#xff1a; mysql-community-8.0.40.0&#xff1b; 二.MySQL下载&#xff1a; 访问MySQL 官网下载地址&#xff1a;https://www.mysql.com/&#xff0c;点击DOWNLOADS&#xff1b; 跳转后页…

Maven---依赖管理,项目构建工具

1.Maven安装和配置 1.1设置本地仓库 提前准备好仓库的位置,打开配置文件maven/conf/setting.xml 1.2配置阿里镜像源 在mirrors节点(标签)下添加阿里中央仓库镜像,把原本的镜像源注释掉,不要写在mirrors标签外 <mirror><id>alimaven</id><name>aliy…

6 款超实用的 Coze 插件,让你的智能体开发效率提升 200%

最近我一直在频繁使用 Coze 智能体&#xff0c;帮朋友和客户实现各种定制化需求。 Coze 不仅提供了强大的工作流编排能力和全面的功能节点&#xff0c;还有大量由开发者和平台上传的插件库支持。 对于智能体开发者来说&#xff0c;找到一款合适、好用的插件&#xff0c;真的能…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

JVM(HotSpot):GC之G1垃圾回收器

文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介 1、适用场景 同时注重吞吐量&#xff08;Throughput&#xff09;和低延迟&#xff08;Low latency&#xff09;&#xff0c;默认的暂停目标是 200 ms超大堆内存&#xff0c;会将堆划分为…

华为云弹性云服务器无法登录远程操作

遇到的问题&#xff1a; 就是你在创建弹性云服务器的时候选择了没有子网的虚拟私有云&#xff0c; 你属于误删了虚拟私有云的子网&#xff0c;自己没有注意看 如果在华为云创建弹性云服务器时选择的虚拟私有云&#xff08;VPC&#xff09;没有配置子网&#xff0c;那么在尝试远…

【mysql 进阶】2-1. MySQL 服务器介绍

MySQL 服务器简介 通常所说的 MySQL 服务器指的是mysqld程序&#xff0c;当运⾏mysqld后对外提供MySQL 服务&#xff0c;这个专题的内容涵盖了以下关于MySQL 服务器以及相关配置的内容&#xff0c;包括&#xff1a; 服务器⽀持的启动选项。可以在命令⾏和配置⽂件中指定这些选…

嵌入式C语言字符串具体实现

大家好,今天主要给大家分享一下,如何使用C语言进行字符串操作与实现。 第一:字符串相关操作实现 复制函数五个基本要素: 头文件:#include <string.h> 函数原型:strcpy(char dest[],char src[]) -----string copy 功能:把src数组中\0之前的所有字符,连同‘\…

在xml 中 不等式 做转义处理的问题

对于这种要做转义处理&#xff0c;<![CDATA[ < ]]>

讲一讲 kafka 的 ack 的三种机制?

大家好&#xff0c;我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 讲一讲 kafka 的 ack 的三种机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序

目录 前言&#xff1a; 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket&#xff08;&#xff09;讲解 代码实现&#xff1a;​编辑 代码讲解&#xff1a; 1.2.填充sockaddr_in结构 代码实现&#xff1a; 代码解析&#xff1a; 1.3.bind sockfd和…

Vue2自定义指令及插槽

这里写目录标题 自定义指令基础语法指令的值封装v-loading指令 插槽默认插槽后备内容&#xff08;插槽的默认值&#xff09;具名插槽作用域插槽 自定义指令 自定义指令&#xff1a;自己定义的指令&#xff0c;封装一些dom操作&#xff0c;扩展额外功能 基础语法 全局注册&am…

2024年TI杯E题-三子棋游戏装置方案分享-jdk123团队-第四弹 第二题

往期回顾 前期准备 摄像头bug解决 手搓机械臂 视觉模块的封装 下面是题目部分&#xff1a; 第二问我们继续延续第一问的思路&#xff1a; 将棋子坐标与棋盘上标定的坐标进行绑定。 代码展示&#xff1a; import RPi.GPIO as GPIO import time import cv2 import numpy as…