Mybatis——快速入门

news2024/11/11 5:49:09

介绍

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 {

    @Autowired
    private UserMapper userMapper;

    @Test
    public 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方法。

 //新增员工
    @Test
    public 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删除
    @Test
    public 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的员工信息将会被更新

//更新员工
    @Test
    public 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对象中并返回

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

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

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

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

相关文章

unity2D游戏开发03状态控制

多态和动画 建立player-idle动画&#xff0c;取玩家最后两个图片 选中playcontroller控制器 将玩家动画拖进去 右键player-idle,选择set as layer Default state 右键点击Any State ,点击Make Transition 结果 动画参数 动画参数是动画控制器定义的变量&#xff0c;点击Param…

Matlab arrayfun 与 bsxfun——提高编程效率的利器!

许多人知道 MATLAB 向量化编程&#xff0c;少用 for 循环 可以提高代码运行效率&#xff0c;但关于代码紧凑化编程&#xff0c; arrayfun 与 bsxfun 两个重要函数却鲜有人能够用好&#xff0c;今天针对这两个函数举例说明其威力。 Matlab arrayfun 概述 arrayfun 是 Matlab …

one-api 源码调试配置

本文主要介绍通过 VSCode 调试 one-api 源码。 一、环境配置 1.1 VSCode 和 one-api 安装 首先,确保已经安装了 VSCode(下载链接)和 one-api 源码(下载链接)已下载并安装了依赖 1.2 安装 Go 插件 在 VSCode 中,安装 Go 插件。 1.3 安装 dlv 调试包 可以通过下载源码…

EEtrade:现货黄金盈利计算方法

现货黄金交易作为一种极具吸引力的投资方式&#xff0c;其盈利计算涉及多个关键因素&#xff0c;投资者需深入理解这些因素&#xff0c;才能准确评估交易结果&#xff0c;并制定科学的投资策略。 一、现货黄金基本盈利计算&#xff1a; 利润公式&#xff1a; 利润 (收盘价 -…

docker部署mysql8.x版本,编写shell脚本自动部署安装mysql

docker部署mysql8.x版本&#xff0c;编写shell脚本自动部署安装mysql **1.**先自行安装好docker环境&#xff0c;docker的镜像注册中心最好是国内的&#xff0c;例如执行一下命令直接修改docker配置&#xff0c; cat <<EOF > /etc/docker/daemon.json {"regist…

LabVIEW学习-LabVIEW处理带分隔符的字符串从而获取数据

带分隔符的字符串很好处理&#xff0c;只需要使用"分隔符字符串至一维字符串数组"函数或者"一维字符串数组至分隔符字符串"函数就可以很轻松地处理带分隔符地字符串。 这两个函数所在的位置为&#xff1a; 函数选板->字符串->附加字符串函数->分…

在STM32嵌入式中C/C++语言对栈空间的使用

像STM32这样的微控制器在进入main函数之前需要对栈进行初始化。可以说栈是C语言运行时的必要条件。我们知道栈实际上是一块内存空间&#xff0c;那么这块空间都用来存储什么呢&#xff1f;有什么办法能够优化栈空间的使用&#xff1f; 栈空间保存的内容 栈是一个先入后出的数据…

学术研讨 | 区块链网络体系结构研讨会顺利召开

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 近日&#xff0c;国家区块链技术创新中心组织了“区块链网络体系结构研讨会”&#xff0c;会议面向跨域交互多、计算规模大、数据管理复杂、性能与扩展性要求高等特征的区块链网络的体系结构展开交流研讨&…

ShareDB:构建实时应用从未如此简单

项目介绍 ShareDB 是一个支持多用户实时协作的全栈库&#xff0c;适用于构建各种需要同步数据更新的在线应用&#xff0c;如在线文档编辑器、实时仪表板和多玩家游戏等。 它提供了一套全面的实时同步和多用户协作解决方案&#xff0c;具备异步最终一致性、实时查询订阅、数据库…

Win11 操作(四)g502鼠标连接电脑不亮灯无反应

罗技鼠标连接电脑不亮灯无反应 前言 罗技技术&#x1f4a9;中&#x1f4a9;&#xff0c;贴吧技术神中神&#xff01; 最近买了一个g502&#xff0c;结果买回来直接插上电脑连灯都不亮&#xff0c;问了一下客服。客服简单的让我换接口&#xff0c;又是下载ghub之类的&#xf…

ESP8266用AT指令实现连接MQTT

1准备工作 硬件&#xff08;ESP8266&#xff09;连接电脑 硬件已经烧入了MQTT透传固件 2实现连接 2-1&#xff08;进入AT模式&#xff09; 打开串口助手发送如下指令 AT 2-2&#xff08;复位&#xff09; ATRST 2-3&#xff08;开启DHCP&#xff0c;自动获取IP&#x…

SpringBoot+Vue(3)Excel的在线预览

一、思路 在Spring Boot和Vue.js的组合中实现Excel文件的在线预览功能&#xff0c;通常涉及到几个关键步骤&#xff1a;文件上传、文件存储、文件读取、以及通过前端展示Excel内容。由于Excel文件本身不是直接可以在网页上渲染的格式&#xff0c;我们通常需要将Excel文件转换为…

vue3创建vite项目

一、创建vue3 vite项目&#xff1a; 命令行创建&#xff1a;npm create vitelatest vue3-tdly-demo -- --template vue (1)先进入项目文件夹&#xff0c;cd vue3-tdly-demo (2)之后执行&#xff0c; npm install (3)最后运行&#xff0c;npm run dev 将main.js文件内容改成…

ML.NET:一个.NET开源、免费、跨平台的机器学习框架

前言 今天大姚给大家分享一个.NET开源、免费、跨平台&#xff08;支持Windows、Linux、macOS多个操作系统&#xff09;的机器学习框架&#xff1a;ML.NET。并且本文将会带你快速使用ML.NET训练一个属于自己的图像分类模型&#xff0c;对图像进行分类。 ML.NET框架介绍 ML.NET…

计算机网络之网络基础(含图解和知识点思维导图通俗易懂)

绪论​ “一个人在科学探索的道路上&#xff0c;走过弯路&#xff0c;犯过错误&#xff0c;并不是坏事&#xff0c;更不是什么耻辱&#xff0c;要在实践中勇于承认和改正错误。——爱因斯坦”。本章将是网络的第一章&#xff0c;计算机网络是我们计算机行业必须了解并掌握的知识…

Linux中的fopen,fclose,fread,fwrite,fseek相关函数的知识点

这几个函数都是标准的c库函数&#xff0c;在man 2中查找不到&#xff0c;所以我们可以利用man 手册直接查找 对应的open,close,write,fread都是Linux系统内核调用 可移植性&#xff1a;fopen 强过于 open ... fopen 在用户态是缓存的 open 在用户态是没有缓存的 fopen函数 f…

TCP粘包问题详解和解决方案【C语言】

1.什么是TCP粘包 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输协议&#xff0c;它保证了数据的可靠性和顺序性。然而&#xff0c;由于TCP是基于字节流而不是消息的&#xff0c;因此在传输过…

javaEE-01-tomcat

文章目录 javaWebTomcat启动 Tomcat 服务器测试服务器是否成功停止tomcat服务器修改服务器的端口号 Idea整合tomcat服务器 javaWeb 所有通过 Java 语言编写可以通过浏览器访问的程序的总称,是基于请求和响应来开发的。 请求: 客户端给服务器发送数据(Request)响应: 服务器给客…

LINUX环境下使用yum安装JDK1.8并配置环境变量

LINUX环境下使用yum安装JDK1.8并配置环境变量 1.查看CentOS自带JDK是否已安装 yum list installed |grep java2.批量卸载JDK rpm -qa | grep java | xargs rpm -e --nodeps3.直接yum安装1.8.0版本openjdk(其他版本请自行修改版本号) yum install java-1.8.0-openjdk* -y4.默…

4 Go语言的操作符

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…