MyBatis:使用 MyBatis 实现增删改查、各种配置解析

news2024/11/28 14:37:37

文章目录

  • MyBatis:Day 01
  • 一、简介
  • 二、第一个 MyBatis 程序
    • 1. 步骤
    • 2. 注意
  • 三、增、删、改、查
  • 四、扩展
    • 1. Map
    • 2. 模糊查询
  • 五、配置解析(参考手册)
    • 1. 环境配置:environments
    • 2. 属性优化:properties
    • 3. 类型别名:typeAliases
    • 4. 设置:settings
    • 5. 映射器:mappers
  • 注意:

MyBatis:Day 01

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

一、简介

MyBatis 参考文档官网:点此进入。

注意

  1. 数据持久化:程序的数据在持久状态和瞬时状态转化的过程。因为内存中的数据断电即失,所以要将一些数据持久化。数据持久化的方式例如:通过 JDBC 可以将数据持久化到数据库中,通过 IO 可以将数据持久化到文件中;
  2. 持久层:完成持久化工作的代码块MyBatis 是一款优秀的持久层框架

MyBatis 作用:帮助程序员将数据存入到数据库中,传统的 JDBC 代码复杂,MyBatis 是框架,进行了简化

MyBatis 特点


二、第一个 MyBatis 程序

1. 步骤

  • 准备好一个数据库 mybatis,建表,插入数据

  • 新建 Maven 项目,删除 src 文件夹,导入依赖,创建子模块
<!-- mysql 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

  • 在资源 resources 包下,编写 Mybatis 核心配置文件 mybatis-config.xml (可以在官网的参考文档找到,依据情况修改参数
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- configuration 核心配置文件 -->
<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/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=true&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="1142553864qq"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- 每一个 Mapper.xml 都需要在 Mybatis 核心配置文件中注册 -->
    <mappers>
        <mapper resource=""/>
    </mappers>
</configuration>
  • 编写 mybatis 工具类(固定的
public class MybatisUtils {
    
    private static SqlSessionFactory sqlSessionFactory = null;
    static {
        try {
            // 第一步:获取 sqlSessionFactory 对象
            String resource = "mybatis-config.xml";
            InputStream is = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 第二步:获取 sqlSession 对象
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession(true);
    }
}
  • 编写代码(实体类、Dao 接口、接口实现类)
  1. 实体类 User :每一个表都对应了一个实体类,实体类中的属性对应了表中的字段
  2. Dao 接口 UserMapper.java
  3. 接口实现类 UserMapper.xml:Dao 接口的实现类,用 xml 类型的文件配置。

<!-- 实现类 XML 头部和文档类型声明,可以从参考手册中找到 -->
<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace 绑定一个对应的 Dao/Mapper 接口 -->
<mapper namespace="com.Sun3285.dao.UserMapper">
    <select id="getUserList" resultType="com.Sun3285.pojo.User">
        select * from mybatis.user
    </select>
</mapper>
  • 注册:每一个 Mapper.xml 都需要在 Mybatis 核心配置文件中注册
<!-- 第三步中的 Mybatis 核心配置文件:mybatis-config.xml -->
<configuration>
    <environments default="development">
    </environments>
    
    <!-- 每一个 Mapper.xml 都需要在 Mybatis 核心配置文件中注册 -->
    <mappers>
        <mapper resource="com/Sun3285/dao/UserMapper.xml"/>
    </mappers>
<configuration>
  • 测试,使用 Test 注解,测试代码写在 test 文件夹下
public class UserMapperTest {

    @Test
    public void test() {

        // 第一步:获取 sqlSession 对象
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        // 第二步:调用方法 getMapper 方法
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);  // 获得接口
        List<User> userList = userMapper.getUserList();   // 对象调用接口中的方法,得到全部的 userList 对象集合

        for (User user : userList) {
            System.out.println(user);  // 每一个对象对应每一行数据
        }

        // 第三步:关闭 sqlSession
        sqlSession.close();
    }
}
  • 测试结果

2. 注意

  1. 在配置文件 mybatis-config.xmlUserMapper.xml 中头部和文档类型声明中,把编码 encoding 改为 UTF8
  2. 在 Mybatis 核心配置文件 mybatis-config.xml 中注册 Mapper.xml 时,resouce 路径/
  3. resource 的路径中,如果是在资源文件夹 resource 的 xml 文件,就可以直接写文件名;如果是在 java 文件中的,就得写完整路径,如:com/Sun3285/dao/UserMapper.xml

  1. sqlSession 对象相当于 connection 对象;

  2. 注意命名规范

    • Mybatis 核心配置文件命名:mybatis-config.xml
    • 实体类命名:表名
    • 接口(一个接口对应一个实体类)的命名:表名 + Mapper
    • 接口实现类命名:表名 + Mapper.xml
  3. pom.xml 文件中,要在 build 中配置 resources,来防止我们资源导出失败的问题

<!-- 在 build 中配置 resources,来防止我们资源导出失败的问题 -->
<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>

        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>


三、增、删、改、查

步骤

  1. Mapper 接口中编写方法;
  2. 在实现类中编写对应 Mapper 中的 sql 语句(实现接口中的方法);
  3. 测试。

注意

  1. 在写实现类的 sql 语句时:
    • id :接口中的方法名
    • parameterType参数类型,没有可以不写,注意不要写成:parameterMap
    • resultType结果类型,只有查询才有;
    • 自定义的类需要写全限名,如:com.Sun3285.pojo.User
  2. 增、删、改操作需要提交事务sqlSession.commit();
  3. 每个实现方法只能写一条语句;
  4. #{} 相当于占位符{} 中的名字要和实体类中的属性名一一对应(因为这里的参数是从实体类拿出来的)。

代码实现


四、扩展

1. Map

问题:在上面的修改用户中,参数为 User 对象,因此在测试时,要 new 一个用户对象,并且要传入全部的参数,再进行修改。如果只是要修改其中一个字段(属性),就会比较麻烦。

解决方法:使用 Map

举例

  • 根据多个参数(ID 和姓名)查询用户;
  • 修改用户。

总结

  • 参数类型 parameterTypeMap,即使用 map 传递参数,#{键} 会直接在 sql 中取出键对应的值
  • 参数类型 parameterType实体类,即使用对象传递参数,#{属性} 会直接在 sql 中取出属性的值
  • 参数类型若为一个基本数据类型#{变量} 会直接在 sql 中取到变量的值。
  • 使用 Map 集合传参的情况:方法的参数过多、实体类的属性过多(避免 new 对象时,传入所有的参数)。

2. 模糊查询

模糊查询在 Java 代码执行的时候,传递通配符 %_

举例:查询带有“张”的用户。

总结本质还是执行 sql 语句,传递参数正确,使得 sql 语句正确就可以执行完成。


五、配置解析(参考手册)

注意:在配置文件 xml 中,所有的标签都可以规定其顺序(以上的顺序)。

1. 环境配置:environments

MyBatis 可以配置成适应多种环境,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境

注意一些关键点

  • 默认使用的环境 ID(比如:default=“development”);
  • 每个 environment 元素定义的环境 ID(比如:id=“development”);
  • 事务管理器 transactionManager 的配置(比如:type=“JDBC”);
  • 数据源 dataSource 的配置(比如:type=“POOLED”)。

2. 属性优化:properties

  1. 属性可以在外部进行配置,并可以进行动态替换;

  2. 既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置;

  3. 设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。

步骤:编写一个外部配置文件 db.properties、在核心配置文件中引入。

3. 类型别名:typeAliases

  1. 类型别名可为 Java 类型设置一个缩写名字;

  2. 它仅用于 XML 配置,意在降低冗余的全限定类名书写

两种实现方式

  • 直接给实体类起别名:<typeAlias type="com.Sun3285.pojo.User" alias="user"/>
  • 指定一个包名,Mybatis 会在包下搜索需要的 JavaBean:<package name="com.Sun3285.pojo"/>

注意

  1. 第一种方式,是指定到具体的实体类;第二种方式,是指定到包名就可以;
  2. 第二种方式,在没有注解的情况下,会默认使用 Bean 的首字母小写的非限定类名来作为它的别名,例如:com.Sun3285.pojo.User 的别名为 user若有注解,则别名为其注解值
  3. 使用情形
    • 实体类较少时,使用第一种;
    • 实体类较多时,使用第二种,并分别在每个实体类上加注解 @Alias("别名"),不加注解则为默认别名。

4. 设置:settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。

5. 映射器:mappers

  1. 每一个 Mapper.xml 都需要在 MyBatis 核心配置文件中注册;

  2. 映射器:告诉 MyBatis 到哪里去找映射文件。

三种实现方式

  • 【推荐使用】使用相对于类路径的资源引用:<mapper resource="com/Sun3285/dao/UserMapper.xml"/>
  • 使用映射器接口实现类完全限定类名<mapper class="com.Sun3285.dao.UserMapper"/>
  • 内的映射器接口全部注册为映射器:<package name="com.Sun3285.dao"/>

注意

  1. 方式一是路径,用 / ;方式二是实现类的全限名,用 . ;方式三具体到
  2. 使用方式二和方式三的前提:接口和实现类必须同名、必须在同一个包下。


注意:

  1. MyBatis 参考文档官网(中文):https://mybatis.org/mybatis-3/zh/index.html

  2. 技术没有高低之分

  3. 学习思路:搭建环境 --> 导入包 --> 编写代码 --> 测试。

  4. 可以在 mybatis 工具类创建的时候实现自动提交事务:sqlSessionFactory.openSession(true); ,这样在增、删、改操作的时候就不需要手动提交事务了。

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

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

相关文章

中国厨房更净一步:一场科技“下凡”带来的方太式浪漫

世界上恐怕没有任何一个民族&#xff0c;比中国人对美食的情结更悠远了。 正如《菜根谭》里说的&#xff0c;“醲肥辛甘非真味&#xff0c;真味只是淡&#xff1b;神奇卓异非至人&#xff0c;至人只是常”。 寻常人家的一蔬一饭&#xff0c;是厨房里的幸福记忆&#xff0c;也承…

大数据分析案例-基于朴素贝叶斯算法构建微博谣言检测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

干货!ICLR 2023 | 更稳定高效的因果发现方法-自适应加权

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; ╱ 个人简介╱ 张岸 新加坡国立大学NExT实验室博士后&#xff0c;主要研究Robust & Trustable AI。 个人主页&#xff1a;https://anzhang314.github.io/ 01 内容简介 可微分的因果发现方法&#xff0c;是从…

文件管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87734930 更多系统资源库…

365天深度学习打卡第N1周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 一、背景介绍 本节是一个使用PyTorch实现的简单文本分类实战案例。在这个例子中&#xff0c;我们将使用AG News数据集进行文本分类。 AG Ne…

MIPS整数指令实现浮点运算

OVERVIEW 实现上&#xff0c;我采用了空间换时间和实现复杂度的这么一个tradeoff。把每个部分都用一个word来存&#xff0c;这样读取就只要lw就行了&#xff0c;如果到bit级别的话&#xff0c;可能跨越多个byte或者word&#xff0c;那么 我就需要到内存或者cache里面读取更多次…

零售行业如何进行活动前的准备工作

新钛云服已累计为您分享743篇技术干货 背景 零售行业通常会面临618、双十一、周年庆等活动。在面对这些重要的活动通常会担心资源是否需要扩容&#xff1f;应用能否抗住大并发的请求&#xff1f; 本人曾面对过几千大并发请求和客户这边搞活动出现问题的经验教训。希望能通过这些…

安装多个NodeJS windows上安装多个Nodejs版本 解决vue2/vue3同时运行

第一步下载nvm-windowsnvm-windows 下载地址&#xff1a;Github最新下载地址 进入之后直接下载 第二步 安装NVM 注意路径一定不要包含空格 中文否则会报错 点击安装之后 如果之前安装了nodejs的话会提示 希望nvm管理已安装node 版本吗 点击 是 即可 安装完成后 打开 cmd 输入 n…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(五)

如表1所示是dds_ip_transform模块信号列表&#xff0c;在正弦波模块中我们需要把上游指令解析模块中发来的频率控制字和指示信号即dds_din_freq和dds_din_freq_vld、相位控制字和指示信号即dds_din_phase和dds_din_phase_vld、复位信号即ddsip_sclr写入到DDS IP核中&#xff0c…

【数据库】增删改查(进阶)

目录 1、数据库的约束类型 1.1、not noll约束 1.2、unique&#xff08;唯一性约束&#xff09; 1.3、default默认值约束 1.4、primary key&#xff08;主键约束&#xff09; 1.4.1、自增主键&#xff08;关键字auto_increment&#xff09; 1.5、foreign key &#xff08;外…

2023-Hive必备详细教程

Hive涉及的知识点如下图所示&#xff0c;本文将逐一讲解&#xff1a; 一. Hive概览 1.1 hive的简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务…

【 Spark编程基础 】实验3

准备工作 启动Hadoop集群 & Spark • 启动Hadoop集群start-all.sh • 启动Sparkcd /usr/local/spark/spark-2.3.3-bin-hadoop2.6/# ./sbin/start-all.sh 实验数据说明。 • 数据为1970年到2016年&#xff0c;每年各球队的球员比赛数据统计&#xff0c;数据文件的格式如图1所…

数据治理-数据质量篇

1、什么是数据质量 按照国际数据管理协会的《数据管理知识手册》中规定&#xff0c;数据质量&#xff08;DQ&#xff09;是“既指与数据有关的特征&#xff0c;也指用于衡量或改进数据质量的过程。”但要深入理解数据质量&#xff0c;需要切分不同层次或维度。 数据无处不在。…

一种用于地灾边坡大坝安全深度位移监测测斜仪

1用途 固定测斜仪广泛适用于测量土石坝、面板坝、岩土边坡、路堤、基坑、岩石边坡等结构物的水平位移、垂直沉降及滑坡&#xff0c;固定测斜仪配合测斜管可反复使用&#xff0c;并方便实现测量数据的自动采集。 固定测斜仪采用的是耐冲击型倾斜传感器&#xff0c;可靠性好&am…

【可解释AI】图神经网络的可解释性方法及GNNexplainer代码示例

图神经网络的可解释性方法及GNNexplainer代码示例 GNNExplainerIntroductionModelSingle-instance explanations&#xff08;Explanation via Structural Information&#xff09;Joint learning of graph structural and node feature information&#xff08;Explanation via…

Linux常用命令——ip6tables命令

在线Linux命令查询工具 ip6tables linux中防火墙软件 补充说明 ip6tables命令和iptables一样&#xff0c;都是linux中防火墙软件&#xff0c;不同的是ip6tables采用的TCP/ip协议为IPv6。 语法 ip6tables(选项)选项 -t<表>&#xff1a;指定要操纵的表&#xff1b; …

Code area 和Data area的区别

Code Area FLASH &#xff1a;程序在这个flash运行时&#xff0c;几乎没有延时&#xff0c; 运行速度以时钟设置为准。 Data Area FLASH&#xff1a; 程序在这段flash运行时&#xff0c;每条语句都有延时&#xff0c; 最后的速度可能是以10M为时钟&#xff08;举例&#xff09;…

webpack4和webpack5有什么区别

webpack4和webpack5有什么区别 前言一、比较二、使用步骤1.5缓存使用方法和构建速度对比2.资源模块处理3.Webpack 5 支持在请求中处理协议。4.tree-shaking。 前言 Webpack4和Webpack5是两个版本的Webpack&#xff0c;其中Webpack5是Webpack的最新版本。 一、比较 性能&#…

一、Go语言初识

在日新月异的技术进步中,我们程序设计在不断的优化,程序的编译速度,程序的设计速度,程序的可读性等都在不断的提升。在这样的时代背景下,一些技术的先驱,技术的头部公司在不断的探索,GO语言就是在这样的环境中被设计开发的。 我们技术团队也在不断的学习,不断的进步,…

golang入门记录

参考&#xff1a; https://www.runoob.com/go/go-tutorial.html https://zhuanlan.zhihu.com/p/63310903 下载安装包&#xff1a; windows:https://dl.google.com/go/go1.20.2.windows-amd64.msi 对基础设施&#xff0c;包括跨操作系统、网络、多线程&#xff0c;web、cli都比…