首页 > 其他分享 >3-使用MyBatis实现CRUD

3-使用MyBatis实现CRUD

时间:2023-05-11 14:55:21浏览次数:34  
标签:name 映射 实现 brand CRUD 查询 MyBatis tb 配置文件

1. 配置文件实现 CRUD

image-20230511142836858

如上图所示产品原型,里面包含了品牌数据的 查询按条件查询添加删除批量删除修改 等功能,而这些功能其实就是对数据库表中的数据进行 CRUD 操作。接下来我们就使用 Mybatis 完成品牌数据的增删改查操作。以下是我们要完成功能列表:

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

1.1 环境准备

  • 数据库表(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.itheima.pojo 包下创建 Brand 实体类。

    image-20230511143105649

    public class Brand {
        // id 主键
        private Integer id;
        // 品牌名称
        private String brandName;
        // 企业名称
        private String companyName;
        // 排序字段
        private Integer ordered;
        // 描述信息
        private String description;
        // 状态:0:禁用  1:启用
        private Integer status;
    
        //省略 setter and getter。自己写时要补全这部分代码
    }
    
  • 编写测试用例

    测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:

image-20230511143142155

安装 MyBatisX 插件

  • MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。

  • 主要功能

    • XML 映射配置文件 和 接口方法 间相互跳转
    • 根据接口方法生成 statement
  • 安装方式

    点击 file ,选择 settings ,就能看到如下图所示界面

image-20230511143207665

注意:安装完毕后需要重启 IDEA

  • 插件效果

    image-20230511143346931

红色头绳的表示映射配置文件,蓝色头绳的表示 mapper 接口。

在 mapper 接口点击红色头绳的小鸟图标会自动跳转到对应的映射配置文件,在映射配置文件中点击蓝色头绳的小鸟图标会自动跳转到对应的 mapper 接口。

也可以在 mapper 接口中定义方法,自动生成映射配置文件中的 statement ,如图所示

image-20230511143442114

1.2 查询所有数据

image-20230511143540409

如上图所示就页面上展示的数据,而这些数据需要从数据库进行查询。接下来我们就来讲查询所有数据功能,而实现该功能我们分以下步骤进行实现:

编写接口方法:Mapper 接口

  • 参数:无

    查询所有数据功能是不需要根据任何条件进行查询的,所以此方法不需要参数。

image-20230511143723324

结果:List

我们会将查询出来的每一条数据封装成一个 Brand 对象,而多条数据封装多个 Brand 对象,需要将这些对象封装到 List 集合中返回。

image-20230511143756697

执行方法、测试

image-20230511143829353

1.2.1 编写接口方法

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

public interface BrandMapper {

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

1.2.2 编写 SQL 语句

reources 下创建 com/itheima/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.itheima.mapper.BrandMapper">
    <select id="selectAll" resultType="brand">
        select *
        from tb_brand;
    </select>
</mapper>

1.2.3 编写测试方法

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();

}

注意:现在我们感觉测试这部分代码写起来特别麻烦,我们可以先忍忍。以后我们只会写上面的第 3 步的代码,其他的都不需要我们来完成。

执行测试方法结果如下:

image-20230511144156205

从上面结果我们看到了问题,有些数据封装成功了,而有些数据并没有封装成功。为什么这样呢?

这个问题可以通过两种方式进行解决:

  • 给字段起别名
  • 使用 resultMap 定义字段和属性的映射关系

1.2.4 起别名解决上述问题

从上面结果可以看到 brandNamecompanyName 这两个属性的数据没有封装成功,查询 实体类 和 表中的字段 发现,在实体类中属性名是 brandNamecompanyName ,而表中的字段名为 brand_namecompany_name,如下图所示 。那么我们只需要保持这两部分的名称一致这个问题就迎刃而解。

image-20230511144212405

我们可以在写 sql 语句时给这两个字段起别名,将别名定义成和属性名一致即可。

<select id="selectAll" resultType="brand">
    select
    id, brand_name as brandName, company_name as companyName, ordered, description, status
    from tb_brand;
</select>

而上面的 SQL 语句中的字段列表书写麻烦,如果表中还有更多的字段,同时其他的功能也需要查询这些字段时就显得我们的代码不够精炼。Mybatis 提供了sql 片段可以提高 sql 的复用性。

SQL 片段:

  • 将需要复用的 SQL 片段抽取到 sql 标签中

    <sql id="brand_column">
    	id, brand_name as brandName, company_name as companyName, ordered, description, status
    </sql>
    

    id 属性值是唯一标识,引用时也是通过该值进行引用。

  • 在原 sql 语句中进行引用

    使用 include 标签引用上述的 SQL 片段,而 refid 指定上述 SQL 片段的 id 值。

    <select id="selectAll" resultType="brand">
        select
        <include refid="brand_column" />
        from tb_brand;
    </select>
    

1.2.5 使用 resultMap 解决上述问题

起别名 + sql 片段的方式可以解决上述问题,但是它也存在问题。如果还有功能只需要查询部分字段,而不是查询所有字段,那么我们就需要再定义一个 SQL 片段,这就显得不是那么灵活。

那么我们也可以使用 resultMap 来定义字段和属性的映射关系的方式解决上述问题。

  • 在映射配置文件中使用 resultMap 定义 字段 和 属性 的映射关系

    <resultMap id="brandResultMap" type="brand">
        <!--
                id:完成主键字段的映射
                    column:表的列名
                    property:实体类的属性名
                result:完成一般字段的映射
                    column:表的列名
                    property:实体类的属性名
            -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    

    注意:在上面只需要定义 字段名 和 属性名 不一样的映射,而一样的则不需要专门定义出来。

  • SQL 语句正常编写

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

1.2.6 小结

实体类属性名 和 数据库表列名 不一致,不能自动封装数据

  • 起别名:在 SQL 语句中,对不一样的列名起别名,别名和实体类属性名一样
    • 可以定义 片段,提升复用性
  • resultMap:定义 完成不一致的属性名和列名的映射

而我们最终选择使用 resultMap 的方式。查询映射配置文件中查询所有的 statement 书写如下:

 <resultMap id="brandResultMap" type="brand">
     <!--
            id:完成主键字段的映射
                column:表的列名
                property:实体类的属性名
            result:完成一般字段的映射
                column:表的列名
                property:实体类的属性名
        -->
     <result column="brand_name" property="brandName"/>
     <result column="company_name" property="companyName"/>
</resultMap>



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

标签:name,映射,实现,brand,CRUD,查询,MyBatis,tb,配置文件
From: https://www.cnblogs.com/NorthPoet/p/17391035.html

相关文章

  • 基于python爬虫技术对于淘宝的数据分析的设计与实现
    本篇仅在于交流学习本文主要介绍通过selenium模块和requests模块,同时让机器模拟人在浏览器上的行为,登录指定的网站,通过网站内部的搜索引擎来搜索自己相应的信息,从而获取相应关键字的商品信息,并进而获取数据,然后通过csv模块将数据存储到本地库中,接着在通过pandas、jieba、m......
  • SpringBoot中@ControllerAdvice/@RestControlAdvice+@ExceptionHandler实现全局异常捕
    场景在编写Controller接口时,为避免接口因为未知的异常导致返回不友好的结果和提示。如果不进行全局异常捕获则需要对每个接口进行try-catch或其他操作。 可以对Controller进行全局的异常捕获和处理,一旦发生异常,则返回通用的500响应码与通用错误提示。并将异常发生的具体的......
  • 2-Mybatis基础
    1.Mybatis概述1.1.Mybatis概念MyBatis是一款优秀的持久层框架,用于简化JDBC开发MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundation迁移到了googlecode,并且改名为MyBatis。2013年11月迁移到Github官网:https://mybati......
  • 侧边栏筛选功能的实现
    目录一、分析博客园二、路由层的编写三、视图函数逻辑的实现四、给a超链接加地址一、分析博客园"""按照标签筛选https://www.cnblogs.com/wupeiqi/tag/1/按照分类筛选https://www.cnblogs.com/wupeiqi/category/1/按照时间筛选https://www.cnblogs.com/wupeiqi/archive/20......
  • tensorflow实现mnist手写数字识别
    1.softmax函数在数学,尤其是概率论和相关领域中,归一化指数函数,或称Softmax函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量z“压缩”到另一个K维实向量σ(z)中,使得每一个元素的范围都在(0,1)之间,并且所有元素的和为1。该函数多用于多分类问题中。在多项逻辑回归和......
  • 多线程实现高并发服务器
    /*多线程实现并发服务器主线程负责接收子线程负责处理*/#include<stdio.h>#include<arpa/inet.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<unistd.h>#include<wait.h>#include<si......
  • ds:顺序表实现栈、队列的思想
      一、顺序表实现栈:1.入栈时需要判断栈满、出栈时需要判断栈空2.根据init()时s.top栈顶指针等于1、等于0的不同,在入栈、出栈时对于“元素操作、栈顶指针移动”的操作顺序也不同  二、顺序表实现队列:1.需要使用()%maxsize取模运算来将队列变成循环队列。队满:(Q.rear+1)......
  • Linux网络编程:socket实现client/server通信
    一、问题引入阅读UNIX网络编程卷1:套接字联网API第3版的前4个章节,觉得有必要对书籍上的源码案例进行复现,并推敲TCP的C/S通信过程。二、解决过程2-1server#include<sys/types.h>#include<sys/socket.h>#include<stdio.h>#include<netinet/in.h>#include<arpa/inet.h......
  • js 实现类chatgpt流式传输
    startStreaming(){//创建XMLHttpRequest对象constxhr=newXMLHttpRequest();//设置请求的URLxhr.open('GET',"接口");//设置响应类型为text/event-streamxhr.setRequestHeader('Content-Type','te......
  • 同步磁阻电机SynRM高频注入无感 FOC 1采用高频注入法实现SynRM
    同步磁阻电机SynRM高频注入无感FOC1采用高频注入法实现SynRM零低速下无位置传感器起动运行;2.提供算法对应的参考文献和仿真模型仿真模型纯手工搭建,不是从网络上复制得到。仿真模型仅供学习参考ID:82128679796834324......