03 Maven基础 MyBatis

news2024/11/27 4:16:10

文章目录

  • Maven
    • 1、Maven简介
    • 2、Maven基本使用
    • 3、 IDEA使用Maven
    • 4 、依赖管理
  • MyBatis
    • 1、Mybatis概述
    • 2、Mybatis快速入门
    • 3、Mapper代理开发
    • 4、核心配置文件
    • 6、配置文件实现CRUD
    • 7、注解实现CRUD

Maven

1、Maven简介

  1. Maven是专门用于管理和构建Java项目工具
    (1)Apache Maven 是一个项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档
    (2)Apache 是一个开源组织
    (3)官网 :http://maven.apache.org/

  2. Maven主要功能

    • 提供了一套标准化的项目结构
      (1)每个开发工具(IDE)都有自己不同的项目结构,它们互相之间不通用
      (2)Maven提供了一套标准化的项目结构,所有的IDE使用Maven构建的项目完全一样

    • 提供了一套标准化的构建流程(编译,测试,打包,发布……)

    • 提供了一套依赖管理机制
      (1)依赖管理就是管理项目所依赖的第三方资源(jar包、插件)

      (2)Maven使用标准的 坐标 配置来管理各种依赖,只需要简单的配置就可以完成依赖管理

  3. Maven模型
    (1)项目对象模型 (Project Object Model)
    (2)依赖管理模型(Dependency)
    (3)插件(Plugin)

    • 项目对象模型 (Project Object Model)
      (1)项目对象模型就是将项目抽象成一个对象模型,有专属的坐标

    • 依赖管理模型(Dependency)
      (1)依赖管理模型就是使用坐标来描述当前项目依赖哪儿些第三方jar包
      在这里插入图片描述

    • 插件(Plugin)
      (1)紫色框部分用于完成标准化构建流程
      (2)需要编译Maven就会提供一个编译插件,需要打包,Maven就会提供了一个打包插件

  4. 仓库

    • 依赖jar包存储在本地仓库中,项目运行时从本地仓库中拿需要的依赖jar包

    • 仓库分类:

      • 本地仓库:自己计算机上的一个目录
      • 中央仓库:由Maven团队维护的全球唯一的仓库
        地址: https://repo1.maven.org/maven2/
      • 远程仓库(私服):一般由公司团队搭建的私有仓库
    • jar包的查找顺序
      (1)当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包
      (2)如果有,则在项目直接引用;如果没有,则去中央仓库中下载对应的jar包到本地仓库
      (3)如果搭建了远程仓库,jar包的查找顺序会变为:本地仓库 --> 远程仓库–> 中央仓库

2、Maven基本使用

  1. Maven 常用命令使用
    (1)使用命令需要在磁盘上进入项目的 pom.xml 目录下,打开命令提示符

    (2)命令使用格式:mvn 命令
    (3)常用命令

    • compile :编译,执行后
      (1)从阿里云下载编译需要的插件的jar包,在本地仓库也能看到下载好的插件
      (2)在项目下会生成一个 target 目录,编译后的字节码文件就放在该目录下

    • clean:清理,执行后
      (1)从阿里云下载清理需要的插件jar包
      (2)删除项目下的 target 目录

    • test:测试
      (1)该命令会执行所有的测试代码。

    • package:打包
      (1)从阿里云下载打包需要的插件jar包
      (2)在项目的 terget 目录下有一个jar包(将当前项目打成的jar包)

    • install:安装
      (1)该命令会将当前项目打成jar包,并安装到本地仓库

  2. Maven 生命周期

    • Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件
    • Maven 对项目构建的生命周期划分为3套:
      (1)clean :清理工作。
      (2)default :核心工作,例如编译,测试,打包,安装等。
      (3)site : 产生报告,发布站点等。这套声明周期一般不会使用。
    • 同一套生命周期内,执行后边的命令,前面的所有命令会自动执行
      例如:
      默认(default)生命周期如下:

      当我们执行 package (打包)命令时,它会先执行 compile 命令,再执行 test 命令,最后执行 package 命令
    • 默认的生命周期也有对应的很多命令,其他的一般都不会使用,我们只关注常用的:

3、 IDEA使用Maven

  1. IDEA配置Maven环境

    • 在IDEA项目中选择 File --> Settings
      在这里插入图片描述

    • 搜索 maven

    • 设置 IDEA 使用本地安装的 Maven,并修改配置文件路径

  2. Maven 坐标详解

    • 坐标
      (1)Maven 中的坐标是资源的唯一标识
      (2)使用坐标来定义项目或引入项目中需要的依赖
      (3)资源可以是插件、依赖、当前项目
    • Maven 坐标主要组成
      (1)groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
      (2)artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
      (3)version:定义当前项目版本号
  3. IDEA 创建 Maven项目

    • 创建模块,选择Maven,点击Next

    • 填写模块名称,坐标信息,点击finish,创建完成

  4. IDEA 导入 Maven项目

    • 选择右侧Maven面板,点击 + 号

    • 选中对应项目的pom.xml文件,双击即可

    • 如果没有Maven面板,选择View --> Appearance --> Tool Window Bars

  5. IDEA中使用Maven命令
    (1)可以通过下图所示进行命令的操作:

    (2)Maven-Helper 插件使用命令更加快捷

    • 配置 Maven-Helper 插件
      (1)选择 IDEA中 File --> Settings
      (2)选择 Plugins
      (3)搜索 Maven,选择第一个 Maven Helper,点击Install安装,弹出面板中点击Accept
      (4)重启 IDEA

4 、依赖管理

  1. 使用坐标引入jar包

    • 使用坐标引入jar包的步骤:
      (1)在项目的 pom.xml 中编写 标签
      (2)在 标签中 使用 引入坐标
      (3)定义坐标的 groupId,artifactId,version

      (4)点击刷新按钮,使坐标生效

    • 自动导入设置:省去点击刷新按钮
      (1)选择 IDEA中 File --> Settings
      (2)在弹出的面板中找到 Build Tools
      (3)选择 Any changes,点击 ok 即可生效

    • 具体的坐标可以到网站进行搜索:https://mvnrepository.com/

    • 快捷方式导入jar包的坐标:
      (1)在 pom.xml 中 按 alt + insert,选择 Dependency
      (2)在弹出的面板中搜索对应坐标,然后双击选中对应坐标
      (3)点击刷新按钮,使坐标生效

  2. 依赖范围

    • 通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境
    • 不指定 scope 标签时,默认就是 compile 值

      (1)compile :作用于编译环境、测试环境、运行环境。
      (2)test : 作用于测试环境。典型的就是Junit坐标,以后使用Junit时,都会将scope指定为该值
      (3)provided :作用于编译环境、测试环境。我们后面会学习 servlet-api ,在使用它时,必须将 scope 设置为该值,不然运行时就会报错
      (4)runtime : 作用于测试环境、运行环境。jdbc驱动一般将 scope 设置为该值,当然不设置也没有任何问题

第五版JDBC使用操作,手动导入jar包改为有Maven自动导入,还是七个步骤

MyBatis

1、Mybatis概述

  1. Mybatis概念
    (1)MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
    (2)MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了googlecode,并且改名为MyBatis 。2013年11月迁移到Github
    (3)官网:https://mybatis.org/mybatis-3/zh/index.html

    • 持久层
      (1)JavaEE三层架构:表现层、业务层、持久层
      (2)负责将数据到保存到数据库的那一层代码。将操作数据库的Java代码为持久层,Mybatis就是对jdbc代码进行了封装
      (3)持久层框架的使用占比

    • 框架
      (1)框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
      (2)在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

  2. JDBC 缺点
    (1)硬编码:注册驱动、获取连接;SQL语句
    (2)操作繁琐:手动设置参数;手动封装结果集

  3. Mybatis 优化
    (1)硬编码可以配置到配置文件
    (2)操作繁琐的地方mybatis都自动完成

2、Mybatis快速入门

  1. 案例
    • (2)创建模块,导入坐标
      在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标

      <dependencies>
          <!--mybatis 依赖-->
          <dependency>
              <groupId>org.mybatis</groupId>
              <artifactId>mybatis</artifactId>
              <version>3.5.5</version>
          </dependency>
          
          <!--mysql 驱动-->
          <dependency>
           <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.46</version>
          </dependency>
          
          <!--junit 单元测试-->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.13</version>
              <scope>test</scope>
          </dependency>
          
          <!-- 添加slf4j日志api -->
          <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.7.20</version>
          </dependency>
          
          <!-- 添加logback-classic依赖 -->
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-classic</artifactId>
              <version>1.2.3</version>
          </dependency>
          
          <!-- 添加logback-core依赖 -->
          <dependency>
              <groupId>ch.qos.logback</groupId>
              <artifactId>logback-core</artifactId>
              <version>1.2.3</version>
          </dependency>
      </dependencies>
      

      注意:需要在项目的 resources 目录下创建logback的配置文件

    • (3)编写 MyBatis 核心配置文件 – > 替换连接信息 解决硬编码问题
      在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml ,内容如下:

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <typeAliases>
              <package name="com.itheima.pojo"/>
          </typeAliases>
          
          <!--
          environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的
      environment
          -->
          <environments default="development">
              <environment id="development">
                  <transactionManager type="JDBC"/>
                  <dataSource type="POOLED">
                      <!--数据库连接信息-->
                      <property name="driver" value="com.mysql.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                      <property name="username" value="root"/>
                      <property name="password" value="1234"/>
                  </dataSource>
              </environment>
              <environment id="test">
               <transactionManager type="JDBC"/>
                  <dataSource type="POOLED">
                      <!--数据库连接信息-->
                      <property name="driver" value="com.mysql.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                      <property name="username" value="root"/>
                      <property name="password" value="1234"/>
                  </dataSource>
              </environment>
          </environments>
          <mappers>
             <!--加载sql映射文件-->
             <mapper resource="UserMapper.xml"/>
          </mappers>
      </configuration>
      

      三点:typeAliases、environments、mappers

    • (4)编写 SQL 映射文件 --> 统一管理sql语句,解决硬编码问题
      在模块的 resources 目录下创建映射配置文件 UserMapper.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="test">
          <select id="selectAll" resultType="com.itheima.pojo.User">
             select * from tb_user;
          </select>
      </mapper>
      
    • (5)编码
      (1)在 com.itheima.pojo 包下创建 User类
      (2)在 com.itheima 包下编写 MybatisDemo 测试类

      public class MyBatisDemo {
          public static void main(String[] args) throws IOException {
              //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
              String resource = "mybatis-config.xml";
              InputStream inputStream = Resources.getResourceAsStream(resource);
              SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
              //2. 获取SqlSession对象,用它来执行sql
              SqlSession sqlSession = sqlSessionFactory.openSession();
              //3. 执行sql
              List<User> users = sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id
              System.out.println(users);
              //4. 释放资源
              sqlSession.close();
         }
      }
      

将JDBC的七个步骤缩减为四个步骤
其中第一步(获取连接对象)和最后一步还是相对应(释放资源)
第二步对应原来的2、3步(定义SQL、获取pstmt对象)
第三步对应原来的4、5、6步(设置参数、执行SQL、处理结果)

第六版JDBC使用操作,使用MyBatis半成品,优化硬编码和操作繁琐问题,剩4个步骤(编码),编码前有三个步骤:1.导入坐标 2.编写MyBatis配置文件 3.编写SQL映射文件,3个准备步骤和4个编码步骤

  1. 解决SQL映射文件的警告提示:
    • 产生的原因:Idea和数据库没有建立连接,不识别表信息。但是大家一定要记住,它并不影响程序的执行

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

    • IDEA中配置MySQL数据库连接
      (1)点击IDEA右边框的 Database ,在展开的界面点击 + 选择 Data Source ,再选择 MySQL

      (2)在弹出的界面进行基本信息的填写

      第一次连接数据库需要安装驱动:设置Driver:MySQL(选择自己使用的数据库对应的驱动),点击测试连接会弹出下载驱动界面,点击下载,等待下载完成即可

      (3)点击完成后就能看到如下界面

      (4)可以进行数据库的操作,也可以编写SQL语句

3、Mapper代理开发

  1. Mapper代理开发概述
    (1)解决原生方式中的硬编码
    (2)简化后期执行SQL
  2. 使用Mapper代理要求
    (1)定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下图:

    (2)设置SQL映射文件的namespace属性为Mapper接口全限定名

    (3)在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
  3. 案例代码实现
    • 在 com.itheima.mapper 包下创建 UserMapper接口,代码如下:

      public interface UserMapper {
          List<User> selectAll();
      }
      
    • 在 resources 下创建 com/itheima/mapper 目录,并在该目录下创建 UserMapper.xml 映射配置文件

      <!-- namespace:名称空间。必须是对应接口的全限定名-->
      <mapper namespace="com.itheima.mapper.UserMapper">
          <select id="selectAll" resultType="com.itheima.pojo.User">
             select *
             from tb_user;
          </select>
      </mapper>
      
    • 在 com.itheima 包下创建 MybatisDemo2 测试类,代码如下:

      /**
       * Mybatis 代理开发
       */
      public class MyBatisDemo2 {
          public static void main(String[] args) throws IOException {
              //1. 加载mybatis的核心配置文件,获取 SqlSessionFactory
              String resource = "mybatis-config.xml";
              InputStream inputStream = Resources.getResourceAsStream(resource);
              SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
              //2. 获取SqlSession对象,用它来执行sql
              SqlSession sqlSession = sqlSessionFactory.openSession();
              //3. 执行sql
              //3.1 获取UserMapper接口的代理对象
              UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
              List<User> users = userMapper.selectAll();
              System.out.println(users);
              //4. 释放资源
              sqlSession.close();
         }
      }
      
    • 如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将核心配置文件的加载映射配置文件的配置修改为

      <mappers>
          <!--加载sql映射文件-->
          <!-- <mapper resource="com/itheima/mapper/UserMapper.xml"/>-->
          <!--Mapper代理方式-->
          <package name="com.itheima.mapper"/>
      </mappers>
      

第七版JDBC使用操作,利用Mapper进一步优化代码,准备步骤多了一个编写SQL映射文件同名的Mapper接口,4个准备步骤和4个编码步骤

准备步骤的1.导入坐标和2.编写MyBatis配置文件两个步骤不需要多过改动
编码步骤的1.加载配置文件、2.获取SqlSession对象、4.释放资源三个步骤基本不需要改动
需要操作的主要就是通过SQL映射文件和Mapper代理接口准备好要执行的SQL,然后在代码中使用SQL,像是回归到了在数据库上直接进行SQL语句编写,将一切无关琐碎代码去除(后面学习会进一步优化),减少因为使用JDBC带来的隔阂

4、核心配置文件

注意:各个标签有前后顺序

  1. 多环境配置
    在核心配置文件的 environments 标签中其实是可以配置多个 environment ,使用 id 给每段环境起名,在environments 中使用 default=‘环境id’ 来指定使用哪儿段配置。我们一般就配置一个 environment 即可

  2. 类型别名
    在映射配置文件中的 resultType 属性需要配置数据封装的类型(类的全限定名)。而每次这样写是特别麻烦的,Mybatis提供了 类型别名 (typeAliases) 可以简化这部分的书写。
    首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写

    <typeAliases>
        <!--name属性的值是实体类所在包-->
        <package name="com.itheima.pojo"/> 
    </typeAliases>
    

    通过上述的配置,我们就可以简化映射配置文件中 resultType 属性值的编写

    <mapper namespace="com.itheima.mapper.UserMapper">
        <select id="selectAll" resultType="user">
           select * from tb_user;
        </select>
    </mapper>
    

6、配置文件实现CRUD

通过案例演示

  1. 环境准备

    • 数据库表(tb_brand)及数据准备
    • 实体类 Brand
      在 com.itheima.pojo 包下创建 Brand 实体类(SQL语句返回值类型resultType)
    • 编写测试用例
      测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:
    • 安装 MyBatisX 插件
      • MybatisX 是一款基于 IDEA 的快速开发插件,为效率而生。
      • 主要功能
        (1)XML映射配置文件 和 接口方法 间相互跳转
        (2)根据接口方法生成 statement
  2. 查询所有数据

    • 实现步骤(三个关键操作步骤)

      • 编写接口方法
      • 编写SQL语句
      • 编写测试方法
    • (1)编写接口方法
      在 com.itheima.mapper 包写创建名为 BrandMapper 的接口。并在该接口中定义 List< Brand> selectAll() 方法

      public interface BrandMapper {
          /**
           * 查询所有
           */
          List<Brand> selectAll();
      }
      
    • (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>
      
    • (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. 执行方法
          //3.1 获取Mapper接口的代理对象
          BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
          List<Brand> brands = brandMapper.selectAll();
          System.out.println(brands);
          //5. 释放资源
          sqlSession.close();
      }
      
    • 实体类属性名 和 数据库表列名 不一致,不能自动封装数据
      解决办法:
      (1)给字段起别名
      (2)使用resultMap定义字段和属性的映射关系

    • 起别名

      • 方法一:在SQL语句中直接起别名
        缺点:代码不够精炼,只能用一次

      • 方法二:使用SQL片段起别名
        缺点:相比方法一提高了复用性,但还是不够灵活,不同查询组合要创建不同SQL片段

        <sql id="brand_column">
         id, brand_name as brandName, company_name as companyName, ordered, description, status
        </sql>
        
        <select id="selectAll" resultType="brand">
           select
            <include refid="brand_column" />
           from tb_brand;
        </select>
        
    • resultMap
      将字段名和属性名不同的进行映射,SQL语正常编写

      <!--
      	id: 唯一标识
      	type:映射的类型,支持别名
      -->
      <resultMap id="brandResultMap" type="brand">
          <result column="brand_name" property="brandName"/>
          <result column="company_name" property="companyName"/>
      </resultMap>
      
      <select id="selectAll" resultMap="brandResultMap">
         select *
         from tb_brand;
      </select>
      
  3. 查询详情

    • 参数占位符
      mybatis提供了两种参数占位符:

      • #{} :执行SQL时,会将 #{} 占位符替换为?,底层使用的是PreparedStatement
      • ${} :拼接SQL,底层使用的是 Statement ,会存在SQL注入问题
    • 使用parameterType

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

      对于有参数的mapper接口方法,在映射配置文件中可以配置 ParameterType 来指定参数类型。可以省略配置

    • 特殊字段处理

      • 转义字符
        &lt; 就是 < 的转义字符
      • <![CDATA[ 内容 ]]>:CD提示

  4. 多条件查询

    • 编写测试方法
    @Test
    public void testSelectByCondition() throws IOException {
        //接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";
        // 处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + 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. 执行方法
     	//方式一 :接口方法参数使用 @Param 方式调用的方法
        //List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
        //方式二 :接口方法参数是 实体类对象 方式调用的方法
         //封装对象
        /* Brand brand = new Brand();
            brand.setStatus(status);
            brand.setCompanyName(companyName);
            brand.setBrandName(brandName);*/
        
        //List<Brand> brands = brandMapper.selectByCondition(brand);
        
        //方式三 :接口方法参数是 map集合对象 方式调用的方法
        Map map = new HashMap();
        map.put("status" , status);
        map.put("companyName", companyName);
        map.put("brandName" , brandName);
        List<Brand> brands = brandMapper.selectByCondition(map);
        System.out.println(brands);
        //5. 释放资源
        sqlSession.close();
    }
    
    • 动态SQL

      • 需求:用户在输入条件时,可能会不填一些条件,导致代码报错

      • 动态SQL就是会随着用户的输入或外部条件变化而变化的SQL语句

      • Mybatis对动态SQL有很强大的支撑:

      • if 标签:条件判断

      <select id="selectByCondition" resultMap="brandResultMap">
         select *
         from tb_brand
         where
              <if test="status != null">
                 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>
      </select>
      

      上面代码还是存在问题,当第一个条件没有参数时,会导致后面判断条件前面多了and

      • where 标签
        作用:
        (1)替换where关键字
        (2)会动态的去掉第一个条件前的 and
        (3)如果所有的参数没有值则不加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>
      

      注意:需要给每个条件前都加上 and 关键字
      不使用where标签也可以解决:在原来的where 后加上恒等式 1=1,就可以消除多余的and
      where标签的原理就是使用了恒等式抵消and

  5. 单个条件(动态SQL)

    • 需求:用户任意选择 品牌名称 、 当前状态 、 企业名称 这三个条件中的一个
    • 可以使用choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句
    <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>
    

    注意:不加上where标签,当输入为空时会导致程序报错
    这里where标签的作用可以用otherwise代替,类似于default

    <otherwise>
    	1 = 1
    </otherwise>
    
  6. 添加数据

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

    • 主键返回

      <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 :指定将获取到的主键值封装到哪个属性里

  7. 修改

    • set 标签可以用于动态包含需要更新的列,忽略其它不更新的列
      <update id="update">
         update tb_brand
          <set>
              <if test="brandName != null and brandName != ''">
                 brand_name = #{brandName},
              </if>
              <if test="companyName != null and companyName != ''">
                 company_name = #{companyName},
              </if>
              <if test="ordered != null">
                 ordered = #{ordered},
              </if>
              <if test="description != null and description != ''">
                 description = #{description},
              </if>
              <if test="status != null">
                 status = #{status}
              </if>
          </set>
         where id = #{id};
      </update>
      
  8. 批量删除

    • foreach 标签
      用来迭代任何可迭代的对象(如数组,集合)
      • collection 属性:mybatis会将数组参数,封装为一个Map集合
        (1)默认:array = 数组
        (2)可以使用@Param注解改变map集合的默认key的名称
      • item 属性:本次迭代获取到的元素
      • separator 属性:集合项迭代之间的分隔符
        foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符
      • open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
      • close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次
      <delete id="deleteByIds">
         delete from tb_brand where id
         in
          <foreach collection="array" item="id" separator="," open="(" close=")">
             #{id}
          </foreach>
         ;
      </delete>
      
  9. Mybatis参数传递

    • Mybatis 接口方法中可以接收各种各样的参数
    • 多个参数:接口参数是多个时,在每个参数上都使用 @Param 注解,这样代码的可读性更高
    • 单个参数:
      • POJO 类型:直接使用。要求 属性名 和 参数占位符名称 一致
      • Map 集合类型:直接使用。要求 map集合的键名 和 参数占位符名称 一致
      • Collection 集合类型:使用 @Param 注解替换map集合中默认的 arg 键名
      • List 集合类型:使用 @Param 注解替换map集合中默认的 arg 键名
      • Array 类型:使用 @Param 注解替换map集合中默认的 arg 键名
      • 其他类型:参数占位符名称 叫什么都可以。尽量做到见名知意

7、注解实现CRUD

  1. 使用注解开发会比配置文件开发更加方便

    @Select(value = "select * from tb_user where id = #{id}")
    public User select(int id);
    

    注解是用来替换映射配置文件方式配置的,所以使用了注解,就不需要再映射配置文件中书写对应的 statement

  2. Mybatis 针对 CURD 操作都提供了对应的注解,已经做到见名知意

    • 查询 :@Select
    • 添加 :@Insert
    • 修改 :@Update
    • 删除 :@Delete
  3. 注解完成简单功能,配置文件完成复杂功能

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

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

相关文章

笔记:现代卷积神经网络之AlexNet

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 模型介绍 2012年&#xff0c;AlexNet横空出世。它首次证明了学习到的特征可以超越手工设计的特征。它一举打破了计算机视觉研究的现状。 AlexNet使用了8层卷积神经…

【C#】| 与 及其相关例子

按位或&#xff08;|&#xff09; 按位或运算符 | 对两个数的每一位进行比较&#xff0c;如果两个数中至少有一个为 1&#xff0c;则结果位为 1&#xff1b;否则&#xff0c;结果位为0。 1010 (10 in decimal) | 1100 (12 in decimal) ------1110 (14 in decimal) 力扣相关…

几种常用排序算法

1 基本概念 排序是处理数据的一种最常见的操作&#xff0c;所谓排序就是将数据按某字段规律排列&#xff0c;所谓的字段就是数据节点的其中一个属性。比如一个班级的学生&#xff0c;其字段就有学号、姓名、班级、分数等等&#xff0c;我们既可以针对学号排序&#xff0c;也可…

【开源库】libodb库编译及使用

前言 本文介绍windows平台下libodb库的编译及使用。 文末提供libodb-2.4.0编译好的msvc2019_64版本&#xff0c;可直接跳转自取 ODB库学习相关 【开源库学习】libodb库学习&#xff08;一&#xff09; 【开源库学习】libodb库学习&#xff08;二&#xff09; 【开源库学习】…

K8S 部署jaeger-operator,与其演示项目hotrod

最近在研究observabilty在K8S环境的onboard&#xff0c;查阅了一些资料&#xff0c;发现现在网上Prometheus/Metrics相关的资源&#xff0c;是比较全面的&#xff0c;而Trace相关的部分不是很全面&#xff0c;所以写下这篇博文&#xff0c;以做备忘和分享。 组件介绍 我这里选…

C++面试题之判断一个变量是不是指针

对于变量其实对应的就是内存&#xff0c;而内存并没有表明一定是什么数据类型&#xff0c;所以判断变量是否是一个指针其实是一个参数类型匹配问题&#xff0c;在C中支持函数的重载&#xff0c;那么不同的函数因为参数的不同从而匹配不同函数调用过程。 编译器在进行函数匹配调…

格密码基础

目录 写在前面 一. 格上基本向量 二. 封闭球内格点数 三. 半稳定格 四. Chernoff-Hoeffding 界 五. 格密码中常用的细节 六. 可证明安全的格基 6.1 引入问题 6.2 格基选取 6.3 流程性小结 写在前面 本文章主要介绍格密码中所使用的一些基本概念&#xff0c;其中包括…

SVN分支管理基本原理

原文全文详见个人博客&#xff1a; SVN分支管理基本原理学习完svn和git的版本管理理念上的差异后&#xff0c;自然的我们再进一步对比svn和git在分支管理上的原理差异&#xff0c;这种差异正是由二者版本管理理念和存储方式差异造成的&#xff0c;今天我们先研究一下svn的分支…

Python爬虫(基本流程)

1. 确定目标和范围 明确需求&#xff1a;确定你需要从哪些网站抓取哪些数据。合法性&#xff1a;检查目标网站的robots.txt文件&#xff0c;了解哪些内容可以被抓取。数据范围&#xff1a;确定爬取数据的起始和结束点&#xff0c;比如时间范围、页面数量等。 2. 选择合适的工…

展望未来:利用【Python】结合【机器学习】强化数据处理能力

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 一、引言二、数据清洗与预处理三、特征工程四、数据可视化五、模型训练与评估六、模型部署与优化七、总结 在数据驱动的时代&#xff0c;数据处理与机器学习技术的结合已成为推动业务增长和创新的关键…

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测&#xff0…

前端基础之JavaScript学习——函数的使用

大家好我是来自CSDN的前端寄术区博主PleaSure乐事&#xff0c;今天我们继续有关JavaScript的学习&#xff0c;使用的编译器为vscode&#xff0c;浏览器为谷歌浏览器。 函数的声明与使用 声明 在JavaScript当中函数的声明和其他语言类似&#xff0c;使用如下格式即可声明&…

SpringBoot+Session+redis实现分布式登录

SpringBootSessionRedis实现分布式登录功能实现 文章目录 目录 文章目录 前言 一、引库 二、修改配置文件 三、使用 四、解决乱码问题 1.引库 2.配置redis序列化 3.配置Session-Redis序列化 前言 这里简单介绍一下&#xff0c;如果你想多台机器部署你的项目的话&#xff0c;在…

Python爬虫速成之路(6):Selenium的使用

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

Excel的操作

Excel的操作 一、Excel的作用 Excel是一款功能强大的电子表格软件&#xff0c;主要用于数据处理和分析。 二、Excel的基础操作 新建文档 一般情况下&#xff0c;就在桌面空白处&#xff0c;点击鼠标右键&#xff0c;即可新建 三、页面布局 1、快速访问工具栏 主要包含&am…

前端特效动画魔法书:文字渐入效果实现,可做引导页面

前端特效动画魔法书&#xff1a;文字渐入效果实现&#xff0c;可做引导页面 简介 在网页设计的世界中&#xff0c;动画是吸引用户眼球的魔法。Anime.js&#xff0c;一个轻量级且功能强大的JavaScript动画库&#xff0c;是实现这一魔法的完美工具。本文将作为你的技术文档&…

深入理解PHP基础【代码审计实战指南】

文章目录 基础语法单双引号的区别前后端分离数据类型PHP常量函数var_dump函数count函数print_r函数**readfile&#xff08;&#xff09;函数****file_get_contents()函数****file_put_contents()函数**header函数fopen函数fread 函数rename函数copy&#xff08;&#xff09;函数…

什么是单例模式,有哪些应用?

目录 一、定义 二、应用场景 三、6种实现方式 1、懒汉式&#xff0c;线程不安全。 2、懒汉式&#xff0c;线程安全 3、双检锁/双重校验锁&#xff08;DCL&#xff0c;即 double-checked locking&#xff09; 4、静态内部类方式-------只适用于静态域 5、饿汉式 6、枚举…

MATLAB函数介绍——plotm

简述 matlab中&#xff0c;plotm和不带“m”的plot意义相似&#xff0c;都是绘制二维图像的。只是加了m以后&#xff0c;在绘制时将图像投影到了世界地图坐标系上面进行显示。 plotm的第一个输入量是纬度&#xff0c;第二个输入量是经度&#xff0c;单位都是弧度。 例程 官方…

各种复现,保证质量

代码复现&#xff0c;文献复现&#xff0c;模型复现&#xff0c;算法复现&#xff0c;文章复现&#xff0c;创新点等等&#xff0c;python/matlab/c语言/r语言均可&#xff0c;保证高质量完成&#xff0c;可接急单&#xff0c;不成功不收费&#xff01;