当前位置: 首页 > news >正文

Mybatis快速入门,Mybatis的核心配置文件

Mybatis快速入门

  • 一、Mybatis简介
    • 1.1Mybatis简化JDBC
  • 二、Mybatis快速入门
    • 2.1创建user表,添加数据
    • 2.2创建模块,导入坐标
    • 2.3编写Mybatis核心配置文件 --> 替换连接信息,解决硬编码问题
    • 2.4编写SQL映射文件 --> 统一管理sql语句,解决硬编码问题
    • 2.5编码
      • 2.5.1定义pojo类
      • 2.5.2加载核心配置文件,获取SqlSessionFactory对象
      • 2.5.3获取SqlSession对象,执行SQL语句
  • 总结

一、Mybatis简介

1.1Mybatis简化JDBC

简介:

  • Mybatis是一款优秀的持久层框架,用于简化JDBC开发
  • Mybatis本是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了gppgle code,并且改名为Mybatis。2013年11月迁移到Github
  • 官网:https://mybatis.org/mybatis-3/zh/index.html
  • 持久层:
    • 负责将数据保存到数据库的那一层代码
    • JavaEE三层架构:表现层、业务层、持久层
  • 框架:
    • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
    • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

JDBC缺点:

  • 1.硬编码
    • 注册驱动,获取连接
    • SQL语句
  • 2.操作繁琐
    • 手动设置参数
    • 手动封装结果集

Mybatis简化JDBC

  • 配置文件
    • Mybatis将一些注册驱动的步骤写入配置文件中,将来直接读取配置文件里的信息就可以了
    • SQL语句也是直接被抽取到配置文件中,在对应的配置文件中直接写SQL语句即可
    • 参数封装通过映射的关系,就可以将结果封装起来,在调用时只需调用该映射中的方法直接使用。

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

二、Mybatis快速入门

需求:查询user表中所有数据

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

2.1创建user表,添加数据

  • 在对应的mysql数据库中,先创建一个数据库mybatis,再建一个表,表名为tb_user,创建代码如下:
create database mybatis;
use mybatis;drop table if exists 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 VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

在这里插入图片描述

2.2创建模块,导入坐标

  • 1.创建一个Maven的项目
  • 1.1点击File->NEW->Project

在这里插入图片描述


  • 1.2.选择Maven->NEXT

在这里插入图片描述


  • 1.3.在NAME中输入项目名称,点击Finish就创建好了

在这里插入图片描述


  • 2配置pom.xml内的坐标
  • 2.1根据mybatis官网上的步骤,需要将mybatis的依赖导入到pom.xml文件中,即如下代码:
	<!--mybatis 依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version></dependency>
  • 2.2要连接数据库,就需要导入mysql驱动:
	<!-- mysql 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency>
  • 2.3单元测试:
	<!--    junit单元测试  --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope></dependency>
  • 2.4为了观察方便,可以添加一些日志的依赖:
	<!-- 添加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>
  • 再导入日志依赖的同时,还需要引入一个配置文件logback.xml将它放在resources目录下,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!--CONSOLE :表示当前的日志信息是可以输出到控制台的。--><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern></encoder></appender><logger name="com.practice" level="DEBUG" additivity="false"><appender-ref ref="Console"/></logger><!--level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 默认debug<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。--><root level="DEBUG"><appender-ref ref="Console"/></root>
</configuration>

2.3编写Mybatis核心配置文件 --> 替换连接信息,解决硬编码问题

  • 根据mybatis官网的提示,编写Mybatis核心配置文件需要配置一个xml文件,将此xml文件同样建立在resources目录下,文件中的内容在官网中的示例如下,我们需要修改其中的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://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><mapper resource="org/mybatis/example/BlogMapper.xml"/></mappers>
</configuration>
    • 1.修改value="${driver}"value的值为"com.mysql.jdbc.Driver"
    • 2.修改value="${url}"value的值为"jdbc:mysql:///数据库名?useSSL=false"注意,这里一定要仔细输入,写错任何一个字符都有可能运行失败
    • 3.修改value="${username}"value的值为自己数据库的登录名(一般为root
    • 4.修改value="${password}"value的值为自己数据库的登录密码
    • resource="org/mybatis/example/BlogMapper.xml"的值为对应的sql的映射文件,之后我们再回来修改

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

  • 编写SQL映射文件,我们取名为UserMapper.xml,添加到resources目录下,官网提供如下写法:
<?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="org.mybatis.example.BlogMapper"><select id="selectBlog" resultType="Blog">select * from Blog where id = #{id}</select>
</mapper>
    • 1.其中namespace为命名空间,作为sql映射的唯一标识,在这里我们取名为test
    • 2.这里select表示的是查询的sql,对应还有添加、修改、删除等的写法,这里我们用的是查询,id可以定义为id="selectAll"
    • 3.resultType表示返回值的类型,这里由于我们要查找tb_user表中的全部数据,所以返回的可以是一个User集合,即resultType="com.practice.pojo.User",关于"com.practice.pojo.User"在下面定义pojo类中讲解
    • 4.编写sql语句,直接在select * from Blog where id = #{id}位置写入sql语句select * from tb_user;即可
  • 此文件配置好后,上一步的映射文件就可以修改了,即resource="UserMapper.xml"

2.5编码

2.5.1定义pojo类

  • 这个类的路径在上面编写SQL映射文件中写过,就是"com.practice.pojo.User",是在src.main.java目录中的,最后的java文件User.java中与对应mysql数据库的tb_user表的字段值相同,只是将它们以java类的方式封装了起来,对应如下代码:
package com.practice.pojo;/*** @Author YJ* @Date 2023/7/24 10:47* Description:User*/
public class User {private Integer id;private String userName;private String password;private String gender;private String addr;public User() {}public User(Integer id, String userName, String password, String gender, String addr) {this.id = id;this.userName = userName;this.password = password;this.gender = gender;this.addr = addr;}/*** 获取** @return id*/public Integer getId() {return id;}/*** 设置** @param id*/public void setId(Integer id) {this.id = id;}/*** 获取** @return userName*/public String getUserName() {return userName;}/*** 设置** @param userName*/public void setUserName(String userName) {this.userName = userName;}/*** 获取** @return password*/public String getPassword() {return password;}/*** 设置** @param password*/public void setPassword(String password) {this.password = password;}/*** 获取** @return gender*/public String getGender() {return gender;}/*** 设置** @param gender*/public void setGender(String gender) {this.gender = gender;}/*** 获取** @return addr*/public String getAddr() {return addr;}/*** 设置** @param addr*/public void setAddr(String addr) {this.addr = addr;}public String toString() {return "User{id = " + id + ", userName = " + userName + ", password = " + password + ", gender = " + gender + ", addr = " + addr + "}";}
}

2.5.2加载核心配置文件,获取SqlSessionFactory对象

  • 同样在src.main.java下创建一个测试类取名为(随意的)MybatisDemo.java,放在com.practice包下
    • 1.加载mybatis的核心配置文件,获取SqlSessionFactory,可以参考官网:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    • resource 的值就是之前配置的mybatis文件"mybatis-config.xml"
  • 2.获取SqlSession对象,执行SQL
SqlSession sqlSession = sqlSessionFactory.openSession();

2.5.3获取SqlSession对象,执行SQL语句

  • 1.执行sql语句并打印结果
//这里就是调用的`UserMapper.xml`中的sql语句,通过test查找到selectAll执行sql语句
List<Object> users = sqlSession.selectList("test.selectAll");
System.out.println(users);
  • 2.释放资源
sqlSession.close();
  • 最后结果如下

在这里插入图片描述

  • 完整的测试代码如下:
package com.practice;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;/*** @Author YJ* @Date 2023/7/24 10:53* Description: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.执行sql语句List<Object> users = sqlSession.selectList("test.selectAll");System.out.println(users);//4.释放资源sqlSession.close();}}

总结

通过这篇文章,我们可以对Mybatis有了基本的认识,并能初步掌握Mybatis的用法与特性,欢迎各位小伙伴三连+关注!!!

相关文章:

Mybatis快速入门,Mybatis的核心配置文件

Mybatis快速入门 一、Mybatis简介1.1Mybatis简化JDBC 二、Mybatis快速入门2.1创建user表&#xff0c;添加数据2.2创建模块&#xff0c;导入坐标2.3编写Mybatis核心配置文件 --> 替换连接信息&#xff0c;解决硬编码问题2.4编写SQL映射文件 --> 统一管理sql语句&#xff0…...

go语言中defer执行顺序

defer 执行顺序和调用顺序相反&#xff0c;类似于栈后进先出。 defer在 return 之后执行&#xff0c;但在函数推出之前&#xff0c;defer可以修改返回值。 func test() int {i : 0defer func() {fmt.Println("defer1")}()defer func() {i 1fmt.Println("defe…...

webpack xxx is not a constructor

环境 webpack5.88.2 vue-router 按需引入 原因 模块循环引用导致 有A B C三个模块 A B模块import C 中导出的class c又依赖B 中Class 的方法 B 又依赖C中的class 此时会导致import 的 C 为undefined...

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)

安装支持MFC的vs2019&#xff08;解决MSBuild 错误 MSB8041、MSB8042&#xff09; 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后&#xff0c;即可解决MSBuild 错误 MSB8041 MSB8041&#xff1a;此项目需要 MFC/ATL 库。 https://learn.mic…...

校园电气安全风险分析及预防措施 安科瑞 许敏

摘要:校园属于人员密集场所&#xff0c;若安全风险排查、管控不到位&#xff0c;可能导致安全事故发生&#xff0c;造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故&#xff0c;是构成校园安全威胁之一&#xff0c;笔者通过对校园发生的电气安全事故案例原因分析…...

机器学习之十大经典算法

机器学习算法是计算机科学和人工智能领域的关键组成部分&#xff0c;它们用于从数据中学习模式并作出预测或做出决策。本文将为大家介绍十大经典机器学习算法&#xff0c;其中包括了线性回归、逻辑回归、支持向量机、朴素贝叶斯、决策树等算法&#xff0c;每种算法都在特定的领…...

系统架构设计师 11:未来信息综合技术

本章花了很多笔墨来写各项技术的发展历程&#xff0c;可以了解一下。 一、信息物理系统 信息物理系统&#xff08;Cyber-Physical Systems&#xff0c;CPS&#xff09;是控制系统、嵌入式系统的扩展与延伸。 CPS典型的应用场景有&#xff1a;健康管理、智能维护、远程征兆性…...

Docker 数据管理[文件互访] 端口映射[暴露端口提供服务] 容器互联[指定容器名防止IP变动]

Docker 的数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷&#xff08;宿主机与容器间传输 防止删除容器后数据丢失&#xff09; 数…...

【stable diffusion】保姆级入门课程04-Stable diffusion(SD)图生图-局部重绘的用法

目录 0.本章素材 1.什么是局部重绘 2.局部重绘和涂鸦有什么不同 3.操作界面讲解 3.1.蒙版模糊 3.2.蒙版模式 3.3.蒙版蒙住的内容 3.4.重绘区域 4.局部重绘的应用&#xff08;面部修复&#xff09; 5.课后训练 0.本章素材 chilloutmix模型(真人模型)百度地址&#xf…...

制作Java8环境Docker镜像

制作Java8环境Docker镜像 这里介绍如何制作一个java8环境的镜像&#xff0c;用于运行java应用程序。 1.安装包 这里采用OpenJDK&#xff0c;不会涉及版本问题。 同样思源中文字体也是开源的&#xff0c;没有版权问题。 OpenJDK8&#xff1a;OpenJDK8U-jdk_x64_linux_hotsp…...

抖音SEO源码开发指南:介绍如何开发抖音SEO源码的基本步骤和要点。

一、 抖音SEO源码开发指南&#xff1a; 确定目标&#xff1a;首先要明确开发抖音SEO源码的目标是什么&#xff0c;是提高搜索排名还是增加用户量等。根据不同的目标来制定开发策略和思路。 分析竞争&#xff1a;对于同类产品&#xff0c;要进行竞争分析&#xff0c;了解对手的…...

【SDOF振荡器的非线性-非弹性多轴时间响应分析】用于SDOF振荡器非线性非弹性时程分析的鲁棒性分析研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 进行SDOF振荡器的非线性非弹性时程分析的鲁棒性分析研究&#xff0c;旨在探究该方法对不同系统参数和分析条件变化的稳定性和可靠性。以下是一…...

VMPWN的入门系列-1

5.1 实验一 VMPWN1 5.1.1 题目简介 这是一道基础的VM相关题目&#xff0c;VMPWN的入门级别题目。前面提到VMPWN一般都是接收字节码然后对字节码进行解析&#xff0c;但是这道题目不接受字节码&#xff0c;它接收字节码的更高一级语言&#xff1a;汇编。程序直接接收类似”mov…...

将标签中某一个类别添加到另一个标签中

现在有两张CItyscapes数据集的标签&#xff0c;假设我想把第二张图骑车的人添加到第一张图&#xff0c;暂且不考虑添加位置的变换&#xff0c;那么该如何操作呢&#xff1f; 1&#xff1a;将骑车的人和车作为两个类别独立于其他的类别出来。 2&#xff1a;将这两个类别作为一个…...

将指定图片控件中的图片闪烁

/// <summary> /// 将指定图片控件中的图片闪烁 /// </summary> /// <param name"pic">需要闪烁的图片控件</param> public static void FlashImage(object picBox) { try …...

【MySQL】表的增删查改

目录 一、Create创建 1、单行数据全列插入 2、多行数据指定列插入 3、插入更新 4、替换 二、Retrieve查询 1、SELECT 列 1.1、 全列查询 1.2、指定列查询 1.3、查询字段为表达式 1.4、结果去重 2、where条件 2.1、英语不及格的同学及英语成绩 ( < 60 ) 2.2、语…...

Python 爬虫的学习 day01 ,爬虫的基本知识, requests 和 charde模块, get函数的使用

1.Python 爬虫 1.1什么是网络爬虫 网络爬虫&#xff0c;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本&#xff0c;另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.2 网络爬虫的特…...

【数据挖掘】时间序列的傅里叶变换:用numpy解释的快速卷积

一、说明 本篇告诉大家一个高级数学模型&#xff0c;即傅里叶模型的使用&#xff1b; 当今&#xff0c;傅里叶变换及其所有变体构成了我们现代世界的基础&#xff0c;为压缩、通信、图像处理等技术提供了动力。我们从根源上理解&#xff0c;从根本上应用&#xff0c;这是值得付…...

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的&#xff0c;按token使用量计费 Chatgpt Web API 免费的&#xff0c;只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…...

嵌入式软件—RK3568开发环境搭建

一、RK3568 1.1 开发板特点 BSP比较大&#xff0c;对于电脑内存和存储空间要求高 1.2 BSP BSP&#xff08;Board Support Package&#xff0c;板级支持包&#xff09;&#xff0c;类似于PC系统中BIOS和驱动程序的集合&#xff0c;BSP包含的范围更广&#xff0c;除了外设驱动…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...