03 Maven基础 & MyBatis

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. 注解完成简单功能,配置文件完成复杂功能

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值