Java:Mybatis的使用

导读:本篇文章讲解 Java:Mybatis的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、Mybatis的概述

MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发

MyBatis中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html

二、Mybatis快速入门

1、创建user表,添加数据

create database mybatis;
use mybatis;

drop table if exists tb_user;

create table tb_user(
	id int primary key auto_increment,
	username varchar(20),
	password varchar(20),
	gender char(1),
	addr varchar(30)
);


INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京');
INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津');
INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');

2、创建模块,导入坐标

<!--        pom.xml  -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>mybatis-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
<!--        mybatis依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
<!--        mysql依赖-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <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>

</project>

3、编写 MyBatis 核心配置文件 – > 替换连接信息 解决硬编码问题

<!--   mybatis-config.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <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?userSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

4、编写 SQL 映射文件 –> 统一管理sql语句,解决硬编码问题

<!-- UserMapper.xml  -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    namespace:名称空间
    id:唯一标识
    resultType:返回结果的类型
 -->
<mapper namespace="test">
    <select id="selectAll" resultType="com.itheima.pojo.User">
        select * from tb_user;
    </select>
</mapper>

在这里插入图片描述

5、编码

1.1 定义POJO类

package com.itheima.pojo;

// alt+鼠标左键,整列编辑
// int 基础类型,使用包装类。避免初始化值不统一的问题,包装类的初始化值都为null
public class User {
    private Integer id        ;
    private String username  ;
    private String password  ;
    private String gender    ;
    private String addr      ;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

1.2 加载核心配置文件,获取 SqlSessionFactory 对象

1.3 获取 SqlSession 对象,执行 SQL 语句

1.4 释放资源

package com.itheima;

import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * MyBatisDemo快速入门代码
 */
public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
//        1.加载mybatis的核心配置文件,获取 SqlSessionFactory 对象
//        在mybatis官网有代码案例
        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语句
//        参数是UserMapper.xml中 名称空间 的sql唯一标识(id):
//        List<User> users = sqlSession.selectList("test.selectAll");
        List<User> users = sqlSession.selectList("test.selectAll");

        System.out.println(users);

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

1.5 报错处理

(1)错误“ Java:不支持发行版本5”

解决方式1

直接Ctrl+shit+alt+s出现以下面版
在这里插入图片描述
因为我本地安装的jdk是14版本,所以这里显示的就是14版本,这里没有问题,然后向下找module模块,然后发现这里的langeage level居然是5.
在这里插入图片描述
修改到对应的版本,然后应用保存就可以关闭了。
在这里插入图片描述
然后去File里找Settings打开,在打开的页面中找到Build开头的那一串,接着找它下面Compiler下的java compiler,右侧还要修改成自己所使用的java版本
在这里插入图片描述

解决方式2

在 maven地址\conf\setting.xml中设置默认jdk版本…

代码:1.8是你自己的jdk版本号

  <profile>
      <id>development</id>
          <activation>
            <jdk>1.8</jdk>
            <activeByDefault>true</activeByDefault>
          </activation>
      <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
 </profile>

将上述代码放到maven\conf\setting.xml中
在这里插入图片描述
重启idea
设置完成后,新建maven项目,不用修改设置即可编译成功.

6、Idea添加mysql连接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 xml文件没有sql语法提示

在这里插入图片描述
在这里插入图片描述

1.2 仍没有解决的话

将光标随意移至一处SQL语句附近,按Alt+Enter,出现相关提示。
在这里插入图片描述
在这里插入图片描述

或者是:选择Language injection Settings,出现弹窗之后,在下图所指示位置,选择MySQL
在这里插入图片描述
在这里插入图片描述

三、Mapper 代理开发

  1. 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
  2. 设置SQL映射文件的namespace属性为Mapper接口全限定名
  3. 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
  4. 编码
    • 通过 SqlSession 的 getMapper方法获取 Mapper接口的代理对象
    • 调用对应方法完成sql的执行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itheima;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * MyBatisDemo代理开发
 */
public class MyBatisDemo2 {
    public static void main(String[] args) throws IOException {
//        1.加载mybatis的核心配置文件,获取 SqlSessionFactory 对象
//        在mybatis官网有代码案例
        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语句
//        参数是UserMapper.xml中 名称空间 的sql唯一标识(id):
//        List<User> users = sqlSession.selectList("test.selectAll");

//        3.获取对应的UserMapper接口的代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.selectAll();

        System.out.println(users);

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

四、Mybatis核心配置文件说明

  • typeAliases:配置别名
  • environments:配置数据库的连接环境
  • mapper:加载sql映射文件
  • 注意:配置各个标签时,需要遵守前后顺序
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!--    配置各个标签时,需要遵守前后顺序  -->

<!-- 配置别名,可以将name="com.itheima.pojo",省略不写,即在UserMapper.xml中,resultType=“user” -->
    <typeAliases>
        <package name="com.itheima.pojo"/>
    </typeAliases>

<!--
    environments:配置数据库的连接环境,可以配置多个environment,通过default控制连接哪个数据库
  -->
    <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://127.0.0.1:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
<!--        test测试库   -->
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--        数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
<!--        加载sql映射文件-->
        <mapper resource="com/itheima/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

五、Mybatis综合案例:增删改查

1、功能列表

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

2、准备环境

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


SELECT * FROM tb_brand;

1.2 实体类 Brand

com.itheima.pojo 包下创建 Brand 实体类。

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。自己写时要补全这部分代码
}

1.3 编写测试用例

测试代码需要在 test/java 目录下创建包及测试用例。项目结构如下:
在这里插入图片描述

1.4 安装 MyBatisX 插件

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

  • 主要功能

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

    点击 file ,选择 settings ,就能看到如下图所示界面
    在这里插入图片描述

  • 插件效果 在这里插入图片描述
    红色头绳的表示映射配置文件,蓝色头绳的表示mapper接口。
    在mapper接口点击红色头绳的小鸟图标会自动跳转到对应的映射配置文件,
    在映射配置文件中点击蓝色头绳的小鸟图标会自动跳转到对应的mapper接口。
    也可以在mapper接口中定义方法,自动生成映射配置文件中的 statement ,如图所示
    在这里插入图片描述

2.0 执行顺序

MyBatisTest.java:编写测试方法,进行调用接口。
BrandMapper.java:调用接口
BrandMapper.xml:编写sql语句

MyBatisTest.java --> BrandMapper.java --> BrandMapper.xml

3、查询所有数据

1.1 主要步骤

  1. 编写接口方法: Mapper接口
    • 参数:无
    • 结果:List<Brand>
  2. 编写 SQL语句: SQL映射文件:
  3. 执行方法,测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2 问题处理:数据封装不全,有的为null

原因
数据库表的字段名称(带下划线),和 实体类的属性名称(驼峰) 不一样, 则不能自动封装数据。

(1)方案一:使用起别名+sql片段

  • 起别名:不用 *,用单独的字段,将字段起别名,别名跟实体类的属性名称保持一致
  • select id, brand_name as brandName, company_name as companyName, ordered, description, status from tb_brand;
  • 缺点:每次查询都要定义一次别名
  • 解决:用SQL片段的方式处理(但仍不灵活
<!-- BrandMapper.xml  -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    namespace:名称空间
    id:唯一标识
    resultType:返回结果的类型
 -->
<mapper namespace="com.itheima.mapper.BrandMapper">

<!--
    数据库表的字段名称(带下划线),和 实体类的属性名称(驼峰)  不一样, 则不能自动封装数据
        * 起别名:不用*,用单独的字段,将字段起别名,别名跟实体类的属性名称保持一致
            * 缺点:每次查询都要定义一次别名
                * 解决:用SQL片段的方式处理(但仍不灵活)
-->


<!--    sql片段-->
	<sql id="brand_column">
        id, brand_name as brandName, company_name as companyName, ordered, description, status
    </sql>
    <select id="selectAll" resultType="com.itheima.pojo.Brand">
        select <include refid="brand_column"></include>
        from tb_brand;
    </select>

</mapper>

(2)方案二:resultMap方式

  1. 定义<resultMap>标签
  2. <select>标签中,使用 resultMap属性 替换 resultType属性
<!-- BrandMapper.xml  -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
    namespace:名称空间
    id:唯一标识
    resultType:返回结果的类型
 -->
<mapper namespace="com.itheima.mapper.BrandMapper">

<!--
    数据库表的字段名称(带下划线),和 实体类的属性名称(驼峰)  不一样, 则不能自动封装数据
        * resultMap:
            1. 定义<resultMap>标签
            2. 在<select>标签中,使用 resultMap属性 替换 resultType属性
-->
<!--
    id:唯一标识
    type:映射的类型,支持别名
-->
    <resultMap id="brandResultMap" type="com.itheima.pojo.Brand">
        <!--
                id:完成主键字段的映射
                    column:表的列名
                    property:实体类的属性名
                result:完成一般字段的映射
                    column:表的列名
                    property:实体类的属性名
            -->
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    <!--  在<select>标签中,使用 resultMap属性 替换 resultType属性  -->
        <select id="selectAll" resultMap="brandResultMap">
            select *
            from tb_brand;
        </select>
</mapper>

4、查询详情

1.1 主要步骤

  1. 编写接口方法: Mapper接口
    • 参数:id
    • 结果:Brand
  2. 编写 SQL语句: SQL映射文件:
  3. 执行方法,测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2 注意事项

  1. 参数占位符:
    1)#{}:执行SQL时,会将#{}占位符替换为?,将来自动设置参数值
    2)${}:拼SQL。会存在SQL注入问题
    3)使用时机:
    * 参数传递,都使用#{}
    * 如果要对表名、列名进行动态设置,只能使用${}进行sql拼接。
  2. parameterType:
    • 用于设置参数类型,该参数可以省略
  3. SQL 语句中特殊字符处理:
    • 转义字符
    • <![CDATA[ 内容 ]]>: 输入CD会有提示

5、查询–多条件查询

1.1 主要步骤

  1. 编写接口方法: Mapper接口
    • 参数:所有查询条件
    • 结果:List<Brand>
  2. 编写 SQL语句: SQL映射文件:
  3. 执行方法,测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2 注意事项

  • 查询-多条件查询

    • 参数接收(三种方式)
      1. 散装参数:如果方法中有多个参数,就需要使用@Param("参数名称") 标记每一个参数,在映射配置文件中就需要使用 #{参数名称} 进行占位
      2. 对象参数:对象的属性名称 要和 参数占位符名称 一致
      3. map集合:只需要保证SQL中的参数名 和 map集合的键的名称对应上,即可设置成功
  • 其实都是一个方法。只是看要不要对散装的参数进行组装而已。

1.3 问题:查询条件必须全部输入才可以查询到结果,不灵活

解决方案:参考:<6、查询--多条件查询-动态条件>

6、查询–多条件查询-动态条件

1.1 动态条件

动态条件,其实就是动态SQL,
而动态SQL其实就是SQL语句中加入if判断等语句。

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

if
choose (when, otherwise)
trim (where, set)
foreach

只需要修改BrandMapper.xml文件,其他都不用变
在这里插入图片描述

7、查询–单条件查询-动态条件

1.1 单条件查询-动态查询是什么

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

这种需求需要使用到 choose(when,otherwise)标签 实现, 而 choose 标签类似于Java 中的switch语句。
在这里插入图片描述

8、添加

1.1 主要步骤

  1. 编写接口方法: Mapper接口
    • 参数:除了id之外的所有数据
    • 结果:void
  2. 编写 SQL语句: SQL映射文件:
  3. 执行方法,测试

(1) 编写接口方法

BrandMapper 接口中定义添加方法。

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

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

(3) 编写测试方法

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

1.2 添加-主键返回

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

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

Java:Mybatis的使用

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

明白了什么时候 主键返回 。接下来我们简单模拟一下,在添加完数据后打印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 :指定将获取到的主键值封装到哪儿个属性里

9、修改–修改全部字段

1.1 主要步骤

  1. 编写接口方法: Mapper接口
    • 参数:所有数据
    • 结果:void
  2. 编写 SQL语句: SQL映射文件:
  3. 执行方法,测试

(1) 编写接口方法

BrandMapper 接口中定义修改方法。

 /**
  * 修改
  * 返回值也可以是void
  */
 int update(Brand brand);

上述方法参数 Brand 就是封装了需要修改的数据,而id肯定是有数据的,这也是和添加方法的区别。

(2) 编写SQL语句

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

<update id="update">
    update tb_brand
    set
        brand_name = #{brandName},
        company_name = #{companyName},
        ordered = #{ordered},
        description = #{description},
        status = #{status}
    where id = #{id};
</update>

(3) 编写测试方法

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

@Test
    public void testUpdate() throws IOException {
//        接收参数,暂时写死
        int status = 1;
        String companyName = "111";
        String brandName = "111";
        String description = "2222";
        int ordered = 100;
        int id = 6;


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


//        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();
//        SqlSession sqlSession = sqlSessionFactory.openSession(true);// 开启自动提交事务
//        3.获取对应的brandMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        4. 执行方法
        int count = brandMapper.update(brand);
        System.out.println(count);

//          手动提交事务
        sqlSession.commit();

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

10、修改–修改动态字段

(1) 编写SQL语句

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>

(2) 编写测试方法

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

@Test
public void testUpdate() throws IOException {
    //接收参数
    int status = 0;
    String companyName = "波导手机";
    String brandName = "波导";
    String description = "波导手机,手机中的战斗机";
    int ordered = 200;
    int id = 6;

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

    //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. 执行方法
    int count = brandMapper.update(brand);
    System.out.println(count);
    //提交事务
    sqlSession.commit();
    //5. 释放资源
    sqlSession.close();
}

11、删除–一行数据

(1) 编写测试方法

@Test
    public void testDeleteById() throws IOException {
//        接收参数,暂时写死
        int id = 6;

//        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();
//        SqlSession sqlSession = sqlSessionFactory.openSession(true);// 开启自动提交事务
//        3.获取对应的brandMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        4. 执行方法
        brandMapper.deleteById(id);

//          手动提交事务
        sqlSession.commit();

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

(2) 编写接口方法

 /**
  * 删除一行数据
  */
 void deleteById(int id);

(3) 编写接口方法

<!--    删除一行数据 -->
 <delete id="deleteById">
     delete from tb_brand where id = #{id};
 </delete>

12、删除–批量删除

(1) 编写测试方法

@Test
    public void testDeleteByIds() throws IOException {
//        接收参数,暂时写死
        int[] ids = {5,7,8};

//        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();
//        SqlSession sqlSession = sqlSessionFactory.openSession(true);// 开启自动提交事务
//        3.获取对应的brandMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//        4. 执行方法
        brandMapper.deleteByIds(ids);

//          手动提交事务
        sqlSession.commit();

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

(2) 编写接口方法

/**
 * 批量删除
 */
void deleteByIds(int[] ids);

(3) 编写接口方法

<!--    批量删除 -->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        ;
    </delete>

编写SQL时需要遍历数组来拼接SQL语句。Mybatis 提供了 foreach 标签供我们使用

foreach 标签

用来迭代任何可迭代的对象(如数组,集合)。

  • collection 属性:
    • mybatis会将数组参数,封装为一个Map集合。
      • 默认:array = 数组
      • 使用@Param注解改变map集合的默认key的名称
  • item 属性:本次迭代获取到的元素。
  • separator 属性:集合项迭代之间的分隔符。foreach 标签不会错误地添加多余的分隔符。也就是最后一次迭代不会加分隔符。
  • open 属性:该属性值是在拼接SQL语句之前拼接的语句,只会拼接一次
  • close 属性:该属性值是在拼接SQL语句拼接后拼接的语句,只会拼接一次

@Param方式

(2) 编写接口方法

/**
 * 批量删除
 */
void deleteByIds(@Param("ids") int[] ids);

(3) 编写接口方法

<!--    collection属性的值,发生了改变 -->
<!--    批量删除 -->
    <delete id="deleteByIds">
        delete from tb_brand where id
        in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
        ;
    </delete>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84931.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!