Mybatis基础操作XML映射文件

news2024/11/25 8:18:28

Mybatis基本操作

一、环境准备

image-20230507112959151

数据库表和springboot工程在课程资料中都有提供

注意,entrydate是用的jdk1.8中的LocalDate类型,createTime用的是jdk1.8中的LocalDateTime类型

二、删除

Mybatis中提供了一种参数占位符 #{id}

image-20230507121304062

empMapper.java

package com.itheima.mapper;

import org.apache.ibatis.annotations.*;

@Mapper
public interface EmpMapper {

    @Delete("delete from emp where id=#{id}")
    public void delete(Integer id);
    //其实delete是有返回值的,返回删除的行数,不过一般不需要
//    public int delete(Integer id);
}

测试方法

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {

    @Autowired
    public EmpMapper empMapper;

    @Test
    public void testDelete(){
//        int i = empMapper.delete(17);
//        System.out.println(i);
        empMapper.delete(17);
    }
}

三、删除(预编译SQL)

image-20230507122711651 image-20230507123317236 image-20230507123441956

预编译SQL的优势—性能更高

image-20230507123500769

预编译SQL的优势—防止SQL注入

image-20230507124712481 image-20230507124824431

mybatis提供了2个参数占位符

参数占位符(面试题)

image-20230507125035627

用${id}就不会生成预编译SQL,性能低,不安全,一般不用

image-20230507125226350

小结

image-20230507125340880

四、新增

image-20230507131920444 image-20230507131939953

首先要会写SQL语句:image-20230507133605916

像这种参数多的,推荐多个参数封装到一个对象中,这样维护比较方便,也便于阅读

1、在empMapper接口中添加,#{Emp对象的属性名}

@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);
image-20230507133653679

2、测试

@Test
public void testInsert(){
    // 创建Emp对象
    Emp emp = new Emp();
    emp.setUsername("Tom");
    emp.setName("汤姆");
    emp.setGender((short)1);
    emp.setImage("1.jpg");
    emp.setJob((short)1);
    emp.setDeptId(1);
    emp.setEntrydate(LocalDate.now());
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.insert(emp);
}
image-20230507133910151 image-20230507135754194

五、新增(主键返回)

image-20230507140829974 image-20230507141115229
@Options(keyProperty = "id",useGeneratedKeys = true)//获取返回的主键,keyProperty是将返回的主键往哪个emp的属性封装
@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);
image-20230507141132297 image-20230507141145213

六、更新(根据主键修改员工信息)

image-20230507141815461

1、先写SQL语句

-- 更新员工信息
update emp set username='',name='',gender='',image='',job='',entrydate='',dept_id='',update_time=''
        where id=1;

2、添加mapper接口方法

@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);
image-20230507162430099

3、测试

@Test
public void testUpdate(){
    // 创建Emp对象
    Emp emp = new Emp();
    emp.setId(21);
    emp.setUsername("Tom3");
    emp.setName("汤姆3");
    emp.setGender((short)1);
    emp.setImage("2.jpg");
    emp.setJob((short)1);
    emp.setDeptId(1);
    emp.setEntrydate(LocalDate.of(2012-10-10,12,10));
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.update(emp);
}
image-20230507162014500

七、查询(根据ID)

1、先写SQL语句

-- 根据ID查询员工信息
select * from emp where id=1;

2、Mapper接口方法

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

3、测试

//查询
@Test
public void select(){
    Emp emp = empMapper.getById(2);
    System.out.println(emp);
}
image-20230507164124777 image-20230507164218691

但是deptId后面的字段都是null,但是数据库中确实有这些数据

Mybatis的封装机制

image-20230507164502427

方法一

// 起别名:在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
@Select("select id, username, password, name, gender, image, job, entrydate, " +
        "dept_id deptId, create_time createTime, update_time updateTime from emp where id=#{id}")
public Emp getById(Integer id);

方法二

//    2 、手动结果映射:通过 @Results及@Result 进行手动结果映射。
    @Select("select * from emp where id=#{id}")
    @Results({
            @Result(column = "dept_id",property = "deptId"),
            @Result(column = "create_time", property = "createTime"),
            @Result(column = "update_time", property = "updateTime")
    })
    public Emp getById(Integer id);

方法三

image-20230507171000347

查询语句保持不变

image-20230507171113437

类的属性名和数据库查询返回的字段名不一致,就不能自动封装,返回值结果为null,如何解决?

image-20230507171247480

八、查询(条件查询)

1、写SQL语句

-- 条件查询
select * from emp where name like '%张%' and gender=1 and entrydate between '2010-01-01' and '2020-01-01';

2、Mapper创建方法,因为’'之间是字符串,#{name}是不能出现在引号之间的也就是?,所以一种方法是用${name}进行拼接。

//    条件查询
    @Select("select * from emp where name like '%${name}%' and gender=#{gender} and entrydate between #{begin} and #{end}")
    public List<Emp> select(String name, short gender, LocalDate begin,LocalDate end);

还有一种方法是用MySQL提供的函数concat,用来拼接字符串

    @Select("select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end}")
    public List<Emp> select(String name, short gender, LocalDate begin,LocalDate end);
image-20230507183737647

3、测试

@Test
public void select(){
    List<Emp> empList = empMapper.select("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
    System.out.println(empList);
}
image-20230507184106194 image-20230507184127461 image-20230507184310290

九、XML映射文件

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

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

相关文章

Leetcode461. 汉明距离

Every day a leetcode 题目来源&#xff1a;461. 汉明距离 解法1&#xff1a;模拟 先将x和y转为为对应二进制的字符串&#xff0c;再遍历两个字符串进行比较。 代码&#xff1a; /** lc appleetcode.cn id461 langcpp** [461] 汉明距离*/// lc codestart class Solution {…

HTML的两个实战项目

文章目录 HTML的两个实战项目1. 个人简历1. 1 快速生成模板1.2 根据简历格式进行预设计1.3 开始创作吧1.3.1 基本信息1.3.2 教育背景1.3.3 专业技能1.3.4 我的项目1.3.5 自我评价 2. 输入简历信息页面设计2.1 设计大概框架2.2 开始创作吧2.2.1 输入姓名2.2.2 上传照片2.2.3 输入…

Axure教程——用中继器制作动态柱状图

今天作者就教大家在Axure里面如何用中继器做一个可以动态的柱状图。 制作完成之应具备以下交互效果&#xff1a; 1.在中继器表格中填写具体数据和坐标轴后&#xff0c;自动生成对应的柱状图 2.鼠标移动到每项&#xff0c;显示其数据 预览地址&#xff1a;https://tj4v11.axshar…

node笔记_读文件(异步读取、流式读取)

文章目录 ⭐前言⭐ 读取文件异步读 readFile读取txt 流式读 createReadStream读取视频 ⭐ 结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本期分享node读取文件。 往期文章 node_windows环境变量配置 node_npm发布包 linux_配置node node_nvm安装配置 node笔记_http服务…

2023/05/02~07 刷题记录

A - AABCC 题义&#xff1a; 题解&#xff1a; 读完题目可以想到直接暴力&#xff0c;但是肯定超时别想了。 因为 a b c 都是素数&#xff0c;所以我们可以先求出所有的素数 进行减少循环的次数&#xff0c;然后遍历。在遍历过程中&#xff0c;我们也要去进行剪枝 &#xff0c;…

10_Uboot启动流程_2

目录 _main函数详解 board_init_f函数详解 relocate_code函数详解 relocate_vectors函数详解 board_init_r 函数详解 _main函数详解 在上一章得知会执行_main函数_main函数定义在文件arch/arm/lib/crt0.S 中,函数内容如下: 第76行,设置sp指针为CONFIG_SYS_INIT_SP_ADDR,也…

美团外卖红包优惠券:美团外卖节红包或美团外卖天天神券怎么领取使用?

什么是美团外卖节红包或美团外卖天天神券&#xff1f; 美团外卖节红包、美团外卖天天神券都可以称为美团外卖红包优惠券。使用美团外卖节红包、美团外卖天天神券&#xff0c;点餐可以享受优惠。且美团外卖节红包、美团外卖天天神券每天都可以免费领取。美团会员红包不能与美团…

nginx相关知识

目录 一. Nginx目录结构 二. Nginx配置文件结构 三. Nginx具体应用 1. 部署静态资源 2. 反向代理 3. 负载均衡 一. Nginx目录结构 重点目录/文件&#xff1a; conf/nginx.conf nginx配置文件html 存放静态文件&#xff08;html、CSS、Js等&#xff09;logs 日志目…

【Redis】数据结构底层结构

我们知道Redis的很快&#xff0c;一个原因是因为在内存上操作&#xff0c;另一个原因是本身的数据结构。而具体的五大类型就是如下&#xff1a; 键和值如何组织的 通过key找到value的过程&#xff0c;Redis使用了哈希表结构进行查找。具体就是根据key的hash值计算出对应的下…

三子棋(C语言重做版)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

对标ChatGPT3.5,支持手机电脑网页使用,无需魔法

说到 Claude 是什么&#xff0c;大家可能没听说过。 但是说到 OpenAI&#xff0c;说到 ChatGPT&#xff0c;相信大家一定听说过&#xff0c;玩过。 PS&#xff1a;关于 Claude 网页版的注册教程&#xff0c;我之前已经写过文章了&#xff0c;现在额外介绍如何使用手机App和电脑…

centos搭建code-server及配置HTTPS、登录页自定义

文章目录 一、Code-Server二、安装及运行三、系统配置四、HTTPS配置五、登录页面自定义 注&#xff1a;本版本基于4.11.0&#xff0c;在此之前版本&#xff0c;在centos上会出现CPU占用一直100%的情况&#xff0c;当前版本已经搭建两个月&#xff0c;综合下来比较稳定 通过搭建…

【高数+复变函数】傅里叶级数

文章目录 1. 傅里叶级数1.1 和差化积积化和差1.2 三角函数系的正交性1.3 系数公式求解1.4 展开条件1.5 变形下的傅里叶 在课程学习中&#xff0c;感觉这一部分的东西频繁会被用到&#xff0c;因此写下来做个总结。 1. 傅里叶级数 在科学技术中&#xff0c;常常会遇到各种各样的…

【matplotlib】4-完善统计图形

文章目录 完善统计图形1 添加图例和标题1.1 图例和标题的设置方法1.2 案例1--图例的展示样式的调整1.3 案例2--标题的展示样式的调整1.4 案例3--带图例的饼图 2 调整刻度范围和刻度标签2.1 调整刻度范围和刻度标签的方法2.2 子区函数--subplot()2.3 案例--逆序设置坐标轴刻度标…

密码学:公钥密码.(非对称密码)

密码学&#xff1a;公钥密码. 公钥密码 (Public Key Cryptography)&#xff0c;又称为非对称密码&#xff0c;其最大特征是加密和解密不再使用相同的密钥&#xff0c;而使用不同的密钥。使用者会将一个密钥公开&#xff0c;而将另一个密钥私人持有&#xff0c;这时这两个密钥被…

【WebGIS初学到入职】第二阶段的小结

一、前言 2021年12月&#xff0c;我进行了【WebGIS初学到入职】第一阶段的小结&#xff0c;如今&#xff0c;一年半过去了。我完成了毕业设计&#xff0c;平缓得通过了岗位的试用期&#xff0c;而且作为我所在部门唯一的前端开发&#xff0c;参与了越来越多的工作项目。 同时…

源码分析RocketMQ之NameServer

整体架构图 从部署架构图可知NameServer与所有的broker通讯&#xff0c;NameServer集群之间互不通信。 主要功能包括 1、Broker管理 1.1 维护Broker集群 clusterAddrTable 1.2 Broker信息 接收Broker注册信息并保存作为路由信息的基本数据 brokerAddrTable 1.3 Topic消息路由…

【软件质量保证与测试】实验二之ACTS工具

索引 0. 前言1. ACTS 获取2. ACTS 启动2.1 双击启动GUI2.2 终端启动GUI2.3 进入GUI 3. ACTS 参数类型3.1 新建系统3.2 ACTS 添加成员3.2.1 Boolean类型3.2.2 Enum类型3.2.3 Number类型3.2.4 Range类型3.2.5 其他 4. ACTS 约束5. 混合组合强度6. 参考模型6.1 设定模型6.2 参数设…

Win系统软件闪屏 - 解决方案

Win系统软件闪屏 - 解决方案 前言原因解决方案方法1&#xff1a;软件使用独显方法2&#xff1a;软件关闭硬件加速方法3&#xff1a;降级显卡驱动 前言 使用Win10及以上系统时&#xff0c;可能会出现频繁闪现黑屏的状态&#xff0c;下文简称闪屏。一般在使用第三方软件时&#…

【Linux】进程信号保存

前言 上篇博客我们了解了进程信号的概念和信号如何产生。 本篇我们将学习进程信号如何保存。 文章目录 前言一. 阻塞信号二. 递达动作三. 信号集四. 信号集操作函数结束语 一. 阻塞信号 首先我们需要一些预备知识 实际执行信号的处理动作称为信号递达&#xff08;Delivery&am…