Mybatis——快速入门

介绍

MyBatis是一款优秀的持久层(Dao层)框架,用于简化JDBC的开发。MyBatis 底层是基于 JDBC 实现的,它封装了 JDBC 的大部分功能,使得数据库操作更加便捷和高效。同时,MyBatis 也保留了 JDBC 的灵活性,允许开发者编写定制化的 SQL 语句,以满足复杂的业务需求。

创建Mybatis项目

新建模块

在idea中新建模块,命名为springboot-mybatis-quickstart作为Mybatis启动的练习,生成器类型选择Spring Intializr(用于创建springboot项目),类型选择Maven(用于管理项目),在下一步添加2个依赖MybatisFramework和MySQL Driver(Mybaits框架和MySQL驱动)

 项目结构

 创建好的springboot项目有以下重要结构:

1、src/main/java,包含项目的所有Java源代码,是Java源代码目录

2、src/main/resources,包含项目的配置文件、静态资源和模板文件

3、src/main/java,包含项目的测试代码

pom.xml文件中则引入了各种依赖。

使用Mybatis操作数据库

数据库连接

src/main/resources/application.properties中配置数据库连接信息

创建UseMapper接口

我们在src/main/java下新建UseMapper接口

package com.itheima.mapper;import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;@Mapper //在运行时,会自动生成该接口的实现类对象(代理对象), 并且将该对象交给IOC容器管理
public interface UserMapper {//查询全部用户信息@Select("select * from user")public List<User> list();//此方法包含在@Select注解之中}

UserMapper接口被标记为@Mapper,MyBatis会自动为其生成实现类(程序在运行时会自动创建该接口的代理对象,并且会将代理对象放到IOC容器中),开发者可以通过UserMapper接口直接调用数据库操作。

在接口内编写对数据库的操作,要进行什么操作就加入相应的注解(比如要进行查询操作,则在方法上加@Select注解),在注解后括号内写入SQL语句,随后声明方法。

这么做就相当于注解的SQL语句是方法体,调用方法时会自动执行这个SQL语句。比如调用list方法,就会直接从数据库中查询数据并自动封装到list集合中

创建User类

由于要把查询到的数据封装到list集合中,那么就可以定义一个类接收集合中的每一个元素

@Data
@NoArgsConstructor//无参构造注解
@AllArgsConstructor//全参构造注解
public class User {private Integer id;private String name;private Short age;private Short gender;private String phone;
}

操作数据库

我们在test包中的SpringbootMybatisQuickstartApplicationTests(测试类)中,先创建userMapper的实体类对象,随后调用userMapper中的list方法,就会查询数据库中的所有数据并封装到userList集合中

SpringBootTest //springboot整合单元测试注解
class SpringbootMybatisQuickstartApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testListUser(){List<User> userList = userMapper.list();userList.stream().forEach(user -> {System.out.println(user);});}
}

user表中的原始数据如下:

运行测试类中的方法,结果如下:

已经查询到了user表中的所有数据 ,这就是一个简单的Mybatis运用实例

使用Mybatis进行增删改查

先在数据库中创建dept(部门表)和emp(员工表)

参数占位符

 #{...}

执行SQL时,会将#{….}替换为?,生成预编译SQL,会自动设置参数值。

使用时机:参数传递

${...}

拼接SQL。直接将参数拼接在SQL语句中,存在SQL注 入问题。

使用时机:如果对表名、列表进行动态设置时使用。

增加

创建Emp类用来存放员工对象和EmpMapper接口,EmpMapper中声明添加数据的函数。

在数据添加成功后,需要获取插入数据库数据的主键则要加@Options注释。

@Options(keyProperty = "id"/*返回的主键封装到id字段中*/,useGeneratedKeys = true/*获取返回的主键*/)
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +"            VALUES (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);

随后在测试类中调用insert方法。

 //新增员工@Testpublic void testInsert(){//构造员工对象Emp emp = new Emp();emp.setUsername("Tom3");emp.setName("汤姆3");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2000,1,1));emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);//执行新增员工信息操作empMapper.insert(emp);System.out.println(emp.getId());}

随后表中插入相关数据,并在控制台打印出了Tom3的id

删除

在EmpMapper中声明函数

//根据ID删除数据@Delete("delete from emp where id = #{id}")public void delete(Integer id);//#{id}是占位符,delete方法形参id传递后会赋值给这个占位符

在测试类中调用此方法 ,则会将id为16的数据删除

/根据ID删除@Testpublic void testDelete(){//int delete = empMapper.delete(16);//System.out.println(delete);empMapper.delete(16);}

修改

在EmpMapper中声明函数,根据id修改员工信息

//更新员工@Update("update emp set username = #{username}, name = #{name}, gender = #{gender}, image = #{image}," +" job = #{job}, entrydate = #{entrydate}, dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")public void update(Emp emp);

在测试类中调用此方法 ,id为10的员工信息将会被更新

//更新员工@Testpublic void testUpdate(){//构造员工对象Emp emp = new Emp();emp.setId(10);emp.setUsername("Tom1");emp.setName("汤姆1");emp.setImage("1.jpg");emp.setGender((short)1);emp.setJob((short)1);emp.setEntrydate(LocalDate.of(2000,1,1));emp.setUpdateTime(LocalDateTime.now());emp.setDeptId(1);//执行更新员工操作empMapper.update(emp);}

查询

在EmpMapper中声明函数,根据id查询员工信息,将员工信息封装到Emp类作为返回值

 @Select("select * from emp where id = #{id}")public Emp getById(Integer id);

注:由于字段名和类中变量名不一定相同(字段名有_变量名是小驼峰),所以有些字段数据无法正确封装到类中的变量中

解决方式:开启mybatis的驼峰命名自动映射开关,在application.properties文件中配置mybaits驼峰命名自动映射开关

随后在测试类中调用此方法,将查询到的员工信息封装到Emp对象中并返回

 @Testpublic void testGetById(){Emp emp = empMapper.getById(20);System.out.println(emp);}

控制台中正确打印出id为10的员工信息

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

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

相关文章

通信原理-思科实验五:家庭终端以太网接入Internet实验

实验五 家庭终端以太网接入Internet实验 一实验内容 二实验目的 三实验原理 四实验步骤 1.按照上图选择对应的设备&#xff0c;并连接起来 为路由器R0两个端口配置IP 为路由器R1端口配置IP 为路由器设备增加RIP&#xff0c;配置接入互联网的IP的动态路由项 5.为路由器R1配置静…

锁相环 vivado FPGA

原理 同步状态/跟踪状态&#xff1a;相位差在2kπ附近&#xff0c;频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带&#xff1a;delta w的最大值&#xff0c;大于这个值的话就不能捕获鉴相器&#xff08;PD-phase discriminator&#xff09;&#xff1a;相乘加LPF&…

Vue3 FileReader:readAsBinaryString() 过时,要使用readAsArrayBuffer来代替。

1、先上张图&#xff1a; 2、官网 developer.mozilla.org https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader/readAsBinaryString ​​​​​​​FileReader接口的 readAsBinaryString() 方法用于开始读取指定 Blob 或 File 对象的内容。当读操作完成后&#xff0…

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒&#xff0c;那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理&#xff1f; 就是用起来的时候要左翻右翻 &#xff1a;&#xff1a; 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

Redis 7.x 系列【29】集群原理之自动故障转移

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示3. 工作原理3.1 故障检测3.2 排名3.3 延迟等待3.4 投票3.5 上位 1.…

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架&#xff0c;较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…

东京裸机云多IP服务器全面分析

东京裸机云多IP服务器是一种提供多IP地址分配和高性能网络服务的云计算解决方案&#xff0c;广泛应用于需要多IP管理和高稳定性的网络应用。下面将从几个方面具体介绍东京裸机云多IP服务器&#xff0c;rak部落为您整理发布东京裸机云多IP服务器的全面分析。 在数字化时代&#…

深入探讨:如何在Shopee平台上安全运营多个店铺?

在Shopee平台上&#xff0c;卖家如何避免店铺被关联&#xff1f;这是一个关乎账号安全和业务持续性的重要问题。Shopee严格规定每个卖家只能拥有一个店铺&#xff0c;以维护市场竞争公平和购物体验的稳定性。如果你开了多个店铺被平台判定关联&#xff0c;会面临冻结或封禁的风…

扫雷-C语言

一、前言&#xff1a; 众所周知&#xff0c;扫雷是一款大众类的益智小游戏&#xff0c;它的游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 今天&#xff0c;我们的目的就是通过C语言来实现一个简…

SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比 spark1 vs spark2 vs spark3 1、spark1引入内存计算的理念&#xff0c;解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率&#xff0c;但也带来了大量的内存管理问题&#xff0c;典型的如内存oom问题频发。…

javaEE-02-servlet

文章目录 Servlet 技术servlet程序示例通过实现Servlet接口实现Servlet程序通过继承 HttpServlet 实现 Servlet 程序 Servlet的声明周期 ServletConfig 类ServletContext 类HttpServletRequest 类请求的转发 HttpServletResponse 类请求重定向 HTTP 协议GET 请求Post请求常用请…

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…

网工最常用的10个网络命令,但凡有一个不会用都不算资深网工。

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 当网工&#xff0c;日常工作不仅需要面对各种各样的网络设备和配置&#xff0c;还需要处理不断出现的网络故障…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是&#xff1a; 2.3.…

使用DataGrip连接DM达梦数据库(手动添加达梦数据库驱动)

文章目录 一、准备达梦数据库驱动从官网下载驱动下载后&#xff0c;解压&#xff0c;本次选择&#xff0c;DmJdbcDriver18安装&#xff1a; 二、配置达梦驱动打开DataGrip&#xff0c;点击左上角的"Database Explorer"下的加号按钮&#xff0c;选择"Driver"…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号&#xff1a;在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

数据隐私保护与区块链技术的结合:新兴趋势分析

在当今数字化时代&#xff0c;数据隐私保护成为了一个备受关注的重要话题。随着个人数据的不断生成和流通&#xff0c;如何有效保护用户的隐私成为了技术创新的一个重要方向。区块链技术作为一种去中心化、安全性高且可追溯的技术手段&#xff0c;正在逐渐成为解决数据隐私保护…

aiohttp 的使用

基本介绍 aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块&#xff0c; 它即提供了服务端&#xff0c; 又提供了客户端。其中&#xff0c;我们用服务端可以搭建一个支持异步处理的服务器&#xff0c;这个服务器就是用来处理请求并返回响应的&#xff0c;类似于 Django , Fla…

Ansible的脚本-----playbook剧本【下】

目录 实战演练六&#xff1a;tags 模块 实战演练七&#xff1a;Templates 模块 实战演练六&#xff1a;tags 模块 可以在一个playbook中为某个或某些任务定义“标签”&#xff0c;在执行此playbook时通过ansible-playbook命令使用--tags选项能实现仅运行指定的tasks。 playboo…

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…