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

二、【MyBatis】 MyBatis入门与简单使用

二、【MyBatis】 MyBatis入门与简单使用

二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据源配置文件3.4 根据数据表生成对应POJO类3.5 编写核心配置文件3.6 测试数据库连通性3.7 编写数据表对应接口3.8 编写映射配置文件3.9 核心配置文件加载映射配置文件3.10 完整核心配置文件3.11 完整测试四、总结

一、什么是ORM

Object Relation Mapping 对象关系映射。对象指的是JAVA对象,关系指的是数据库中的关系模型,对象关系映射,指的就是在JAVA对象和数据库的关系模型之间建立一种对象个关系,比如用一个Java的User类,去对应数据库中的一张表goyeer_user类,类中的属性和表中的列一一对应。User类就对应goyeer_userk类中的一行数据。

二、为什么mybatis是半自动的ORM框架

用Mybatis进行开发,需要手动编写SQL语句。而全自动的ORM框架,如Hibernate,则不需要编写SQL语句。用Hibernate开发,只需要定义好ORM映射关系,就可以直接进行CRUD操作。

2.1 Hibernate优点

  • 开发者不需要熟练地操作SQL语句的编写。Hibernate会根据指定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口执行,所以其开发效率高于Mybatis。

2.2 Hibernate缺点

  • 在多表关联时,对SQL查询的支持较差;

  • 更新数据时,需要发送所有字段;

  • 不支持存储过程;

  • 不能通过优化SQL来优化性能等;

这些问题导致其只适合在场景不太复杂且对性能要求不高的项目中使用。

2.3 MyBatis与Hibernate区别

  • Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己 编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的 sql 语句,并将 java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再映射生成 java 对 象。

  • Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql 执行性 能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运 营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的 前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定 义多套 sql 映射文件,工作量大。、

  • Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如 需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。但是 Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性能和对象 模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。 总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都 是好架构,所以框架只有适合才是最好。

三、Mybatis快速入门

3.1 项目引入Maven相关依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version>
</dependency>

3.2 创建测试数据库

DROP TABLE IF EXISTS `school`;
CREATE TABLE `school` (`Id` int(11) NOT NULL AUTO_INCREMENT,`schoolid` varchar(255) DEFAULT NULL,`schoolcode` varchar(255) DEFAULT NULL,`schoolname` varchar(255) DEFAULT NULL,`province` varchar(255) DEFAULT NULL,PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=2786 DEFAULT CHARSET=utf8mb4;

3.3 编写数据源配置文件

编写 src/main/resources/jdbc.properties数据库连接文件

# 数据库驱动
jdbc.driver=com.mysql.cj.jdbc.Driver 
#jdbc:mysql://IP地址:接口地址/数据库
jdbc.url=jdbc:mysql://localhost:3306/school_db
#登录名
jdbc.username=root
#密码
jdbc.password=123456

3.4 根据数据表生成对应POJO类

package org.goyeer.domain;
@Data
public class School {public int id;public String schoolId;public String schoolCode;public String schoolName;public String province;
}

3.5 编写核心配置文件

src/main/resources/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><!--这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置--><properties resource="jdbc.properties"/><!--MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。--><!--默认使用的环境 ID(比如:default="development")。--><environments default="development"><!--每个 environment 元素定义的环境 ID(比如:id="development")。--><environment id="development"><!--事务管理器的配置(比如:type="JDBC")。--><!--事务管理器(transactionManager)在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。--><transactionManager type="JDBC"/><!--数据源的配置(比如:type="POOLED")--><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>
</configuration>

3.6 测试数据库连通性

@Test
public void testConetion() throws IOException {// 核心配置文件classpath路径String resource = "mybatis-config.xml";// 加载配置文件Reader reader = Resources.getResourceAsReader(resource);// 构建会话工厂SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);// 从SqlSessionFactory对象中获取SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();System.out.println(sqlSession.getConnection());// 归还连接给数据源sqlSession.close();
}

3.7 编写数据表对应接口

com.goyeer.repository.mapper;

package com.goyeer.repository.mapper;
import com.goyeer.domain.School;
import java.util.List;
public interface SchoolMapper {List<School> findAll();School selectOne(int id);
}

3.8 编写映射配置文件

src/main/resources/mapper/SchoolMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=" com.goyeer.repository.mapper.SchoolMapper"><select id="findAll" resultType="org.goyeer.domain.School">select * from school</select><select id="selectOne" resultType="org.goyeer.domain.School">select * from school where id =#{id}</select>
</mapper>

3.9 核心配置文件加载映射配置文件

<mappers><mapper resource="mapper/SchoolMapper.xml"></mapper>
</mappers>

3.10 完整核心配置文件

<?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><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="mapper/EduSchoolMapper.xml"></mapper></mappers>
</configuration>

3.11 完整测试

@Test
public void tstFindAll() throws Exception {String conf_path = "mybatis-config.xml";InputStream resourceStream = Resources.getResourceAsStream(conf_path);SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(resourceStream);SqlSession session = sessionFactory.openSession();SchoolMapper mapper = session.getMapper(SchoolMapper.class);List<School> schools = mapper.findAll();
}

四、总结

我们可以使用Mybatis的注解开发一些简单映射语句,这样可以是代码显得更加简介。对于稍微复杂一点的语句Java 注解不仅力不从心,还会让你本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。

相关文章:

二、【MyBatis】 MyBatis入门与简单使用

二、【MyBatis】 MyBatis入门与简单使用 二、【MyBatis】 MyBatis入门与简单使用一、什么是ORM二、为什么mybatis是半自动的ORM框架2.1 Hibernate优点2.2 Hibernate缺点2.3 MyBatis与Hibernate区别三、Mybatis快速入门3.1 项目引入Maven相关依赖3.2 创建测试数据库3.3 编写数据…...

基于DF模式的协作通信技术matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、DF概述 4.2、DF基本原理 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2013b 3.部分核心程序 clc; clear; close all; warning off; addpath(genpath(pwd))…...

Angular-01:基本架构

各种学习后的知识点整理归纳&#xff0c;非原创&#xff01; ① 概述 angular是一个使用HTML、CSS、TypeScript构建的客户端应用的框架&#xff0c;用来构建单页面应用程序。是一个重量级的框架&#xff0c;内部集成了大量开箱即用的功能模块。是为大型应用开发而设计&#xf…...

字符串划分

题目描述 给定一个小写字母组成的字符串s&#xff0c;请找出字符串中两个不同位置的字符作为分割点&#xff0c;使得字符串分成的三个连续子串且子串权重相等&#xff0c;注意子串不包含分割点。 若能找到满足条件的两个分割点&#xff0c;请输出这两个分割点在字符串中的位置…...

ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.9‘ not found的解决方法

导致该错误的原因&#xff1a;gcc动态库版本太老了 解决方法&#xff1a; 1、编辑~/.bash_profile vim ~/.bash_profile 2、将anaconda3/lib的路径加入库文件的路径 LD_LIBRARY_PATH/your_path/anaconda3/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH 3、重载~/.bash_pr…...

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日&#xff0c;华为云全新上线Serverless应用中心&#xff0c;提供了大量应用模板&#xff0c;让用户能够一键部署函数和周边依赖资源&#xff0c;节省部署时间&#xff0c;快速上手将应用部署到华为云函数计算FunctionGraph&#xff0c;并一键开通周边依赖资源。 本次Serve…...

scrapy的安装和使用

一、scrapy是什么&#xff1a;Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;可以应用在包括数据挖掘&#xff0c;信息处理或存储历史数据等一系列的程序 二、scrapy的安装&#xff1a;pip install scrapy -i https://pypi.douban.com/…...

Kotlin中的异常处理

异常是在程序执行过程中出现的错误或意外情况&#xff0c;可以干扰程序的正常流程。在Kotlin中&#xff0c;我们可以通过异常处理机制来捕获和处理异常&#xff0c;以保证程序的稳定性。本篇博客将介绍异常的产生、捕获、定义、受检异常和finally关键字&#xff0c;并提供相应的…...

[Ubuntu 18.04] 搭建文件夹共享之Samba服务器

Samba是一个开源项目,允许Windows用户在Linux和Unix系统上进行文件共享。 Samba服务器是一个可以让Linux或Unix系统在网络上充当Windows NT/2000/XP/2003等网络操作系统的共享资源的软件。它允许用户通过SMB/CIFS协议在Linux或Unix系统与Windows共享资源。 Samba服务器的主要…...

设计模式-装饰器模式

目录 设计模式-装饰器模式什么是装饰器设计模式&#xff1f;java示例 设计模式-装饰器模式 什么是装饰器设计模式&#xff1f; 装饰器设计模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你通过将对象包装在一个装饰器类中来动态地扩展…...

【Vs code调试C++】

参考文献第一个很重要 主要是配置task.json&#xff0c;其余的可以不用管 参考文献 [1]详解Linux下使用vscode编译运行和调试C/C [2]vscode关于C/C编译运行的一些小配置...

使用 C++创建一个简易的数据库管理系统 (DBMS)

在数据库领域&#xff0c;数据库管理系统 (DBMS) 是一个软件系统&#xff0c;它提供与用户、其他应用程序和数据库之间的接口&#xff0c;用于存储、检索、更新和管理数据。在这篇博客中&#xff0c;我们将学习如何使用 C 创建一个简易的 DBMS&#xff0c;包括事务、并发控制、…...

简单了解一下:NodeJS的WebSocket网络编程

NodeJS的webSocket网络编程。 那什么是WebSocket呢&#xff1f;WebSocket是HTML5提供的一种浏览器和服务器进行通信的网络技术。两者之间&#xff0c;只需要做一个握手动作&#xff0c;就可以在浏览器和服务器之间开启一条通道&#xff0c;就可以进行数据相互传输。 实现WebS…...

目标检测技术概述

什么是目标检测&#xff1f; 在计算机视觉众多的技术领域中&#xff0c;目标检测&#xff08;Object Detection&#xff09;也是一项非常基础的任务&#xff0c;图像分割、物体追踪、关键点检测等通常都要依赖于目标检测。在目标检测时&#xff0c;由于每张图像中物体的数量、…...

软件设计原则-开闭原则讲解以及代码示例

开闭原则 一&#xff0c;介绍 1.前言 开闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的一条重要原则&#xff0c;它由Bertrand Meyer在其著作《面向对象软件构造》中提出&#xff0c;并成为SOLID原则之一。 开闭原则的核心思想是&…...

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…...

LeetCode--180 连续出现的数字

文章目录 1 题目描述2 结果示例3 解题思路3.1 MySQL 代码 4 知识拓展 1 题目描述 Logs表: ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varchar | ----------------------在 SQL 中&#xff0c;id …...

面试算法34:外星语言是否排序

题目 有一门外星语言&#xff0c;它的字母表刚好包含所有的英文小写字母&#xff0c;只是字母表的顺序不同。给定一组单词和字母表顺序&#xff0c;请判断这些单词是否按照字母表的顺序排序。例如&#xff0c;输入一组单词[“offer”&#xff0c;“is”&#xff0c;“coming”…...

常用docker命令 docker_cmd_sheet

查看所有docker 容器 docker ps 查看 特定docker容器 比如con1 docker ps | grep con1 查看镜像 docker images 拉取镜像 docker pull imageXXX 打标签 docker tag imageXXX:1.4.0 镜像名冒号tag 按照docker-compose.yml 启动容器&#xff0c;在有docker-compose…...

算法进阶——数组中的逆序对

题目 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P mod 1000000007 数据范围&#xff1a;对于 50% 的数据, size≤104 对…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...