MyBatis项目的创建和增删查改操作详解

MyBatis项目的创建和增删查改操作详解

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis是基于JDBC实现的,但是比JDBC的操作更加方便,可以通过接口和XML来操作数据库。本文将详细介绍MyBatis项目的创建以及增删查改操作。

一、MyBatis项目的创建

创建MyBatis项目通常分为以下几个步骤:

  1. 准备开发环境

    在创建MyBatis项目之前,需要确保已经安装了JDK和IDE(如IntelliJ IDEA或Eclipse)。同时,需要准备好数据库和数据库驱动。

  2. 创建新项目

    在IDE中创建一个新的Java项目,并选择Maven作为构建工具。Maven可以帮助我们管理项目的依赖和构建过程。

  3. 添加MyBatis依赖

    在项目的pom.xml文件中添加MyBatis的依赖。例如:

    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
    </dependency>
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
    </dependency>
    

    这里我们添加了MyBatis和MySQL驱动的依赖。

  4. 配置数据库连接

    在项目的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><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/yourdatabase?useSSL=false&serverTimezone=UTC"/><property name="username" value="yourusername"/><property name="password" value="yourpassword"/></dataSource></environment></environments><mappers><!-- 这里将添加Mapper XML文件的路径 --></mappers>
    </configuration>
    

    yourdatabaseyourusernameyourpassword替换为实际的数据库名、用户名和密码。

  5. 创建实体类和Mapper接口

    根据数据库表的结构,创建相应的实体类和Mapper接口。实体类用于表示数据库中的一条记录,Mapper接口用于定义数据库操作的方法。

    例如,假设我们有一个user表,结构如下:

    CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL,email VARCHAR(100)
    );
    

    对应的实体类User可能如下:

    public class User {private Integer id;private String username;private String password;private String email;// getters and setters
    }
    

    对应的Mapper接口UserMapper可能如下:

    public interface UserMapper {User getUserById(Integer id);List<User> getAllUsers();void insertUser(User user);void updateUser(User user);void deleteUser(Integer id);
    }
    
  6. 编写Mapper XML文件

    src/main/resources目录下创建与Mapper接口对应的XML文件。例如,UserMapper.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="com.example.mapper.UserMapper"><select id="getUserById" parameterType="int" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}</select><select id="getAllUsers" resultType="com.example.entity.User">SELECT * FROM user</select><insert id="insertUser" parameterType="com.example.entity.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email})</insert><update id="updateUser" parameterType="com.example.entity.User">UPDATE user SET username = #{username}, password = #{password}, email = #{email} WHERE id = #{id}</update><delete id="deleteUser" parameterType="int">DELETE FROM user WHERE id = #{id}</delete>
    </mapper>
    

    mybatis-config.xml文件的<mappers>标签中引入这个XML文件:

    <mappers><mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
    
  7. 编写Service和Controller

    为了将Mapper接口的方法暴露给外部调用,通常需要编写Service和Controller层。Service层负责业务逻辑的处理,Controller层负责接收外部请求并调用Service层的方法。

    例如,UserService可能如下:

    @Service
    public class UserService {@Autowiredprivate UserMapper userMapper;public User getUserById(Integer id) {return userMapper.getUserById(id);}public List<User> getAllUsers() {return userMapper.getAllUsers();}public void insertUser(User user) {userMapper.insertUser(user);}public void updateUser(User user) {userMapper.updateUser(user);}public void deleteUser(Integer id) {userMapper.deleteUser(id);}
    }
    

    UserController可能如下:

    @RestController
    @RequestMapping("/users")
    public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Integer id) {User user = userService.getUserById(id);return ResponseEntity.ok(user);}@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {List<User> users = userService.getAllUsers();return ResponseEntity.ok(users);}@PostMappingpublic ResponseEntity<Void> insertUser(@RequestBody User user) {userService.insertUser(user);return ResponseEntity.status(HttpStatus.CREATED).build();}@PutMappingpublic ResponseEntity<Void> updateUser(@RequestBody User user) {userService.updateUser(user);return ResponseEntity.status(HttpStatus.OK).build();}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Integer id) {userService.deleteUser(id);return ResponseEntity.status(HttpStatus.NO_CONTENT).build();}
    }
    
二、MyBatis的增删查改操作
  1. 查询操作

    查询操作通常通过Mapper接口中的select方法实现。例如,上面的getUserByIdgetAllUsers方法就是通过select语句查询数据库中的记录。

  2. 新增操作

    新增操作通常通过Mapper接口中的insert方法实现。在插入记录时,如果数据库表的主键是自增的,可以通过useGeneratedKeyskeyProperty属性将生成的主键值赋值给实体类的相应属性。

  3. 更新操作

    更新操作通常通过Mapper接口中的update方法实现。在更新记录时,需要指定要更新的字段和条件。

  4. 删除操作

    删除操作通常通过Mapper接口中的delete方法实现。在删除记录时,需要指定删除的条件。

三、注意事项
  1. 事务管理

    在进行增删改操作时,通常需要开启事务管理以确保数据的一致性和完整性。MyBatis支持声明式事务管理和编程式事务管理两种方式。

  2. 异常处理

    在进行数据库操作时,可能会遇到各种异常情况,如SQL语法错误、数据库连接失败等。因此,在编写代码时需要做好异常非常抱歉,关于异常处理的主题,我接下来会继续展开。

异常处理是编程中的一个重要概念,它允许程序在运行时遇到错误或异常情况时,能够优雅地处理这些错误,而不是直接崩溃或终止。异常处理机制使得程序更加健壮和可靠,提高了用户体验和系统的稳定性。

在大多数编程语言中,异常处理通常通过try-catch(或类似的)结构来实现。try块中包含了可能抛出异常的代码,而catch块则用于捕获并处理这些异常。

  1. try块:将可能抛出异常的代码放在try块中。当try块中的代码抛出异常时,程序会立即跳转到相应的catch块(如果有的话)。

  2. catch块:catch块用于捕获并处理try块中抛出的异常。每个catch块都指定了一个异常类型,并包含处理该类型异常的代码。如果try块中的代码抛出了一个与catch块中指定的类型相匹配的异常,那么该catch块就会被执行。

  3. finally块(可选):finally块中的代码无论是否发生异常都会执行。它通常用于释放资源,如关闭文件、数据库连接等。

总之,异常处理是编程中不可或缺的一部分。通过合理使用异常处理机制,我们可以编写出更加健壮、可靠和易于维护的代码。

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

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

相关文章

OpenGL 进阶系列06 - OpenGL变换反馈(TransformFeedback)

一:概述 变换反馈(Transform Feedback)是 OpenGL 中的一项技术,允许你将顶点着色器的输出(例如变换后的顶点数据)直接传输到缓冲区,而不是将结果渲染到屏幕上。它在图形计算中非常有用,尤其在粒子系统、模拟、几何处理等场景中,可以用来获取顶点处理的中间结果,并将其…

测度论原创(三)

Morden Prob 文章目录 Morden ProbWeek3多维扩展和随机向量定理3.1推论&#xff1a;random variable的变换定理3.2 连续函数的可测性定理3.3 可测函数的线性组合关于拓展实数集的延伸定理3.4 可测函数的极限依旧为可测性随机变量的概率律&#xff08;Law of X X X&#xff09;…

macOS 应用公证指南:使用 fastlane 实现自动化公证流程

背景介绍 在 macOS 系统上,为了保护用户安全,Apple 要求开发者对未通过 Mac App Store 分发的应用程序进行公证(Notarization)。如果应用程序没有经过公证,用户在运行时会看到警告弹窗,这会影响用户体验。虽然开启沙箱模式的应用可以直接通过 App Store 分发来避免这个问题…

数学建模(基于Python实现)--灰色关联分析法讲解,含案例

前言 这是去年底学数学建模老哥的建模课程笔记&#xff1b; 未来本人将陆陆续续的更新数学建模相关的一些基础算法&#xff0c;大家可以持续关注一下&#xff0c;主要在于运用&#xff1b; 提示&#xff1a;数学建模只有实战才能提升&#x1f525;​&#x1f525;​&#x1f…

C++虚继承演示

在继承中如果出现&#xff1a; 这种情况&#xff0c;B和C都继承了A&#xff0c;D继承了B、C 在D中访问A的成员会出现&#xff1a; 这样的警告 是因为在继承时A出现两条分支&#xff1a;ABD、ACD 编译器不知道访问的A中的元素是经过B继承还是C继承 所以B、C在继承A时要用到…

硬件---1电路设计安全要点以及欧姆定律

前言&#xff1a; 一直搞的东西都偏软件&#xff0c;硬件也一直在学&#xff0c;元器件、基础电路知识、PCB设计、模电运放都学的马马虎虎&#xff0c;因此决定进行系统性学习&#xff0c;内容基本来源于手里的视频和书本以及自己的感悟。 一电路安全 1电路安全 在初期基础…

pytest简单使用

一&#xff1a;Mark 1.注册标记 在项目根目录下创建固定名为 pytest.ini 的配置文件&#xff0c;文件格式需要加上 [pytest] &#xff0c;然后通过 markers 注册自定义标记 2.贴上标记 通过pytest加上装饰器&#xff0c;然后pytest.mark.XX配置自定义的标记&#xff0c;一个…

[Meachines] [Medium] MonitorsThree SQLI+Cacti-CMS-RCE+Duplicati权限提升

信息收集 IP AddressOpening Ports10.10.11.30TCP:22&#xff0c;80 $ nmap -p- 10.10.11.30 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0) | …

二叉树-哈夫曼树的构造和应用

重点:哈夫曼树的构造和应用(编码) 选取完最小权值的两个节点后新结点的权值是二者之和,新节点可以和选取剩余的结点结合,也可以在剩余的里面选出最小两个结合后形成的新结点与第一个新结点结合(前提他们是最小的两个结点) 哈夫曼编码 哈夫曼编码优化 130为最小的带权路径长度 …

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…

鸿蒙开发:ArkUI Toggle 组件

ArkUI提供了一套完整的UI开发工具集&#xff0c;帮助开发者高效完成页面的开发。它融合了语言、编译器、图形构建等关键的应用UI开发底座&#xff0c;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能以及实时界面预览工具等&#xff0c;可以支持…

CTF —— 网络安全大赛

前言 &#x1f4bb;随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff…

数据分析-43-时间序列预测之深度学习方法GRU

文章目录 1 时间序列1.1 时间序列特点1.1.1 原始信号1.1.2 趋势1.1.3 季节性和周期性1.1.4 噪声1.2 时间序列预测方法1.2.1 统计方法1.2.2 机器学习方法1.2.3 深度学习方法2 GRU2.1 模拟数据2.2 数据归一化2.3 生成滞后特征2.4 切分训练集和测试集2.5 模型训练2.6 模型预测3 参…

aosp15系统窗口闪屏原生bug-dim图层相关-你会修改吗?

背景 近期各个大厂已经开始准备aosp15的系统rom适配工作了&#xff0c;应该是想2025年初开发发布相关的新机型&#xff0c;所以慢慢的我们也要开始适应aosp15版本的相关问题的修改和研究哈。 近期就有相关学员朋友在做android15相关的dialog开发时候&#xff0c;发现了一个严…

[论文阅读]Enhanced Membership Inference Attacks against Machine Learning Models

Enhanced Membership Inference Attacks against Machine Learning Models 针对机器学习模型的增强型成员推理攻击 Enhanced Membership Inference Attacks against Machine Learning Models | Proceedings of the 2022 ACM SIGSAC Conference on Computer and Communication…

【架构论文-2】架构设计中存在的问题和改进方向

一、性能优化相关 当前情况 在高负载情况下&#xff0c;系统的响应时间出现了一定程度的延迟。特别是在业务高峰期&#xff0c;大量并发请求导致部分关键业务模块的处理效率降低&#xff0c;影响了用户体验。改进方向 计划引入性能分析工具对系统进行全面的性能剖析&#xff0…

嵌入式硬件电子电路设计(三)电源电路之负电源

引言&#xff1a;在对信号线性度放大要求非常高的应用需要使用双电源运放&#xff0c;比如高精度测量仪器、仪表等;那么就需要给双电源运放提供正负电源。 目录 负电源电路原理 负电源的作用 如何产生负电源 负电源能作功吗&#xff1f; 地的理解 负电压产生电路 BUCK电…

GB/T 28046.4-2011 道路车辆 电气及电子设备的环境条件和试验 第4部分:气候负荷(6)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识,希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 第4部分:气候负荷 5. 试验和要求 5.8 流动混合气体腐蚀试验 5.8.1 目的…

QT中 update()函数无法实时调用 paintEvent

QT中 update()函数无法实时调用 paintEvent&#xff01; 在QT中&#xff0c;update()函数用于标记一个窗口区域为“需要重绘”。当调用update()后&#xff0c;QT会在合适的时候调用paintEvent()来重绘这个区域。然而&#xff0c;update()不会立即调用paintEvent()&#xff0c;…

测试概念以及测试bug

关于测试的概念 什么是需求&#xff1f; 需求分为用户需求和软件需求。 软件需求可以作为开发和测试工作的依据&#xff0c;而用户需求不一定是合理的&#xff0c;这里的不合理有很多的角度&#xff1a;技术角度上&#xff0c;市场需求上&#xff0c;投入成本和收益比噔噔。…