MyBatis概述与MyBatis入门程序

MyBatis概述与MyBatis入门程序

  • 一、MyBatis概述
  • 二、入门程序
    • 1.准备开发环境
      • (1)准备数据库
      • (2)创建一个maven项目
    • 2.编写代码
      • (1)打包方式和引入依赖
      • (2)新建mybatis-config.xml配置⽂件
      • (3)新建XXXMapper.xml配置⽂件
      • (4)编写测试代码
      • (5)引入日志
      • (6)MyBatis第⼀个⽐较完整的代码写法
      • (7)MyBatis⼯具类SqlSessionUtil的封装
  • 三、MyBatis事务管理深度剖析
  • 四、总结


  • 框架其实就是对通⽤代码的封装,提前写好了⼀堆接⼝和类,我们可以在做项⽬的时候直接引⼊这些
    接⼝和类(引⼊框架),基于这些现有的接⼝和类进⾏开发,可以⼤⼤提⾼开发效率。

一、MyBatis概述

  • MyBatis本质上就是对JDBC的封装,通过MyBatis完成CRUD。
  • MyBatis在三层架构中负责持久层的,属于持久层框架。
  • MyBatis属于半⾃动化ORM框架,需要自己编写SQL语句。
  • Hibernate属于全⾃动化的ORM框架,不需要自己编写SQL语句。
  • ORM:对象关系映射
    • O(Object):Java虚拟机中的Java对象
    • R(Relational):关系型数据库
    • M(Mapping):将Java虚拟机中的Java对象映射到数据库表中⼀⾏记录,或是将数据库表中的⼀⾏记录映射成Java虚拟机中的⼀个Java对象。

二、入门程序

1.准备开发环境

(1)准备数据库

# schema.sql 文件
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article`
(
    `id`          int                                                           NOT NULL AUTO_INCREMENT COMMENT '主键',
    `user_id`     int                                                           NOT NULL COMMENT '作者 ID',
    `title`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文章标题',
    `summary`     varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '文章概要',
    `read_count`  int(11) UNSIGNED ZEROFILL                                     NOT NULL COMMENT '阅读读数',
    `create_time` datetime                                                      NOT NULL COMMENT '创建时间',
    `update_time` datetime                                                      NOT NULL COMMENT '最后修改时间',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = UTF8MB4_0900_AI_CI
  ROW_FORMAT = Dynamic;


DROP TABLE IF EXISTS `article_detail`;
CREATE TABLE `article_detail`
(
    `id`         int                                                   NOT NULL AUTO_INCREMENT COMMENT '注解',
    `article_id` int                                                   NOT NULL COMMENT '文章 ID',
    `content`    text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文章内容',
    PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  CHARACTER SET = utf8mb4
  COLLATE = utf8mb4_0900_ai_ci
  ROW_FORMAT = Dynamic;
# data.sql 文件
-- ----------------------------
-- Records of article
-- ----------------------------
INSERT INTO `article`
VALUES (1, 2021, 'MyBatis概述', 'MyBatis是半自动的ORM框架', 654897, '2024-01-26 03:11:12',
        '2024-02-25 12:11:19');
INSERT INTO `article`
VALUES (2, 2324, 'Spring容器', 'IOC、AOP', 345, '2025-01-19 15:15:57', '2025-02-16 4:19:30');

-- ----------------------------
-- Records of article_detail
-- ----------------------------
INSERT INTO `article_detail`
VALUES (1, 1, 'MyBatis是非常优秀的持久层框架');

(2)创建一个maven项目

  • 可以参考我的博客 ====> IDEA 构建开发环境中的构建一个普通的Maven模块

2.编写代码

(1)打包方式和引入依赖

  • Maven中央仓库可以寻找自己需要的依赖。
 <!--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>com.gdb</groupId>
    <artifactId>mybatis-code</artifactId>
    <version>1.0-SNAPSHOT</version>
     <!--打包方式-->
    <packaging>jar</packaging>

    <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.13</version>
        </dependency>
        <!--mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
    </dependencies>
</project>

(2)新建mybatis-config.xml配置⽂件

  • 在resources根⽬录下新建mybatis-config.xml配置⽂件(可以参考mybatis⼿册拷⻉)。

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//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="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/使用的数据库名"/>
                    <property name="username" value="root"/>
                    <property name="password" value="自己的数据库密码!"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!--sql映射⽂件创建好之后,需要将该⽂件路径配置到这⾥-->
            <mapper resource=""/>
        </mappers>
    </configuration>
    

(3)新建XXXMapper.xml配置⽂件

  • 在resources根⽬录下新建XXXMapper.xml配置⽂件(可以参考mybatis⼿册拷⻉)。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="article">
    <insert id="insertArticle">
       insert into article values
           (null, 9874, 'JavaWeb', 'Filter', 645133, '2026-05-16 12:15:27', '2026-08-16 4:15:30');
    </insert>
</mapper>
  • 将CarMapper.xml⽂件路径配置到mybatis-config.xml 中
    <mappers>
        <!--sql映射⽂件创建好之后,需要将该⽂件路径配置到这⾥-->
        <mapper resource="articleMapper.xml"/>
    </mappers>

(4)编写测试代码

public class TestMyBatis {
    public static void main(String[] args) throws Exception{
        //获取 SqlSessionBuilder 对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //获取 SqlSessionFactory 对象,Resources.getResourceAsReader()默认从类的根路径下加载文件。
        //Resources是MyBatis提供的工具类,源码是 ClassLoder.getSystemClassLoader().getResourceAsStream("类路径下的文件路径");
        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsReader("mybatis-config.xml"));
        //获取 SqlSession 对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行 SQL 语句
        int count = sqlSession.insert("insertArticle");
        System.out.println("插入的记录条数:====> " + count);
        //MyBatis默认关闭的自动提交机制的
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }
}

在这里插入图片描述

(5)引入日志

  • 关于mybatis集成日志组件。让我们调试起来更加的方便。
    • mybatis常见的集成的日志组件有那些呢?
      • SLF4J(沙拉风):沙拉风是一个日志标准,其中有一个框架叫做logback,它实现了沙拉风规范。
      • LOG4J
      • LOG4J2
      • STDOUT_LOGGING
      • 注意:log4j log4j2 logback 都是同一个作者开发的。
    • 中STDOUT_LOGGING是标准日志,mybatis已经实现了这种标准日志。mybatis框架本身已经实现了这种标准。只要开启即可。在mybatis-config.xml文件中使用settings标签进行配置开启。这个标签在编写的时候要注意,它应该出现在environments标签之前。注意顺序。
          <settings>
              <setting name="logImpl" value="STDOUT_LOGGING"/>
          </settings>
      

在这里插入图片描述

(6)MyBatis第⼀个⽐较完整的代码写法

public class TestMyBatis {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            // 1.创建SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 2.创建SqlSessionFactory对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder
                    .build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 3.创建SqlSession对象
            sqlSession = sqlSessionFactory.openSession();
            // 4.执⾏SQL
            int count = sqlSession.insert("insertArticle");
            System.out.println("插入了⼏条记录:" + count);
            // 5.提交
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

(7)MyBatis⼯具类SqlSessionUtil的封装

public class MybatisUtils {
	private static SqlSessionFactory sqlSessionFactory;
 	/**
 	* 类加载时初始化sqlSessionFactory对象
 	*/
 	static {
 		try {
 			SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
 			sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
 	/**
 	* 每调⽤⼀次openSession()可获取⼀个新的会话,该会话⽀持⾃动提交。
 	*/
 	public static SqlSession openSession() {
 		return sqlSessionFactory.openSession(true);
 	}
}
public class TestMyBatis {
    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            sqlSession = MybatisUtils.openSession();
            // 4.执⾏SQL
            int count = sqlSession.insert("insertArticle");
            System.out.println("插入了⼏条记录:" + count);
            // 5.提交
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 6.关闭
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }
}

三、MyBatis事务管理深度剖析

  • 在MyBatis-config.xml文件中,可以通过以下的配置进行MyBatis的事务管理。
    <transactionManager type="JDBC"/>
    
  • type属性的值有两个(不区分大小写):
    • JDBC(jdbc):JDBC事务管理器。由MyBatis框架自己管理事务,自己采用原生的JDBC代码去管理事务。默认是开启事务的,需要自己手动的提交。可以通过以下的方式关闭事务:
      SqlSession sqlSession = sqlSessionFactory.openSession(true);  //关闭事务(自动提交)
      
    • MANAGED(manged) :MANFGED事务管理器。mybatis不再负责事务的管理了。事务交给其他容器来负责。例如:spring.
      • 对于我们当前单纯只有mybatis的情况下,如果设置为MANAGED那么事务这块就没人管了。没有人管理的事务压根就没有开启。

四、总结

  • Maven中央仓库
  • MyBatis中文手册
  • Resources 目录:放在整个目录当中的,一般都是资源文件,配置文件。直接放到Resources 目录下的资源,等同于放到类的根路径下。
  • 以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始加载(开始查找)
  • MyBatis中的主要对象:
    • 在Mybatis当中,负责执行SQL语句的那个对象 ===> SqlSession
      • SqlSession是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。
    • 想要获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。
    • 获取SqlSessionFactory对象,需要首先获取SqlSessionFactoryBuilder对象。通过SqlSessionFactoryBuilder对象的build方法,来获取一个SqlSessionFactory对象。
    SqlSessionFactoryBuilder --> SqlSessionFactory --> SqlSession
    
  • mybatis中的两个主要的配置文件:
    • 其中一个是:mybatis-config.xml,这是核心配置文件,主要配置连接数据库的信息等。(一个)
    • 另一个是:XxxxMapper.xml,这个是专门来编写SQL语句的配置文件。(一个表一个)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

直方图均衡化原理与代码实现

1. 简介 直方图均衡化是一种用于增强图像对比度的图像处理技术。通过调整图像的灰度级别分布&#xff0c;直方图均衡化能够使图像中的像素值更加均匀分布&#xff0c;从而增强图像的细节和对比度。 2. 原理 直方图均衡化的原理是通过调整图像的累积分布函数&#xff08;CDF&…

H2数据库学习总结

H2数据库-简介 H2 是开源的轻量级Java数据库。它可以嵌入Java应用程序中或以客户端-服务器模式运行。 H2 数据库主要可以配置为作为内存数据库运行&#xff0c;这意味着数据将不会持久存储在磁盘上。 由于具有嵌入式数据库&#xff0c;因此它不用于生产开发&#xff0c;而主要…

017 JavaDoc生成文档

什么是JavaDoc 示例 package se;/*** 用于学习Java* author Admin* version 1.0* since 1.8*/ public class Test20240119 {/*** 主方法* param args*/public static void main(String[] args) {// 你好&#xff0c;世界System.out.println("Hello world");} } 写一…

C语言实战项目<贪吃蛇>

我们这篇会使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇 实现基本的功能&#xff1a; 结果如下: 1.一些Win32 API知识 本次实现呢我们会用到一些Win32 API的知识(WIN32 API也就是Microsoft Windows 32位平台的应用程序编程接口): 1)控制窗口大小 我们可以使用…

43 漏洞发现-WEB应用之漏洞探针类型利用修复

目录 已知CMS开发框架末知CMS演示案例:开发框架类源码渗透测试报告-资讯-thinkphp开发框架类源码渗透测试-咨讯-spring已知CMS非框架类渗透测试报告-工具脚本-wordpress已知CMS非框架类渗透测试报告-代码审计-qqyewu_php未知CMS非框架类渗透测试报告-人工-你我都爱的wg哦~ 已知…

Unity 自动轮播、滑动轮播

如图所示&#xff0c;可设置轮播间隔&#xff0c;可左右滑动进行轮播 1.在UGUI创建个Image&#xff0c;添加自动水平组件 2.添加并配置脚本 3.代码如下&#xff0c;都有注释 using UnityEngine; using UnityEngine.UI;public class IndicatorManager : MonoBehaviour {public …

【IM】如何保证消息可用性(二)

请先阅读第一篇&#xff1a;【IM】如何保证消息可用性&#xff08;一&#xff09; 在第一篇文章中我们了解了保证消息可用性的挑战与目标&#xff0c;现在我们来对于具体的技术方案进行探讨。 1. 上行消息 消息上行过程指的是客户端发送消息给服务端 我们需要先辨析几个概念…

mybatis代码生成器配置pojo不生成Example类,且去掉表名前缀t_

待生成的表 mybatis-generator-config.xml的table属性配置如下时生成的pojo和mapper <table tableName"%"></table>正常想要的是去掉T且去掉Example类 <table tableName"%"enableCountByExample"false" enableUpdateByExample&…

初识C语言·文件操作

目录 1 关于文件 i)文件的基本知识 ii)数据文件的分类 2 文件打开和关闭 i)流和标准流 ii)文件指针 iii)文件打开和关闭 3 文件的顺序读写 i) fgetc fputc ii) fgets fputs iii) fscanf fprintf iv) fwrite fread 4 对比一组函数 scanf/fscanf/sscanf/printf/fpri…

(十)springboot实战——springboot3下的webflux项目mysql数据库事务处理

前言 WebFlux 是 Spring Framework 5.0 中引入的一种新型反应式编程模型&#xff0c;支持非阻塞 I/O&#xff0c;适用于高并发、高吞吐量的应用程序。在 WebFlux 应用程序中使用事务需要注意以下几点。使用 Reactive R2DBC&#xff1a;WebFlux 支持使用 Reactive R2DBC 访问关…

前端大厂面试题探索编辑部——第四期

目录 题目 单选题 题解 JavaScript的异步编程 Promise 异步函数async/await 关于Ajax 题目 这期只有一道题&#xff0c;我们来详细讲讲JavaScript的异步编程&#xff0c;当然&#xff0c;异步编程是许多编程语言都有的一种编程思想&#xff0c;我们在前端这个领域&#…

Python爬虫:XPath基本语法

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集&#xff0c;类似于文件系统中的路径表达式。 不啰嗦&#xff0c;讲究使用&#xff0c;直接上案例。 导入 pip3 install lxmlfrom lxml import etr…

springboot中获取配置文件中属性值的几种方式

目录 第一章、使用Value注解第二章、使用PropertySource注解第三章、使用Configurationproperties注解第四章、使用Java Properties类第五章、使用Environment接口 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置…

旋转花键磨损后如何修复?

旋转花键是机械传动中的一种&#xff0c;传递机械扭矩的&#xff0c;在轴的外表有纵向的键槽&#xff0c;套在轴上的旋转件也有对应的键槽&#xff0c;可保持跟轴同步旋转。在旋转的同时&#xff0c;有的还可以在轴上作纵向滑动&#xff0c;如变速箱换档齿轮等。 我们在使用某些…

VirtualBox安装Ubuntu22.04

目录 1、新建虚拟机 1.1、设置内存大小 1.2、创建虚拟硬盘 2、虚拟机设置 2.1、设置启动顺序​编辑 2.2、选择iso镜像文件 2.3、设置网络(桥接网卡) 3、启动 3.1、设置语言环境 3.2、系统更新安装(不更新) 3.3、选择键盘布局(默认即可) 3.4、选择安装类型 3.5、网…

项目实战:一个基于标准库的具备最值获取的万能容器实现

目录 写在前面 需求 分析 接口设计 项目实现 一些思考与总结 致谢 写在前面 刚刚介绍了变参模板和完美转发&#xff0c;现在换一换脑子做一个小的项目实战吧。博主最近学习的是标准库&#xff0c;总体来说&#xff0c;我认为标准库中的内容是很trivial的&#xff0c;重点…

STM32实时时钟(RTC)的配置和使用方法详解

实时时钟&#xff08;RTC&#xff09;是STM32系列微控制器上的一个重要模块&#xff0c;用于提供准确的时间和日期信息。在本文中&#xff0c;我们将详细介绍STM32实时时钟的配置和使用方法。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢…

【C++】默认成员函数

与普通成员函数差距较大&#xff0c;形式对于我们比较陌生&#xff0c;但这是语法&#xff0c;是我们是必须要掌握的。 目录 类的默认成员函数&#xff1a;构造函数&#xff1a;概念&#xff1a;语法&#xff1a;特性&#xff1a; 析构函数&#xff1a;概念&#xff1a;语法&a…

Django模型(七)

一、聚合与分组查询 1.1、准备数据 class Cook(models.Model):"""厨师"""name = models.CharField(max_length=32,verbose_name=厨师名)level = models.IntegerField(verbose_name=厨艺等级)age = models.IntegerField(verbose_name=年龄)sect …

消息中间件之RocketMQ源码分析(三)

RocketMQ中的Consumer启动流程 RocketMQ客户端中有两个独立的消费者实现类分别为DefaultMQPullConsumer和DefaultMQPushConsumer&#xff0c; DefaultMQPullConsumer DefaultMQPullConsumer,该消费者使用时需要用户主动从Broker中Pull消息和消费消息&#xff0c;提交消费位点…