JavaWeb--Mybatis

一:Mybatis概述

1.Mybatis概念

MyBatis 是一款优秀的 持久层框架 ,用于简化 JDBC 开发;
MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis 2013 11 月迁移到 Github;
官网: https://mybatis.org/mybatis-3/zh/index.html
持久层:
负责将数据到保存到数据库的那一层代码。
以后开发我们会将操作数据库的 Java 代码作为持久层。而 Mybatis 就是对 jdbc 代码进行了封装。
JavaEE 三层架构:表现层、业务层、持久层
框架:
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

2.JDBC缺点

硬编码:
    注册驱动、获取连接
      代码有很多字符串,而这些是连接数据库的基本信息,以后如果要将 Mysql 数据库换成其他的关系型数据库的话,这些地方都需要修改,如果放在此处就意味着要修改我们的源代码。
   SQL 语句
      如果表结构发生变化, SQL 语句就要进行更改。这也不方便后期的维护。
操作繁琐:
   手动设置参数
   手动封装结果集

3.Mybatis 优化

硬编码可以配置到 配置文件 操作繁琐的地方mybatis 自动完成

二:MyBatis快速入门

1.步骤

2.解决SQL映射文件的警告提示

产生原因:idea和数据库没有建立连接,不识别表信息

解决方式:在idea中配置MySQL数据库连接

三:Mapper代理开发

四:MyBatis核心配置文件

五:配置文件完成增删改查

1.简单查询

(1)操作

(2)参数占位符

#{}:会将其替换为?,为了防止SQL注入问题

${}:拼sql,会存在SQL注入问题

使用时机:

       *参数传递的时候:#{}

       *表明或者列名不固定的情况下:${}会存在sql注入问题

(3)parameterType:

用于设置参数类型,该参数可以省略

(4)SQL语句中特殊字符处理

    *转义字符

    *<!CDATA[内容]]>

2.多条件查询

(1)步骤

(2)编写接口方法

(3)编写SQL语句

<select id="selectByCondition" resultMap="brandResultMap">
    select *
    from tb_brand
    where status = #{status}
    and company_name like #{companyName}
    and brand_name like #{brandName}
</select>

 3.多条件动态条件查询

if:用于判断参数是否有值,使用test属性进行判断

       *存在的问题:第一个条件不需要逻辑运算符

       *解决方案:

                1)使用恒等式让所有条件格式都一样

                2)<where>标签替换where关键字

<select id="selectByCondition" resultMap="brandResultMap">
   select *
   from tb_brand
   <where>

        <if test="status != null">
            and status = #{status}
        </if>

        <if test="companyName != null and companyName != '' ">
            and company_name like #{companyName}
        </if>

        <if test="brandName != null and brandName != '' ">
            and brand_name like #{brandName}
        </if>

    </where>
</select>

4.单条件动态查询

从多个条件中选择一个

chhoose(when,otherwise):选择,类似于java中的switch语句

(1)编写接口方法

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

(2)编写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>

(3)编写测试方法

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

5.添加

(1)添加

(2)主键返回

6.修改

(1)修改全部字段

(2)修改动态字段

7.删除

(1)删除一个

(2)批量删除

六:参数传递

1.多个参数:

封装为Map集合

  以 arg 开头 :第一个参数就叫 arg0 ,第二个参数就叫 arg1,以此类推。如:
        map.put("arg0",参数值1);
        map.put("arg1",参数值2);
以 param 开头 : 第一个参数就叫 param1 ,第二个参数就叫 param2,依次类推。如
        map.put("param1",参数值1);
        map.put("param2",参数值2);  

2.单个参数

POJO 类型 :直接使用。要求属性名 参数占位符名称 一致
Map 集合类型 :直接使用。要求 map 集合的键名 参数占位符名称 一致
Collection 集合类型:Mybatis 会将集合封装到 map 集合中,如下:
        map.put("arg0", collection 集合 );
        map.put("collection",collection 集合 ;
        可以使用 @Param 注解替换 map 集合中默认的 arg 键名。
List 集合类型:Mybatis 会将集合封装到 map 集合中,如下:
        map.put("arg0", list 集合 );
        map.put("collection", list 集合 );
        map.put("list", list 集合 );
        可以使用 @Param 注解替换 map 集合中默认的 arg 键名。
Array 类型:Mybatis 会将集合封装到 map 集合中,如下:
        map.put("arg0",数组 );
        map.put("array",数组 );
        可以使用 @Param 注解替换 map 集合中默认的 arg 键名。
其他类型: 比如 int 类型, 参数占位符名称 叫什么都可以。尽量做到见名知意

七:注解完成增删改查

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const&#xff0c;但是const对象不一定是conste…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…

SSH移植到BusyBox

手动编译SSH安装挺麻烦的&#xff0c;本文主要是我大量借鉴和实践总结出来的流程&#xff0c;一步一按照做不会有太大问题。 移植平台&#xff1a;IMX6UL(迅为开发板) 根文件系统&#xff1a;BusyBox 所有操作都建议不要在root账户下运行&#xff0c;并且make install的安装路…

【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

文章目录 一、使用 ffmpeg 命令提取 音视频 数据1、提取音频数据 - 保留封装格式2、提取视频数据 - 保留封装格式3、提取视频数据 - 保留编码格式4、提取视频数据 - 重新编码5、提取音频数据 - 保留编码格式6、提取音频数据 - 重新编码 一、使用 ffmpeg 命令提取 音视频 数据 1…

《2024国家自然科学基金青年基金》 相关申请注意事项解读

一 年龄计算 2004 对应 89 2005 对应 90 2006 对应 91 2007 对应 92 2008 对应 93 2009 对应 94 2010 对应 95 .。。 二 资助比例&#xff08;2023&#xff09; 2024年 23.13% 2023年 24% 三 2024年政策变动&#xff0c;只能申请3年的30万&#xff0c;不能像23年一样选择10-20的…

【二十九】springboot高并发示例

本章演示在springboot项目中的高并发demo&#xff0c;演示导致的问题&#xff0c;以及单机部署下的解决方案和集群部署下的解决方式以及分布式下的解决方案。 目录 一、单机模式下高并发问题 二、集群模式下高并发问题 一、单机模式下高并发问题 前提&#xff1a;先写一个减扣…

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1&#xff09;TI IWR 6843 ISK 1块 2&#xff09;Micro USB 数据线 1条 1.2 系统环境 1&#xff09;VMware Workstation 15 Player 虚拟机 2&#xff09;Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统&#xff0c;可通过如下指令进行…

腾讯云轻量服务器流量用完了怎么办?停机吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…

深入了解XSS攻击:原理、防御与应对策略

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

结构体内存对齐详解

目录 结构体对齐&#xff1a; 为什么要进行内存对齐&#xff1f; 关于结构体的详解文章&#xff1a;C语言结构体详解_结构体变量和结构体类型举例-CSDN博客 结构体对齐&#xff1a; 存储的时候和当前存储的成员类型字节大小和默认对齐数比较&#xff0c;取小值 存在该对齐数的…

PodMan容器技术

容器 容器技术 软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上&#xff0c;软件应用的运行时环境安装 在物理主机或虚拟机上运行的操作系统中。 然后&#xff0c;管理员在操作系统上安装应用依赖项。 在RHEL中&#xff0c;诸如 RPM 等打包系统可协助管…

Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password‘ 无法加载

使用docker部署的mysql8.0.29再使用Navicat连接myslq报错Authentication plugin ‘xxxxxxx’ cannot be loaded&#xff1a;XXXXXX &#xff08;无法加载身份验证插件&#xff09; 原因&#xff1a;mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规…

嘉绩咨询:八位一体产业创新,赋能品牌新零售

探索新零售领域不断创新高峰的嘉绩咨询在今天全面展现了其“八位一体”产业创新模式&#xff0c;该模式旨在为新零售品牌提供全方位的赋能服务。立足于广州的企业战略导航专家&#xff0c;吹响了帮助中国品牌实现全球化发展的号角。 嘉绩咨询的核心业务涵盖招商教育、招商落地、…

防火墙IPSEC VPN实验

一、实验拓扑 二、实验要求 在上一个实验的基础上增加一条&#xff1a; 在FW5和FW3之间建立一条IPSec通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 三、实验配置 此实验是根据上一个实验拓展&#xff0c;所以前面的配置可以看之前的文章。 先配置FW1…

【毕业】 医药药店销售管理系统

1、引言 设计结课作业,课程设计无处下手&#xff0c;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;数据库&#xff0c;java&#xff0c;python&#xff0c;vue&#xff0c;html作业复杂工程量过大&#xff1f;毕设毫无头绪等等一系列问题。你想要解决的问题&am…

手写简易操作系统(三)--加载Loader

前情提要 上一节我们讲了如何启动计算机&#xff0c;这一节我们讲如何加载内核&#xff0c;内核是存在于硬盘上的一段程序&#xff0c;要加载这段程序&#xff0c;那么必然需要从硬盘上读取数据&#xff0c;这里我们就需要使用 ATA PIO 模式 根据ATA规范&#xff0c;所有符合A…

猫头虎分享已解决Bug || 数据中心断电:PowerLoss, DataCenterBlackout

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

WordPress 从入门到精通【设置 WordPress】

前言&#xff1a;为方便演示&#xff0c;前几张图使用 Playground 环境截取 如果你还不会部署WordPress&#xff0c;请看下面的链接并使用雨云可视化构建一个WordPress站点&#xff1a; 超简单EP面板搭建WordPress网站教程 - 风屿岛 10 (biliwind.com) 进入仪表盘 在搭建完…