[MyBatis系列①]增删改查

news2024/11/19 9:32:35

目录

1、基础回顾

2、例子引入

3、映射文件

4、增删改查

4.1、add

4.2、delete

4.3、update

4.4、check

5、核心配置文件

5.1、properties

5.2、typeAliases

5.2.1、自定义

5.2.2、⭐MyBatis自带

5.3、environments

5.3.1、environment

5.3.2、transactionManager

5.3.3、dataSource

5.4、 mapper

6、API

6.1、SqlSessionFactoryBuilder

6.2、SqlSessionFactory

6.3、SqlSession


1、基础回顾

MyBatis基础:Java Web - MyBatis

下面用几张图片简单回顾:

原始的JDBC查询操作:

原始的JDBC插入操作:

2、例子引入

对于MyBatis的具体操作,这里以一个小的例子进行快速上手操作:

下面准备环境:

创建Maven Model,在pom.xml引入坐标

pom.xml

最重要的便是mybatis和mysql坐标:

总的pom文件如下:

<?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>mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <uriEncoding>UTF-8</uriEncoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <!--mybatis坐标-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <!--mysql驱动坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
            <scope>runtime</scope>
        </dependency>
        <!--单元测试坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!--日志坐标-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.12</version>
        </dependency>
    </dependencies>
</project>

初始化数据库

SQL语句:

CREATE DATABASE mybatis;
USE mybatis;
CREATE TABLE user(
        id INT(11) NOT NULL AUTO_INCREMENT,
        username VARCHAR(50),
        password VARCHAR(50),
        PRIMARY KEY(id)
);
DESCRIBE user;

编写User实体类

package com.xzl.domain;

/**
 * @author 逐梦苍穹
 * @date 2023/8/23 17:44
 */
public class User {
    private int id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

编写核心配置文件mybatis-config.xml

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--通过properties标签加载外部properties文件-->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/xzl/domain/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

编写SQL映射文件UserMapper.xml(后面这部分代码还会有变动,这里先保持不变)

测试

这里为了方便测试,还需要一个log4j日志框架(也可以使用Logback):

log4j.properties

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

MyBatisTest

/**
 * @author 逐梦苍穹
 * @date 2023/8/23 23:21
 */
public class MyBatisTest {
    @Test
    public void findAll_test1() throws IOException {
        //加载核心配置文件
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
        //获得sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
        //获得sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行sql语句
        List<User> userList = sqlSession.selectList("userMapper.findAll");
        //打印结果
        System.out.println(userList);
        //释放资源
        sqlSession.close();
    }
}

测试结果:

3、映射文件

4、增删改查

涉及修改数据库内容的操作一定要手动提交事务!!mybatis默认不提交事务

基本流程:

        加载核心配置文件

        获得sqlSession工厂对象

        获得sqlSession对象

        执行sql语句

        (提交事务)

        释放资源

对前三步进行抽取:

4.1、add

Java代码:

映射文件:

这里涉及到一个主键自增的问题,没有办法封装对象,则采用先执行再封装的方式,例子如下:

注意事项:

  1. 插入语句使用insert标签
  2. 在映射文件中使用parameterType属性指定要插入的数据类型
  3. Sql语句中使用#{实体属性名}方式引用实体中的属性值
  4. 插入操作使用的API是sqlSession.insert("命名空间.id",实体对象);
  5. 插入操作涉及数据库数据变化,所以要使用sqlSession对象显示的提交事务,即sqlSession.commit()

4.2、delete

Java代码:

映射文件:

注意事项:

  1. 删除语句使用delete标签
  2. Sql语句中使用#{任意字符串}方式引用传递的单个参数
  3. 删除操作使用的API是sqlSession.delete("命名空间.id",Object);

4.3、update

Java代码:

映射文件:

注意事项:

  1. 修改语句使用update标签
  2. 修改操作使用的API是sqlSession.update(“命名空间.id”,实体对象);

4.4、check

5、核心配置文件

配置项

描述

configuration

根元素,包含整个配置的主要部分

properties

定义属性值,然后在配置中引用

settings

配置 MyBatis 的全局设置

typeAliases

定义 Java 类型的别名

typeHandlers

配置自定义的类型处理器

objectFactory

指定对象工厂的类名

plugins

配置自定义的插件

environments

配置不同的数据库环境

environment

environments内部,定义具体的数据库环境

transactionManager

指定事务管理器的类型

dataSource

配置数据库连接的数据源

databaseIdProvider

配置不同数据库的 SQL 语句和语法

mappers

指定映射器(Mapper)的位置

5.1、properties

实际开发中,习惯将数据源的配置信息单独抽取成一个properties文件,该标签可以加载额外配置的properties文件

5.2、typeAliases

5.2.1、自定义

类型别名是为Java 类型设置一个名字,用于简化代码量。

原来:

在mybatis-config.xml设置别名:

设置别名后:

5.2.2MyBatis自带

上面是自定义的别名,mybatis框架已经为设置好一些常用的类型的别名:

别名

对应的Java类型

string

java.lang.String

byte

java.lang.Byte

long

java.lang.Long

short

java.lang.Short

int

java.lang.Integer

integer

java.lang.Integer

double

java.lang.Double

float

java.lang.Float

boolean

java.lang.Boolean

char

java.lang.Character

character

java.lang.Character

date

java.util.Date

decimal

java.math.BigDecimal

bigdecimal

java.math.BigDecimal

biginteger

java.math.BigInteger

object

java.lang.Object

list

java.util.List

arraylist

java.util.ArrayList

map

java.util.Map

hashmap

java.util.HashMap

5.3、environments

配置不同的数据库环境(如开发、测试、生产)

5.3.1、environment

支持多环境配置:

5.3.2、transactionManager

事务管理器(transactionManager)类型有两种:

①JDBC:这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。

②MANAGED:这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如JEE应用服务器的上下文)。默认情况下它会关闭连接,然而一些容器并不希望这样,因此需要将 closeConnection 属性设置为false 来阻止它默认的关闭行为。

5.3.3、dataSource

数据源(dataSource)类型有三种:

①UNPOOLED:这个数据源的实现只是每次被请求时打开和关闭连接。

②POOLED:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。

③JNDI:这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

5.4、 mapper

该标签的作用是加载映射的,加载方式有如下几种:

①使用相对于类路径的资源引用,例如:

<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

②使用完全限定资源定位符(URL),例如:

<mapper url="file:///var/mappers/AuthorMapper.xml"/>

③使用映射器接口实现类的完全限定类名,例如:

<mapper class="org.mybatis.builder.AuthorMapper"/>

④将包内的映射器接口实现全部注册为映射器,例如:

<package name="org.mybatis.builder"/>

6、API

6.1、SqlSessionFactoryBuilder

SqlSessionFactory build(InputStream inputStream) 通过加载mybatis的核心文件的输入流的形式构建一个SqlSessionFactory对象

其中, Resources 工具类,这个类在 org.apache.ibatis.io 包中。

Resources 类帮助开发者从类路径下、文件系统或 一个 web URL 中加载资源文件。

6.2SqlSessionFactory

SqlSessionFactory 有多个个方法创建 SqlSession 实例。常用的有如下两个:

方法

解释

openSession()

会默认开启一个事务,但事务不会自动提交,

也就意味着需要手动提交该事务,更新操作数据才会持久化到数据库中

openSession(boolean autoCommit)

参数为是否自动提交,如果设置为true,

那么不需要手动提交事务

6.3、SqlSession

SqlSession 实例在 MyBatis 中是非常强大的一个类。

在这里你会看到所有执行语句、提交或回滚事务和获取映射器实例的方法。

执行语句的方法主要有:

操作事务的方法主要有:

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

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

相关文章

DataWhale 机器学习夏令营第三期——任务二:可视化分析

DataWhale 机器学习夏令营第三期 学习记录二 (2023.08.23)——可视化分析1.赛题理解2. 数据可视化分析2.1 用户维度特征分布分析2.2 时间特征分布分析 DataWhale 机器学习夏令营第三期 ——用户新增预测挑战赛 学习记录二 (2023.08.23)——可视化分析 2023.08.17 已跑通baseli…

论文解读:Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions

发布时间&#xff1a;2022.4.4 (2021发布&#xff0c;进过多次修订) 论文地址&#xff1a;https://arxiv.org/pdf/2112.08088.pdf 项目地址&#xff1a;https://github.com/wenyyu/Image-Adaptive-YOLO 虽然基于深度学习的目标检测方法在传统数据集上取得了很好的结果&#xf…

【C++数据结构】二叉搜索树

【C数据结构】二叉搜索树 目录 【C数据结构】二叉搜索树二叉搜索树概念二叉搜索树操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的实现二叉搜索树的应用二叉搜索树的性能分析 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.8.22 前言&#xff1a;二…

MySQL数据库管理操作

MySQL常用的数据类型 int&#xff1a;整型 用于定义整数类型的数据float&#xff1a;单精度浮点4字节32位准确表示到小数点后六位double&#xff1a;双精度浮点8字节64位char&#xff1a;固定长度的字符类型用于定义字符类型数据。Char如果存入数据的实际长度比指定长度要…

前端工程化概述

软件工程定义&#xff1a;将工程方法系统化地应用到软件开发中 前端发展历史 前端工程化的发展历史可以追溯到互联网的早期阶段&#xff0c;随着前端技术的不断演进和互联网应用的复杂化&#xff0c;前端工程化也逐渐成为了前端开发的重要领域。以下是前端工程化的主要发展里程…

诚迈科技子公司智达诚远与Unity中国达成合作,打造智能座舱新时代

2023 年 8 月 23 日&#xff0c;全球领先的实时 3D 引擎 Unity 在华合资公司 Unity 中国举办发布会&#xff0c;正式对外发布 Unity 引擎中国版——团结引擎&#xff0c;并带来专为次世代汽车智能座舱打造的团结引擎车机版。发布会上&#xff0c;诚迈科技副总裁、诚迈科技子公司…

C 实现Window/DOS 键盘监听事件

今天是重新复习C语言实现的第一天&#xff0c;今天想编写C 对Windwos/Dos 键盘事件的学习。但是我在安装Visual Studio 2022 没有安装MFC 框架&#xff0c;今天记录下VS追加 MFC框架。 Visual Studio 2022 追加MFC 1、打开vs&#xff0c;点击创建新项目&#xff0c;右侧滑动框…

【ubuntu】 20.04 网络连接器图标不显示、有线未托管、设置界面中没有“网络”选项等问题解决方案

问题 在工作中 Ubuntu 20.04 桌面版因挂机或不当操作&#xff0c;意外导致如下问题 1、 Ubuntu 网络连接图标消失 2、 有线未托管 上图中展示的是 有线 已连接 &#xff0c;故障的显示 有限 未托管 或其他字符 3、 ”设置“ 中缺少”网络“选项 上图是设置界面&#xff0c…

Excel 分组排名

分组排名 公式&#xff1a;SUMPRODUCT((A:AA2)*(C:C>C2)) 1 降序&#xff1a;> 改为 < ⚠️注意1&#xff1a;此处空值参与排名&#xff1b;不参与排名则公式改为&#xff1a;IF(C2“”,“”,SUMPRODUCT((A:AA2)*(C:C>C2)) 1) ⚠️注意2&#xff1a;相同值的项…

多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测

多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现SABO-CNN-GRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现BiTCN-BiGRU-Attention多变量时间序列预测。 模型描…

大数据数据仓库

一.在线教育 1.数据采集 1.数仓概念 数据仓库是为企业制定决策&#xff0c;提供数据支持的。数据采集和存储、对数据进行计算和分析 2.项目架构 2.数据分类 业务数据 用户行为数据 爬虫数据 2.离线数仓 3.实时数仓

.NET 8 Preview 7 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth 排版&#xff1a;Alan Wang .NET 8 Preview 7 现在已经发布&#xff0c;其中包括了对 ASP.NET Core 的许多重要更新。 以下是预览版本中新增功能的摘要&#xff1a; 服务器和中间件 防伪中间件 API 编写 最小 API 的防伪集成 Native AOT 请求委托…

【Modbus通信实验三】数据切片问题

在做两个串口相互通信的实验中&#xff0c;当发送频率快一点时偶尔会遇到以下情景&#xff0c;即一次send中把原数据拆成两份发送&#xff0c;就会导致CRC校验错误。下图中6字节数据拆成42是把SetRThreshold()阈值设为2&#xff0c;当设为1的情况下则会拆成51。 一开始以为是缓…

一款轻量级开发者工具,提高开发效率

Devkits Devkits 是一款轻量级桌面端应用&#xff0c;提供了一系列开发者工具&#xff0c;提高开发效率。 离线。类似的在线工具已经不少了&#xff0c;但是大多数都是在线的&#xff0c;网络不好的时候就很难用了。Devkits 提供了离线使用的功能&#xff0c;可以在没有网络的…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及JDBC示例(4)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

使用NXP GUI GUIDER生成的GUI移植到雅特力MCU平台过程详解(ST/GD/国民/极海通用)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录 一、前言 上一篇我们有介绍NXP GUI Guider工具如何制作和调试GUI&#xff0c;GUI神器 NXP GUI GUIDER开发工具入门教程https://blog.csdn.n…

【云计算】Docker特别版——前端一篇学会

docker学习 文章目录 一、下载安装docker&#xff08;一&#xff09;Windows桌面应用安装&#xff08;二&#xff09;Linux命令安装 二、windows注册登录docker三、Docker的常规操作(一)、基本的 Docker 命令(二)、镜像操作(三)、容器的配置(四)、登录远程仓库 四、镜像管理(一…

视频转音频mp3怎么弄?

视频转音频mp3怎么弄&#xff1f;在很多人看来&#xff0c;音频就是视频中的一部分&#xff0c;其实这时是一定道理的&#xff0c;视频是一种包含图像和有声音的多媒体文件&#xff0c;没有声音的视频是不完美的。时代发展到现在&#xff0c;短视频已经融入了我们生活的方方面面…

ElementUI中的日历组件加载无效的问题

在ElementUI中提供了一个日历组件。在某些场景下还是比较有用的。只是在使用的时候会有些下坑&#xff0c;大家要注意下。   官网提供的信息比较简介。我们在引入到项目中使用的时候可以能会出现下面的错误提示。 Unknown custom element: <el-calendar> - did you …

【Spring】Spring循环依赖

目录 什么是循环依赖问题 循环依赖具体是怎么解决的 具体的解决步骤&#xff1a; 通俗实例&#xff1a; 严谨的循环依赖解决图例 为什么使用的是三级缓存&#xff0c;二级缓存不够用吗&#xff1f; 什么是循环依赖问题 Spring的循环依赖是指在Bean之间存在相互依赖关…