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

【SSM】MyBatis(一.基础)

文章目录

  • 1.ORM
  • 2. 数据库表
  • 3. 入门程序
    • 3.1 创建项目
    • 3.2 开发
    • 3.3 一个比较完整规格的mybatis程序
    • 3.4 测试案例 junit
    • 3.5 对第一个mybatis使用junit测试
    • 3.6 集成日志框架logback
    • 3.7mybatis工具类编写

1.ORM

Object(JVM中的Java对象)
Relational(关系型数据库)
Mapping(映射)

在这里插入图片描述

  • mybatis是一个半自动化的ORM,可以将数据库中的一条记录映射到一个Java对象,但是sql语句要自己写,所有说是半自动化。
  • Hibernate是一个全自动化的ORM,不用自己写sql语句。

2. 数据库表

DROP TABLE IF EXISTS `t_car`;
CREATE TABLE `t_car`  (`id` bigint(20) NOT NULL COMMENT '自然主键',`car_num` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车编号',`brand` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车品牌',`guide_price` decimal(10, 2) NULL DEFAULT NULL COMMENT '厂商指导价',`produce_time` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '生产日期',`car_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '汽车类型,燃油车 新能源 氢能源',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

在这里插入图片描述

3. 入门程序

3.1 创建项目

(1)创建一个名为mybatis的空Project
在这里插入图片描述
(2)修改使用JDK17
在这里插入图片描述
(3)修改指向自己下载的maven3.8.8

在这里插入图片描述

3.2 开发

(1)新建maven模块

在这里插入图片描述
(2)resources
放到这个包下面的一般是配置文件,资源,直接放到这里等同于放到类的根目录之下。
在这里插入图片描述
(3)指定打包方式

<packaging>jar</packaging>

(4)引入依赖

	<dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!-- mysql依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.37</version></dependency></dependencies>

(5)编写mybatis核心配置文件:mybatis-config.xml

官网例子:
在这里插入图片描述

(6)编写XxxxMapper.xml文件
官网例子:
在这里插入图片描述

(7)在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径

<!--执行XxxxMapper.xml文件的路径-->
<!--resource属性会自动从类的根路径下开始查找资源-->
<mapper resource="CarMapper.xml"/>

(8)编写MyBatis程序。

在这里插入图片描述

(9)mybatis的事务管理

* 在mybatis-config.xml文件中,可以通过以下的配置进行mybatis的事务管理<transactionManager type="JDBC"/>
* type属性的值包括两个:JDBC(jdbc)MANAGED(managed)type后面的值,只有以上两个值可选,不区分大小写。
* 在mybatis中提供了两种事务管理机制:第一种:JDBC事务管理器第二种:MANAGED事务管理器
* JDBC事务管理器:mybatis框架自己管理事务,自己采用原生的JDBC代码去管理事务:conn.setAutoCommit(false); 开启事务。....业务处理...conn.commit(); 手动提交事务使用JDBC事务管理器的话,底层创建的事务管理器对象:JdbcTransaction对象。如果你编写的代码是下面的代码:SqlSession sqlSession = sqlSessionFactory.openSession(true);表示没有开启事务。因为这种方式压根不会执行:conn.setAutoCommit(false);在JDBC事务中,没有执行conn.setAutoCommit(false);那么autoCommit就是true。如果autoCommit是true,就表示没有开启事务。只要执行任意一条DML语句就提交一次。* MANAGED事务管理器:mybatis不再负责事务的管理了。事务管理交给其它容器来负责。例如:spring。我不管事务了,你来负责吧。对于我们当前的单纯的只有mybatis的情况下,如果配置为:MANAGED那么事务这块是没人管的。没有人管理事务表示事务压根没有开启。没有人管理事务就是没有事务。* JDBC中的事务:如果你没有在JDBC代码中执行:conn.setAutoCommit(false);的话,默认的autoCommit是true。* 重点:以后注意了,只要你的autoCommit是true,就表示没有开启事务。只有你的autoCommit是false的时候,就表示开启了事务。

(10)小结
在这里插入图片描述

MyBatisIntroductionTest.java

package com.sdnu.mybatis.test;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.FileInputStream;
import java.io.InputStream;public class MyBatisIntroductionTest {public static void main(String[] args) throws Exception{//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//获取SqlSessionFactory对象//Resources.getResourceAsStream默认就是从类的根路径下开始查找资源//一般情况下,一个数据库对应一个SqlSessionFactory对象InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取SqlSession对象SqlSession sqlSession = sqlSessionFactory.openSession();//执行SQL语句// 返回值是影响数据库表中的记录条数int count = sqlSession.insert("insertCar");System.out.println("插入了几条记录?" + count);//手动提交sqlSession.commit();}
}

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="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/sdnu"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><!--执行XxxxMapper.xml文件的路径--><!--resource属性会自动从类的根路径下开始查找资源--><mapper resource="CarMapper.xml"/></mappers>
</configuration>

CarMapper.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="sdkskkdkd"><insert id="insertCar">insert into t_car(id, car_num, brand, guide_price, produce_time, car_type)values (null, '1003', '丰田霸道', 30.00, '2000-10-11', '燃油车')</insert>
</mapper>

3.3 一个比较完整规格的mybatis程序

package com.sdnu.mybatis.test;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;/*** 采用正规的方式写Mybatis*/
public class MyBatisCompleteTest {public static void main(String[] args) {SqlSession sqlSession = null;try {SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));//开启会话,底层开启事务sqlSession = sqlSessionFactory.openSession();//执行sql语句,处理相关业务int count = sqlSession.insert("insertCar");System.out.println(count);//执行到这里,没有发送异常,提交事务sqlSession.commit();} catch (Exception e) {if(sqlSession != null){sqlSession.rollback();}e.printStackTrace();} finally {if(sqlSession != null){sqlSession.close();}}}
}

3.4 测试案例 junit

加入junit依赖

    <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

要测试的类

package com.sdnu.junit.service;public class MathService {public int sum(int a, int b){return a + b;}public int sub(int a, int b){return a - b;}
}

测试方法:

package com.sdnu.junit.service;import org.junit.Assert;
import org.junit.Test;public class MathServiceTest {@Testpublic void sum(){//单元测试有两个重要的方法//一个是实际值(被测试方法真正执行的结果),一个是期望值(期望得到的结果)MathService mathService = new MathService();//实际值int actual = mathService.sum(1, 2);//期望值int expected = 33;//加断言测试结果Assert.assertEquals(expected, actual);}@Testpublic void sub(){MathService mathService = new MathService();int actual = mathService.sub(10, 5);int expected = 5;Assert.assertEquals(expected, actual);}
}

在这里插入图片描述

3.5 对第一个mybatis使用junit测试

添加依赖

        <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>

测试程序

package com.sdnu.mybatis.test;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 org.junit.Test;public class CarMapperTest {@Testpublic void testInsertCar(){SqlSession sqlSession = null;try {SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));//开启会话,底层开启事务sqlSession = sqlSessionFactory.openSession();//执行sql语句,处理相关业务int count = sqlSession.insert("insertCar");System.out.println(count);//执行到这里,没有发送异常,提交事务sqlSession.commit();} catch (Exception e) {if(sqlSession != null){sqlSession.rollback();}e.printStackTrace();} finally {if(sqlSession != null){sqlSession.close();}}}
}

3.6 集成日志框架logback

在这里插入图片描述

logback日志框架实现了slf4j标准。(沙拉风:日志门面。日志标准。)第一步:引入logback的依赖。<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency>第二步:引入logback所必须的xml配置文件。这个配置文件的名字必须叫做:logback.xml或者logback-test.xml,不能是其它的名字。这个配置文件必须放到类的根路径下。不能是其他位置。主要配置日志输出相关的级别以及日志具体的格式。

3.7mybatis工具类编写

SqlSessionUtil.java

package com.sdnu.mybatis.utils;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;/*** mybatis工具类*/
public class SqlSessionUtil {//工具类的构造方法一般是是私有化的//工具类的一般方法一般是静态方法private static SqlSessionFactory sqlSessionFactory;private SqlSessionUtil(){}static {try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession openSession(){return sqlSessionFactory.openSession();}
}

测试

    @Testpublic void testInsertCarByUtil(){SqlSession sqlSession = SqlSessionUtil.openSession();int count = sqlSession.insert("insertCar");System.out.println(count);sqlSession.commit();sqlSession.close();}

相关文章:

【SSM】MyBatis(一.基础)

文章目录1.ORM2. 数据库表3. 入门程序3.1 创建项目3.2 开发3.3 一个比较完整规格的mybatis程序3.4 测试案例 junit3.5 对第一个mybatis使用junit测试3.6 集成日志框架logback3.7mybatis工具类编写1.ORM Object(JVM中的Java对象) Relational(关系型数据库) Mapping(映射) mybat…...

LInux指令之文件目录类

文章目录一、帮助指令二、文件目录类ls指令cd指令 &#xff08;切换目录&#xff09;mkdir指令&#xff08;创建目录&#xff09;rmdir指令&#xff08;删除目录&#xff09;touch指令&#xff08;创建空文件&#xff09;cp指令(拷贝文件)rm指令mv指令cat指令(查看)more指令les…...

【c++】:STL中vector的模拟使用及模拟实现

文章目录 前言一.使用库中vector常用接口二.vector的模拟实现总结前言 上一篇我们讲解了STL中的string的使用和模拟实现&#xff0c;这次我们就来讲解STL中的vector&#xff0c;vector相对于string来说模拟实现会难一些&#xff0c;难点在于迭代器失效问题和深浅拷贝问题。 首…...

C++ STL:vector的使用方法及模拟实现

目录 一. vector概述 二. vector接口函数的使用方法和模拟实现 2.1 vector类模板的成员变量 2.2 构造函数的使用和模拟实现 2.2.1 构造函数的使用方法 2.2.2 构造函数的模拟实现 2.3 析构函数的模拟实现 2.4 赋值运算符重载函数的使用和模拟实现 2.4.1 函数的使用 2.…...

naive UI 的upload组件自定义手动上传图片的base64位

<template><n-upload ref"uploadRef" action"#" :default-upload"false" :custom-request"myUpload"><n-button>点击选择文件</n-button></n-upload><n-button click"submitUpload"> 上…...

信创办公–基于WPS的PPT最佳实践系列(表格和图标常用动画)

信创办公–基于WPS的PPT最佳实践系列&#xff08;表格和图标常用动画&#xff09; 目录应用背景操作步骤图表常用动画效果&#xff1a;擦除效果表格常用动画效果&#xff1a;轮子效果应用背景 文不如表&#xff0c;表不如图。在平时用ppt做总结时&#xff0c;我们会经常用到图…...

Spring Bean实例化和初始化的过程

承接上文Spring Bean生命周期应用程序在运行过程中能否去读取当前系统的环境变量或系统属性?这里涉及到一个非常重要的接口Environment&#xff0c;System.getenv&#xff0c;System.getProperties都是获取当前系统环境变量&#xff0c;Environment接口的实现类AbstractEnviro…...

WorkTool企微机器人接入智能问答

一、前言 最新版的企微机器人已经集成 Chat &#xff0c;无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程&#xff0c;来快速配置一个自己的企微机器人。 实现的流程如图&…...

C导入正则库问题

环境 操作系统:win11 专业版 gcc: gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0 编辑器&#xff1a;vscode 要求 在c中使用正则表达式 遇到的问题以及解决思路 C标准中并没有正则表达式库 从其他地方下载正则表达式库即可。 http://gnuwin32.sourcefo…...

尚融宝05-Node.js入门

目录 一、Node.js的概念 1、JavaScript引擎 2、什么是Node.js 二、下载和安装 1、下载和安装 2、查看安装是否成功 三、初始Node.js程序 1、运行一个程序 常见问题 2、文件的读取 3、服务器端程序 三、Node.js的作用 1、Node.js的应用场景 2、BFF 解决什么问题 …...

「SAP ABAP」OPEN SQL(八)【WHERE语句大全】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后端的开发语言A…...

Ribbon负载均衡的原理(源码分析)

SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。1&#xff09;LoadBalancerIntercepor可以看到这里的intercept方法&#xff0c;拦截了用户的HttpRequest请求&#xff0c;然后做了几件事&#xff1a;1.request.getURI()&#xff1a;获取请…...

用sql计算两个经纬度坐标距离(米数互转)

目录 一、sql示例&#xff08;由近到远&#xff09; 二 、参数讲解 三、查询效果 - 距离&#xff08;公里 / 千米&#xff09; 四、查询效果 - 距离&#xff08;米&#xff09; 五、距离四舍五入保留后2位小数&#xff08;java&#xff09; 一、sql示例&#xff08;由近到远…...

C语言详解KMP算法

如果给你一个字符串 和 该字符串的一个子字符串 你能否快速找出该子字符串的所在位置我猜 这里会有一群杠精 说可以找到 真的吗 那下面这个字符串你可以一眼看出来吗你能找出来吗 如果能 算你眼神好 如果不能 那就看看接下来我怎么做你有想到暴力求解法吗&#xff1f;——来自百…...

redis在window上安装与自启动

需求&#xff1a; 客户window服务器使用redis&#xff0c;需要配置成在window服务中&#xff0c;并且可以随着电脑自启动服务。 下载 https://github.com/tporadowski/redis/releases打开上面的下载地址&#xff0c;这里我们下载zip压缩版本。 解压到待安装目录下&#xff…...

字符串匹配【BF、KMP算法】

文章目录:star:BF算法代码实现BF的改进思路:star:KMP算法&#x1f6a9;next数组&#x1f6a9;代码实现优化next数组最终代码⭐️BF算法 BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将主串S的第一个字符与模式串P…...

Leetcode.1616 分割两个字符串得到回文串

题目链接 Leetcode.1616 分割两个字符串得到回文串 Rating &#xff1a; 1868 题目描述 给你两个字符串 a和 b&#xff0c;它们长度相同。请你选择一个下标&#xff0c;将两个字符串都在 相同的下标 分割开。由 a可以得到两个字符串&#xff1a; aprefix和 asuffix&#xff0c…...

剑指 Offer II 033. 变位词组

题目链接 剑指 Offer II 033. 变位词组 mid 题目描述 给定一个字符串数组 strs&#xff0c;将 变位词 组合在一起。 可以按任意顺序返回结果列表。 注意&#xff1a;若两个字符串中每个字符出现的次数都相同&#xff0c;则称它们互为变位词。 示例 1: 输入: strs [“eat”,…...

spring-cloud-sentinel ---流控算法---review

计数器算法 计数器算法&#xff0c;限定每个固定时间能处理的请求总数&#xff0c;例如1分钟100&#xff0c;如果在第一个一分钟&#xff0c;总共请求60次&#xff0c;接着第二个一分钟&#xff0c;counter又会从0 开始技术&#xff0c;如果在1.5分钟的时候&#xff0c;达到了…...

1.浅析NIO 多路复用器selector

一&#xff1a;IO基本介绍 Java共支持3种网络编程IO模式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO 0.Java对BIO、NIO、AIO的支持&#xff1a; Java BIO &#xff1a; 同步并阻塞&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端…...

H5页面如何优雅跳转iOS App Store?解决点击后二次跳转的坑

H5页面如何优雅跳转iOS App Store&#xff1f;解决点击后二次跳转的坑 在移动互联网时代&#xff0c;H5页面与原生App的无缝衔接已经成为提升用户体验的关键环节。特别是对于电商、社交、内容平台等需要引导用户下载App的场景&#xff0c;如何实现从H5页面到iOS App Store的平…...

OpenCore技术方案:老旧设备系统兼容性深度解析与性能优化评估

OpenCore技术方案&#xff1a;老旧设备系统兼容性深度解析与性能优化评估 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 1. 问题剖析&#xff1a;为何老旧Ma…...

从编译到定制:WinSCP全流程开发指南

从编译到定制&#xff1a;WinSCP全流程开发指南 【免费下载链接】winscp WinSCP is a popular free file manager for Windows supporting SFTP, FTP, FTPS, SCP, S3, WebDAV and local-to-local file transfers. A powerful tool to enhance your productivity with a user-fr…...

为什么90%的词库转换都会失败?输入法词库迁移的终极解决方案:全方位指南

为什么90%的词库转换都会失败&#xff1f;输入法词库迁移的终极解决方案&#xff1a;全方位指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 在数字化时代&#x…...

DLSS Swapper实战手册:游戏性能调优与版本管理深度解析

DLSS Swapper实战手册&#xff1a;游戏性能调优与版本管理深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏中的DLSS版本过时而烦恼吗&#xff1f;DLSS Swapper为您提供了一套完整的解决方案&#xf…...

从零配置深度学习环境:Anaconda+PyTorch GPU版+Jupyter全流程详解

从零构建深度学习开发环境&#xff1a;Anaconda与PyTorch GPU实战指南 在开始深度学习项目前&#xff0c;搭建一个稳定高效的开发环境是每个开发者必须跨越的第一道门槛。不同于普通Python开发&#xff0c;深度学习环境需要处理GPU驱动、CUDA加速库、框架版本匹配等一系列复杂问…...

Java开发者指南:CV_UNet图像着色模型集成实战

Java开发者指南&#xff1a;CV_UNet图像着色模型集成实战 1. 引言 作为一名Java开发者&#xff0c;你可能经常遇到需要处理图像着色的场景。比如老照片修复、黑白影像上色&#xff0c;或者给设计稿添加色彩。传统方法要么效果一般&#xff0c;要么需要深厚的技术背景。现在有…...

基于Docker与CUDA的YOLOv5/v7高效部署实战指南

1. 环境准备&#xff1a;从零搭建CUDADocker开发环境 第一次在Docker里跑YOLOv5时&#xff0c;我盯着满屏的CUDA版本报错差点崩溃。后来才发现&#xff0c;环境配置就像搭积木&#xff0c;底层没摆正&#xff0c;上层再漂亮也会塌。下面分享我验证过的环境搭建方案&#xff0c…...

windows java jar 包后台运行

使用 javaw 实现后台运行&#xff08;简单场景&#xff09;这是最简单的方法。Java 自带的 javaw.exe 是 java.exe 的变体&#xff0c;它运行程序时不会打开任何控制台窗口。操作步骤&#xff1a;创建一个新的文本文件&#xff0c;命名为 start.bat。在文件中写入以下内容&…...

MySQL数据恢复实战:从frm和ibd文件重建完整数据表

1. MySQL数据恢复实战&#xff1a;从frm和ibd文件重建完整数据表 数据库管理员最怕听到的就是"数据丢了"三个字。我经历过好几次半夜被叫起来处理数据丢失的紧急情况&#xff0c;那种头皮发麻的感觉至今难忘。不过别担心&#xff0c;只要.frm和.ibd文件还在&#xff…...