Mybatis练习(按值单条件查询)

news2024/9/24 19:21:12

Mybatis练习

安装MybatisX

在这里插入图片描述
在这里插入图片描述

接下来我们就使用Mybatis完成品牌数据的增删改查操作。以下是我们要完成功能列表:

  • 查询
    • 查询所有数据
    • 查询详情
    • 条件查询
  • 添加
  • 修改
    • 修改全部字段
    • 修改动态字段
  • 删除
    • 删除一个
    • 批量删除

创建数据库

  • 数据库表(tb_brand)及数据准备

    -- 删除tb_brand表
    drop table if exists tb_brand;
    -- 创建tb_brand表
    create table tb_brand
    (
        -- id 主键
        id           int primary key auto_increment,
        -- 品牌名称
        brand_name   varchar(20),
        -- 企业名称
        company_name varchar(20),
        -- 排序字段
        ordered      int,
        -- 描述信息
        description  varchar(100),
        -- 状态:0:禁用  1:启用
        status       int
    );
    -- 添加数据
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
           ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
           ('小米', '小米科技有限公司', 50, 'are you ok', 1);
    
  • 创建Brand实体类

    com.study.pojo 包下创建 Brand 实体类。

package com.study.pojo;

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

编写接口方法

com.study.mapper 包写创建名为 BrandMapper 的接口。并在该接口中定义 List<Brand> selectAll() 方法。

package com.study.mapper;

import com.study.pojo.Brand;

import java.util.List;

public interface BrandMapper {

    /**
     * 查询所有
     */
    List<Brand> selectAll();
}

编写BrandMapper.xml

reources 下创建 com/study/mapper 目录结构,并在该目录下创建名为 BrandMapper.xml 的映射配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.study.mapper.BrandMapper">
    <resultMap id="brandResultMap" type="brand">
        <!--
               id:完成主键字段的映射
                   column:表的列名
                   property:实体类的属性名
               result:完成一般字段的映射
                   column:表的列名
                   property:实体类的属性名
               使用resutlMap的目的在于Brand中的成员与数据库中的成员的命名方式
               不一样
                这种不同会导致这样的问题封装对象的时候出现问题,导致名字不同的对象无法查询出来
           -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>



    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    </select>
</mapper>

编写logback.xml和mybatis-config.xml

这里参考文章Mapper代理开发

编写测试方法

  • 编写测试用例
    在这里插入图片描述
package com.study.test;

import com.study.mapper.BrandMapper;
import com.study.pojo.Brand;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisTest {
    @Test
    public void testSelectAll() throws IOException {
        //1. 获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //3. 获取Mapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

        //4. 执行方法
        List<Brand> brands = brandMapper.selectAll();
        System.out.println(brands);

        //5. 释放资源
        sqlSession.close();

    }
}

运行结果讲解

在这里插入图片描述

根据id来查询

  • 编写接口方法:Mapper接口

    • 参数:id

      查看详情就是查询某一行数据,所以需要根据id进行查询。而id以后是由页面传递过来。

    • 结果:Brand

      根据id查询出来的数据只要一条,而将一条数据封装成一个Brand对象即可

  • 编写SQL语句:SQL映射文件

  • 执行方法、进行测试

编写接口方法

BrandMapper 接口中定义根据id查询数据的方法

/**
  * 查看详情:根据Id查询
  */
Brand selectById(int id);

编写SQL语句

BrandMapper.xml 映射配置文件中编写 statement,使用 resultMap 而不是使用 resultType

<select id="selectById"  resultMap="brandResultMap">
    select *
    from tb_brand where id = #{id};
</select>

注意:上述SQL中的 #{id}先这样写,一会我们再详细讲解

编写测试方法

test/java 下的 com.study.mapper 包下的 MybatisTest类中 定义测试方法

 @Test
public void testSelectById() throws IOException {
    //接收参数,该id以后需要传递过来
    int id = 1;

    //1. 获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    //2. 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //3. 获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);

    //4. 执行方法
    Brand brand = brandMapper.selectById(id);
    System.out.println(brand);

    //5. 释放资源
    sqlSession.close();
}

运行结果
在这里插入图片描述

SQL语句中特殊字段处理

我们开发的时候有可能会遇到某些特殊字符,导致报错的情况发生。
在这里插入图片描述

  • 转义字符

    下图的 &lt; 就是 < 的转义字符。

在这里插入图片描述

  • <![CDATA[内容]]>

在这里插入图片描述

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

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

相关文章

腾讯云服务器CVM和轻量应用服务器区别全方位对比

腾讯云轻量服务器和云服务器有什么区别&#xff1f;轻量应用服务器和云服务器CVM哪个更好&#xff1f;抛开价格及使用门槛&#xff0c;云服务器CVM更好&#xff1b;从性价比及易用性角度考虑&#xff0c;轻量应用服务器更好&#xff0c;轻量服务器性价比高&#xff0c;这个配置…

【Python】批量提取图片经纬度并写入csv文件

需求 无人机图片中往往包含经纬度信息&#xff0c;需要一个脚本批量将文件夹中包含经纬度信息的图片提取出来&#xff0c;保存成csv文件。 经纬度格式解读 默认情况下&#xff0c;图片采用的WGS84经纬度&#xff0c;默认格式采用的是度分秒格式&#xff0c;另一种格式是十进…

【数据结构】二叉树的基本操作与遍历(C语言)

目录 定义 满二叉树 完全二叉树 性质 应用 计算二叉树结点个数 计算叶子结点的个数 第 k 层结点的个数 查找值为x的节点 遍历 前序遍历 中序遍历 后序遍历 层序遍历 判断是否为完全二叉树 定义 &#x1f984;二叉树是由树发展过来的&#xff0c;即度最大为2的树&…

stm32 笔记 PWM及HAL库应用

stm32 PWM原理 STM32 使用一个定时器作为 PWM 输出&#xff0c;在上图中&#xff0c;ARR 即为重装载值。在计数器的值大于CRRx的值并且小于 ARR 之间&#xff0c;即区分高低电平。输出在图中分别有 ① 和 ② 两种情况. 分别为&#xff1a; ①CRR 和 ARR 区间为低电平。 ②CR…

【pen200-lab】10.11.1.222

pen200-lab 学习笔记 【pen200-lab】10.11.1.222 &#x1f525;系列专栏&#xff1a;pen200-lab &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1f36d;作…

Vue框架学习(第十三课)Vuex状态管理中的store和state属性

学习官网文档:开始 | Vuex (vuejs.org) 第一部分:查图观色思考为什么&#xff1f;下面的一张图中的数据如何实现组件与组件之间的数据共享呢&#xff1f; 如何去实现下面的方案呢能让数据得到共享 这一张图告诉你们答案 这样如何实现组件与组件之间的通信呀 Vuex五个核心的基本…

FANUC机器人程序设计

一&#xff0e;注意事项 1.FANUC机器人所有者、操作者必须对自己的安全负责。FANUC不对机器使用的安全问题负责。FANUC提醒用户在使用FANUC机器人时必须使用安全设备&#xff0c;必须遵守安全条款。 2.FANUC机器人程序的设计者、机器人系统的设计和调试者、安装者必须熟悉FAN…

408 考研《操作系统》第一章第一节:操作系统的概念和特征

文章目录教程&#xff1a;1. 操作系统的概念、功能和目标1.1 大家熟悉的操作系统1.2 操作系统的概念1.3 操作系统的功能和目标1.3.1 操作系统的功能和目标——作为系统资源的管理者1.3.2 操作系统的功能和目标——作为用户和计算机硬件之间的接口1.3.3 操作系统的功能和目标——…

【三维目标检测】CenterPoint(二)

CenterPoint数据和源码配置调试过程请参考上一篇博文&#xff1a;https://blog.csdn.net/suiyingy/article/details/128002709。本文主要详细介绍CenterPoint网络结构及其运行中间状态。 1 CenterPoint模型总体过程 CenterPoint模型的整体结构如下图所示&#xff0c;由最初的一…

50 jhat 中 java.lang.String 的实例占用空间为什么是 28 bytes ?

前言 此问题是 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全d 同一时期发现的问题 大致的情况是 看到了 jhat 中统计的各个 oop 的占用空间 似乎是不太能够对的上 比如 java.lang.String, 在 64bit vm 上面 开启了 UseCompressedOops 之后, 应该是占用 …

Gram矩阵+Gram矩阵和协方差矩阵的关系

目录Gram矩阵简介协方差矩阵Gram矩阵 和 协方差矩阵的关系Gram Matrix代码Gram矩阵简介 gram矩阵是计算每个通道 i 的feature map与每个通道 j 的feature map 的内积 gram matrix的每个值可以说是代表 i 通道的feature map和 j 通道的 feature map的互相关程度。 参考博客 GAT…

小程序开发---02认识宿主环境

小程序依赖于微信提供宿主环境 小程序可以借助宿主环境提供的能力&#xff0c;可以完成许多普通网页无法完成的功能&#xff0c;如&#xff1a;微信扫码&#xff0c;微信支付&#xff0c;微信登录&#xff0c;定理定位&#xff0c;etc…等 小程序宿主环境包含以下内容&#xf…

关闭不同型号的 ESP 芯片的 ROM Code 上电启动日志的流程

【说明】 芯片 ROM Code 上电启动日志&#xff0c;不会对应用固件产生任何影响。通过 ROM Code 上电日志能够判断芯片启动模式是处于什么状态。若关闭此日志打印&#xff0c;当芯片进入下载模式或进入 Flash 启动模式等都不会有任何日志提示&#xff0c;不利于检查芯片状态&am…

操作系统学习笔记(V):设备管理

目录 1 设备 1.1 设备的概念 1.2 设备的分类 2 I/O控制器 2.1 I/O控制器 1.定义 2.功能 3.组成 2.2 I/O控制方式 1.程序直接控制方式 2.中断驱动方式 3.DMA方式 4.通道控制方式 5.对比 2.3 I/O软件层次结构 1.用户层软件 2.设备独立性软件 3.设备驱动程序 4…

Windows ssh免密访问Linux服务器

文章目录1.在Windows上生成公钥和私钥2.将公钥中的内容复制到linux服务器3.确认linux服务器开启了允许SSH免密登录4.确认免密登录配置成功ssh提供了安全的身份认证的策略&#xff0c;在免密登录之前&#xff0c;首先需要一对公钥和私钥。客户端拿着私钥&#xff0c;服务端拿着公…

【计算机网络】超详细——华为eNSP的安装教程

网络工程师小白或初次接触计算机网络的学生&#xff0c;网络相关的书本学习起来枯燥乏味&#xff0c;这时需要仿真模拟器来加深对网络知识的理解。目前提供网络仿真平台有cisco、华为等&#xff0c;若您英语基础薄弱建议选华为&#xff0c;英语阅读能力较强的直接上cisco的模拟…

redis我记不住的那些命令(五)

背景&#xff1a;我记不住那么多命令&#xff0c;又是Linux命令&#xff0c;又是Git命令&#xff0c;又是kubernetes的命令&#xff0c;又是maven命令&#xff0c;又是redis命令。所谓好记性不如烂笔头&#xff0c;记下来吧。 一、set集合 集合的特点是 无序且各不相同的元素…

SpringSecurity(二十二)--OAuth2:实现资源服务器(下)通过redis和缓存实现TokenStore

一、前言 本章将在前面几章基础上进行讲解&#xff0c;所以大家最好尽量先去看一下前几章的内容再来跟进会好很多。那么本章我们将通过redis和本地缓存Caffeine对JdbcTokenStore进行重写&#xff0c;并且讲解资源服务器配置的新方案&#xff0c;使得我们可以不用在资源服务器又…

[附源码]计算机毕业设计springboot校园疫情防范管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

LeetCode 337. 打家劫舍 III(C++)*

该题也是使用动态规划的思路&#xff0c;主要考虑根节点的最大金额和左右子节点的关系&#xff0c;其中分为两种情况&#xff1a;有该结点有没有偷钱&#xff0c;其次要遵守不报警原则。可得到状态转移方程&#xff1a; f为根节点被选中的最大&#xff0c;g为根节点没被选中的最…