MyBatis总结(1)- 初探

news2025/2/23 2:21:27

初次学习应该冒出来的几个问题点:

1. 是什么?

  1. 一款ORM框架(对象关系映射,用来作为连接数据库的桥梁);
  2. Mybatis通过定义配置(mybatis-config),映射(mapper)关系,实现Java POJO与数据库进行交互,完成数据持久化(将程序的数据保存到可永久保存的存储设备中(数据库或IO文件形式存储))操作;
  3. 封装了JDBC(Java数据库连接,提供API来供java程序对数据库进行访问)的操作;
  4. 支持自定义sql(CRUD, 动态SQL),存储过程,高级映射(一对多(联合collection),多对一(关联association)),缓存(一级缓存,二级缓存,自定义缓存)以及简化事务管理(SQLSession #commit,#close)。

2. 为什么?

  1. 免除了JDBC繁琐的代码编写,简化与数据库数据的操作,与Spring完美契合。

3. 怎么用?

通过以下两种方式的实现:JDBC VS Mybatis,可以看出:

  • Mybatis的思想:本质上是对JDBC的"上层建筑"。
  • 原本JDBC的代码上的实现:
    • sql语句与代码的耦合度高,违背了java的高内聚,低耦合的设计原则;
    • 需要管理多个资源:Connection,Statement,ResultSet
  • 从狂神说JAVA的教学视频中得到一句架构真言:
    • 没有什么是加一层解决不了的!!!

4. MyBatis Demo基本实现:

1. 加入依赖

<!--必选项:Mybatis核心依赖 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.16</version>
        </dependency>
        <!--必选项:连接Mysql数据库 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.4.0</version>
        </dependency>
        <!-- 可选项:简化JavaBean的方法定义 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>

2. 配置Mybatis-config.xml

一般放在resources下,以便创建SqlSessionFactory时读取

src/main/resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--引入外部properties文件,设置全部属性 ${}-->
    <properties resource="db.properties"/>

    <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>
    		<!-- 将POJO映射关系引入Mybatis配置中-->
        <mapper class="org.example.daos.UserMapper"/>
    </mappers>

</configuration>

3. 数据相关配置

src/main/resources/db.properties

username=root
password=root
url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=true
driver=com.mysql.cj.jdbc.Driver

4. 编写POJO,Mapper映射关系

POJO User定义:

package org.example.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private int id;
    private String name;
    private String password;
}

UserMapper接口定义:

package org.example.daos;

import org.example.pojo.User;
import java.util.List;

public interface UserMapper {

    List<User> getUserList();
}

UserMapper.xml映射关系定义:一般将该映射xml放在UserMapper.java的同一个包下,以便能在config中注册mapper时被识别[Q1]

<?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="org.example.daos.UserMapper">
	<select id="getUserList" resultMap="User">
        SELECT * FROM mybatis.user
  </select>
</mapper>

5. 在Mapper中定义数据库操作逻辑(CRUD)

6. 可以通过Junit进行验证测试

###################################################

5. 回顾Mybatis之前,采用JDBC编写代码

1. 读写Driver类,完成类加载:

Class.forName("com.mysql.cj.jdbc.Driver")

2. 创建Connection连接:

DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=true", username, password)

3. 创建预编译stament:PreparedStatement,对sql语句进行预编译

connection.prepareStatement(sql);
preparedStatement.setObject(parameterIndex, param);

4. 通过PreparedStatement执行CURD操作

// 经过预编译后,execute执行器无需再传参sql语句

// 查询
preparedStatement.executeQuery();
// 更新
preparedStatement.executeUpdate();

5. 管理事务

// 这里connection是自动管理,系统默认autocommit为true,当需要自定义管理时,需要将autocommit只为false方可: connection.setAutoCommit(false);
connection.commit();
connection.rollback();

6. 关闭资源

// 完成与数据库数据交互后,记得释放关闭资源,也可以通过try-resource语句针对实现AutoCloseable接口的资源进行自动托管

// 一定要按资源顺序倒序关闭(先进后出),否则会报异常
resultSet.close();
preparedStatement.close();
connection.close();

// 自动托管代码片段
try(Connection connection = BaseDao.getConnection();
    PreparedStatement preparedStatement = connection.prepareStatement(sql)){
    resultSet = BaseDao.execute(preparedStatement, resultSet, params);
    while (resultSet.next()) {
        user.setId(resultSet.getInt("id"));
        user.setName(resultSet.getString("name"));
        user.setPwd(resultSet.getString("pwd"));
    }
} catch (Exception e) {
    throw new RuntimeException(e);
}

[Q1]: 将mapper xml放在java目录下要注意:
在打包生成jar后,默认java目录下的资源xml,properties不会被加载:
在这里插入图片描述
解决:需要在pom.xml让项目识别到:

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

加了之后就会被发现:
在这里插入图片描述

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

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

相关文章

Vulnhub-DC-4

靶机IP:192.168.20.138 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 信息收集 nmap扫下端口及版本 dirsearch扫下目录 没发现什么敏感信息&#xff0c;看下前端界面 想到会不会存在SQL注入&#xff0c;弱密码等漏洞。 经过测试SQL注入…

使用紫铜管制作半波天线的折合振子

一、概述 半波天线是一种简单而有效的天线类型&#xff0c;其长度约为工作波长的一半。它具有较好的辐射特性和较高的增益&#xff0c;广泛应用于业余无线电、电视接收等领域。使用紫铜管制作折合振子&#xff0c;不仅可以提高天线的机械强度&#xff0c;还能增强其导电性能。 …

实现开源可商用的 ChatPDF RAG:密集向量检索(R)+上下文学习(AG)

实现 ChatPDF & RAG&#xff1a;密集向量检索&#xff08;R&#xff09;上下文学习&#xff08;AG&#xff09; RAG 是啥&#xff1f;实现 ChatPDF怎么优化 RAG&#xff1f; RAG 是啥&#xff1f; RAG 是检索增强生成的缩写&#xff0c;是一种结合了信息检索技术与语言生成…

【C++软件调试技术】什么是pdb文件?如何使用pdb文件?哪些工具需要使用pdb文件?

目录 1、什么是pdb文件? 2、如何配置生成pdb文件? 3、pdb文件的时间戳和文件名称 3.1、pdb文件的时间戳 3.2、pdb文件的文件名称 4、有pdb文件才能在Visual Studio中调试代码 5、在Windbg中使用pdb文件 5.1、使用lm命令查看二进制文件的时间戳,去查找对应版本的pdb文…

k8s——secret配置资源管理

一、Secret 1.1 Secret定义 Secret是用来保存密码、token、密钥等敏感数据的k8s资源&#xff0c;这类数据虽然也可以存放在Pod或者镜像中&#xff0c;但是放在Secret中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 1.2 Secret类型 kubernetes.io/service-ac…

优思学院|精益生产学习过程中如何提高自己的能力水平?

精益生产是一项实践多过理论的课题。 优思学院认为实践并不限于实际的工作&#xff0c;日常的思考同样重要&#xff0c;例如我们会要求学员在学习时不断思考各种事物&#xff0c;不限于自己的企业。例如当你去到一家餐厅&#xff0c;你能夠观察到什么浪费&#xff1f;你可否把…

JVM 虚拟机

JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机&#xff0c;虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有&#xff1a;JVM、VMwave、Virtual Box等。JVM 是一台被定制过的现实当中不存在的计算…

【全开源】防伪溯源一体化管理系统源码(FastAdmin+ThinkPHP+Uniapp)

&#x1f50d;防伪溯源一体化管理系统&#xff1a;守护品质&#xff0c;追溯无忧 一款基于FastAdminThinkPHP和Uniapp进行开发的多平台&#xff08;微信小程序、H5网页&#xff09;溯源、防伪、管理一体化独立系统&#xff0c;拥有强大的防伪码和溯源码双码生成功能&#xff0…

EXCEL多sheet添加目录跳转

EXCEL多sheet添加目录跳转 背景 excel中有几十个sheet&#xff0c;点下方左右切换sheet太耗时&#xff0c;希望可以有根据sheet名超链接跳转相应sheet&#xff0c;处理完后再跳回原sheet。 方案一 新建目录sheet&#xff0c;在A1写sheet名&#xff0c;右键选择最下方超链接…

usock: No such file or directory

在搭建T113的tina系统时&#xff0c;运行ubusd报错&#xff0c;“usock: No such file or directory” rootTinaLinux:/# ifup -a Failed to connect to ubus /sbin/ifup: line 51: /sbin/wifi: not foundrootTinaLinux:/# ubusd usock: No such file or directory因为运行 ubu…

正确的功能可将热晶体管风速计线性化

处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如&#xff0c;如果传感器响应是对数函数&#xff0c;则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点&#xff08;参见参考论文中的图 4&#xff09;。刚开始时&#xff0…

MySQL-Explain使用

MySQL-Explain使用 type列 type列 这一列表示关联类型或访问类型&#xff0c;即MySQL决定如何查找表中的行&#xff0c;查找数据行记录的大概范围。 依次从最优到最差分别为&#xff1a;system > const > eq_ref > ref > range > index > ALL 一般来说&…

git 提交

当你不小心在master上改了代码&#xff0c;并且add&#xff0c; commit 之后&#xff0c;想push&#xff0c;发现根本push不了&#xff08;本来也不能直接将master代码push到远端&#xff09;&#xff0c;而且每次pull远程master的时候都要和本地的master进行merge &#xff0c…

初级软件测试快速入门

文章目录 初级软件测试-测试用例、缺陷报告的认识与使用软件测试简介测试分类模型质量模型测试模型 用例编写的八大要素用例设计方法缺陷 初级软件测试-测试用例、缺陷报告的认识与使用 软件测试简介 什么是软件测试&#xff1f; 使用技术手段验证软件是否满足需求 主流技能 …

【Linux】系统优化:一键切换软件源与安装Docker

引言 在Linux系统安装完成后&#xff0c;进行一些必要的初始化设置是提升系统性能和用户体验的关键。本文将重点介绍两个实用的一键脚本&#xff1a;LinuxMirrors提供的软件源切换脚本和Docker安装脚本。这两个脚本将帮助我们简化配置安装过程。 一键切换软件源脚本 在Linux…

算法人生(20):从“自注意力机制”看“个人精力怎么管”

我们知道在ChatGPT中&#xff0c;Transformer模型扮演着重要的角色。Transformer 模型通过自注意力机制来建模序列中的依赖关系&#xff0c;从而实现对序列数据的处理的。因为传统的循环神经网络&#xff08;RNN&#xff09;和卷积神经网络&#xff08;CNN&#xff09;在处理长…

【NPS】微软NPS配置802.1x,验证域账号,动态分配VLAN(有线网络续篇)

继上一篇文章中成功实施了有线802.1x验证域账号并动态分配VLAN的策略之后&#xff0c;我们迎来了一个新的目标&#xff1a;在用户验证失败时&#xff0c;自动分配一个Guest VLAN&#xff0c;以确保用户至少能够访问基本的网络服务。这一改进将显著提升网络的灵活性和用户的上网…

此商家的收款功能已被限制,暂无法支付是怎么回事

商家遇到收款功能被限制的情况时&#xff0c;通常是长时间没有交易导致的&#xff0c;还有可能是存在欺诈等风险造成的。不管是什么原因&#xff0c;商家可以按照以下步骤在微信支付商户平台和微信支付商家助手小程序中查看原因并尝试解决问题。 1. 登录微信支付商户平台 首先…

【免费】2021年数学建模国赛C题问题一--基于熵权法和TOPSIS法详细版附Word加代码

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

龙讯旷腾PWmat团队研发的开源机器学习力场PWMLFF升级,新增高效训练NEP模型

近几年来&#xff0c;一种结合了物理学、高性能并行计算和机器学习算法的新的科研范式——AI for science迅速崛起&#xff0c;并为解决精度与尺度无法并存的问题带来了曙光。基于机器学习力场&#xff08;machine learning force field, MLFF&#xff09;的分子动力学&#xf…