当前位置: 首页 > news >正文

Mybatis实战练习四【单个条件(动态SQL)添加数据】

  • 💂 个人主页: 爱吃豆的土豆
  • 🌈欢迎加入社区,福利多多哦!土豆社区

  • 🤟数据库专栏更新完毕:数据库知识
  • 🤟JDBC专栏更新完毕:JDBC知识
  • 🤟Mybatis专栏更新中:Mybatis知识
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

目录

单个条件(动态SQL)

编写接口方法、

编写SQL语句

编写测试方法

 添加数据

编写接口方法

编写SQL语句

编写测试方法

添加-主键返回


单个条件(动态SQL)

如上图所示,在查询时只能选择 品牌名称当前状态企业名称 这三个条件中的一个,但是用户到底选择哪儿一个,我们并不能确定。这种就属于单个条件的动态SQL语句。

这种需求需要使用到 choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句。

通过一个案例来使用这些标签

 

编写接口方法、

BrandMapper 接口中定义单条件查询的方法。

/**
  * 单条件动态查询
  * @param brand
  * @return
  */
List<Brand> selectByConditionSingle(Brand brand);

编写SQL语句

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

<select id="selectByConditionSingle" resultMap="brandResultMap">
    select *
    from tb_brand
    <where>
        <choose><!--相当于switch-->
            <when test="status != null"><!--相当于case-->
                status = #{status}
            </when>
            <when test="companyName != null and companyName != '' "><!--相当于case-->
                company_name like #{companyName}
            </when>
            <when test="brandName != null and brandName != ''"><!--相当于case-->
                brand_name like #{brandName}
            </when>
        </choose>
    </where>
</select>

编写测试方法

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

@Test
public void testSelectByConditionSingle() throws IOException {
    //接收参数
    int status = 1;
    String companyName = "华为";
    String brandName = "华为";

    // 处理参数
    companyName = "%" + companyName + "%";
    brandName = "%" + brandName + "%";

    //封装对象
    Brand brand = new Brand();
    //brand.setStatus(status);
    brand.setCompanyName(companyName);
    //brand.setBrandName(brandName);

    //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.selectByConditionSingle(brand);
    System.out.println(brands);

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

执行测试方法结果如下:

添加数据

如上图是我们平时在添加数据时展示的页面,而我们在该页面输入想要的数据后添加 提交 按钮,就会将这些数据添加到数据库中。接下来我们就来实现添加数据的操作。

  • 编写接口方法

 

  • 参数:除了id之外的所有的数据。id对应的是表中主键值,而主键我们是 ==自动增长== 生成的。

 

  • 编写测试方法并执行

明确了该功能实现的步骤后,接下来我们进行具体的操作。  

 

编写接口方法

BrandMapper 接口中定义添加方法。

 /**
   * 添加
   */
void add(Brand brand);

编写SQL语句

BrandMapper.xml 映射配置文件中编写添加数据的 statement

<insert id="add">
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>

编写测试方法

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

@Test
public void testAdd() throws IOException {
    //接收参数
    int status = 1;
    String companyName = "波导手机";
    String brandName = "波导";
    String description = "手机中的战斗机";
    int ordered = 100;

    //封装对象
    Brand brand = new Brand();
    brand.setStatus(status);
    brand.setCompanyName(companyName);
    brand.setBrandName(brandName);
    brand.setDescription(description);
    brand.setOrdered(ordered);

    //1. 获取SqlSessionFactory
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //2. 获取SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //SqlSession sqlSession = sqlSessionFactory.openSession(true); //设置自动提交事务,这种情况不需要手动提交事务了
    //3. 获取Mapper接口的代理对象
    BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
    //4. 执行方法
    brandMapper.add(brand);
    //提交事务
    sqlSession.commit();
    //5. 释放资源
    sqlSession.close();
}

执行结果如下:  

添加-主键返回

在数据添加成功后,有时候需要获取插入数据库数据的主键(主键是自增长)。

比如:添加订单和订单项,如下图就是京东上的订单

 

订单数据存储在订单表中,订单项存储在订单项表中。

  • 添加订单数据

 

添加订单项数据,订单项中需要设置所属订单的id  

明白了什么时候 主键返回 。接下来我们简单模拟一下,在添加完数据后打印id属性值,能打印出来说明已经获取到了。

我们将上面添加品牌数据的案例中映射配置文件里 statement 进行修改,如下

<insert id="add" useGeneratedKeys="true" keyProperty="id">
    insert into tb_brand (brand_name, company_name, ordered, description, status)
    values (#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>

在 insert 标签上添加如下属性:

  • useGeneratedKeys:是够获取自动增长的主键值。true表示获取

  • keyProperty :指定将获取到的主键值封装到哪儿个属性里

相关文章:

  • 国赛高教杯使用python/matlab必会基础数学建模-数据处理模块(课程4)
  • XGBoost算法原理详解与参数详解
  • MySQL识别不了中文怎么办?(适合新手)
  • 【面试题】集合并发问题
  • 精品基于Uniapp+SSM实现的Android安全网购平台
  • Spring Cloud Gateway 网关实现白名单功能
  • Android Studio Chipmunk | 2021.2.1 Patch 2(2022 年 8 月)
  • 小程序商城上线需要做什么?
  • 选择边缘计算网关的五大优势
  • “蔚来杯“2022牛客暑期多校训练营4(A,D,H,K,N)
  • 达梦DataWatch主备环境搭建
  • python入门I--基本概念--基本语法--变量和标识符--数据类型
  • opencv-python之图像的加法与按位运算
  • rocketMq 安装
  • 明日风尚杂志明日风尚杂志社《明日风尚》杂志社2022年第10期目录
  • (三)从jvm层面了解线程的启动和停止
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • Android 控件背景颜色处理
  • Otto开发初探——微服务依赖管理新利器
  • Promise面试题,控制异步流程
  • python 学习笔记 - Queue Pipes,进程间通讯
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 多线程 start 和 run 方法到底有什么区别?
  • 区块链技术特点之去中心化特性
  • 什么软件可以剪辑音乐?
  • 实战|智能家居行业移动应用性能分析
  • 使用docker-compose进行多节点部署
  • 微信小程序:实现悬浮返回和分享按钮
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (轉貼) UML中文FAQ (OO) (UML)
  • .aanva
  • .net 验证控件和javaScript的冲突问题
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • @PreAuthorize注解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [2]十道算法题【Java实现】
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [BZOJ 1040] 骑士
  • [C#]winform部署yolov5-onnx模型
  • [C/C++]数据结构 循环队列
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [javascript]Tab menu实现
  • [leveldb] 2.open操作介绍
  • [Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件
  • [MySQL数据库部署及初始化相关]
  • [nlp] 多语言大模型不同语种/语系数据的数据配比调节
  • [PHP源码阅读]empty和isset函数
  • [Qualcomm][GPIO]高通芯片引脚相关知识记录
  • [Reprinted] 使用Spring Data Redis操作Redis(一) 很全面
  • [ruby on rails] array、jsonb字段