MyBatis 快速入门

news2024/11/22 11:11:22

MyBatis 快速入门

  • 前言
  • 什么是 MyBatis
    • 简介
    • 核心特性
    • 使用示例
      • 配置文件
      • Mapper 接口
      • SQL 映射文件
      • 使用 MyBatis
  • = = = = = = = = 如果大家对以上的导读很懵怎么办!没关系 往下阅读! = = = = = = = = =
  • 1. MyBatis 介绍
    • 1.1. 什么是MyBatis
    • 1.2. 持久层
    • 1.3. 框架
    • 1.4. JDBC 弊端
    • 1.5. MyBatis 简化
  • 2. MyBatis 快速入门
    • 2.1. 查询user表中所有数据
    • 2.2. 解决 SQL 映射文件的警告提示
  • 3. Mapper 代理开发
    • 3.1. 目的
    • 3.2. 使用 Mapper 代理方式完成入门案例
  • 4. MyBatis 核心配置文件
    • 4.1. 类型别名(typeAliasess)
    • 4.2. 数据库配置连接环境信息
  • 5. 配置文件完成增删改查
    • 5.1. 准备环境
      • 5.1.1. 数据库表 tb_brand
      • 5.1.2. 实体类 Brand
      • 5.1.3. 测试用例
      • 5.1.4. 安装MyBatiisX 插件
    • 5.2. 查询
      • 5.2.1. 查询所有数据
      • 5.2.2. 查看详情
      • 5.2.3. 条件查询
        • 1.多条件查询
        • 2.多条件-动态条件查询
        • 3.单条件-动态条件查询
    • 5.3. 添加
      • 5.3.1. 主键返回
    • 5.4. 修改
      • 5.4.1. 修改全部字段
      • 5.4.2. 修改动态字段
    • 5.5. 删除
      • 5.5.1. 删除一个
      • 5.5.2. 批量删除
  • 6. 参数传递
    • 6.1. 单个参数
    • 6.2. 多个参数
  • 7. 注解完成增删改查

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

前言

跟着B站学:黑马mybatis教程全套视频教程,2天Mybatis框架从入门到精通

什么是 MyBatis

简介

MyBatis 是一种开源的持久层框架,它简化了数据库交互的过程,使得与数据库的交互更加灵活和高效。MyBatis 通过将 SQL 语句与 Java 代码进行分离,提供了一种直观的、面向对象的数据库访问方式。

核心特性

  1. 简化数据库访问:MyBatis 使用简单的 XML 或注解配置,将 SQL 语句和 Java 对象映射关系定义在配置文件中,从而实现了数据操作的解耦。

  2. 灵活的 SQL 编写:MyBatis 支持使用原生的 SQL 语句,可以根据需求编写复杂的查询语句,同时也提供了动态 SQL 的功能,使得在运行时动态生成 SQL 语句成为可能。

  3. 对象关系映射(ORM):通过配置文件或注解,MyBatis 能够将数据库中的记录映射到 Java 对象上,实现了对象和数据库表之间的简单映射,减少了手动处理数据转换的工作。

  4. 缓存机制:MyBatis 提供了一级缓存和二级缓存的支持,可以提高查询性能,避免不必要的数据库交互。

  5. 插件机制:MyBatis 允许用户编写插件,扩展框架的功能,例如自定义拦截器来实现日志记录、性能监控等功能。

使用示例

配置文件

<!-- mybatis-config.xml -->
<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://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

Mapper 接口

// UserMapper.java
public interface UserMapper {
    User getUserById(int id);
    List<User> getAllUsers();
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

SQL 映射文件

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <select id="getUserById" resultType="User" parameterType="int">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="getAllUsers" resultType="User">
        SELECT * FROM users
    </select>

    <insert id="insertUser" parameterType="User">
        INSERT INTO users (id, username, email) VALUES (#{id}, #{username}, #{email})
    </insert>

    <update id="updateUser" parameterType="User">
        UPDATE users SET username=#{username}, email=#{email} WHERE id=#{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        DELETE FROM users WHERE id=#{id}
    </delete>
</mapper>

使用 MyBatis

// 使用 MyBatis 进行数据库操作
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 查询用户
User user = userMapper.getUserById(1);
System.out.println(user);

// 查询所有用户
List<User> userList = userMapper.getAllUsers();
System.out.println(userList);

// 插入用户
User newUser = new User(4, "NewUser", "newuser@example.com");
userMapper.insertUser(newUser);
sqlSession.commit();

// 更新用户
User updatedUser = new User(4, "UpdatedUser", "updateduser@example.com");
userMapper.updateUser(updatedUser);
sqlSession.commit();

// 删除用户
userMapper.deleteUser(4);
sqlSession.commit();

// 关闭会话
sqlSession.close();

以上示例演示了 MyBatis 的基本用法,通过配置文件定义数据源、Mapper 接口定义数据操作,以及 SQL 映射文件将 SQL 语句与 Java 方法进行映射。MyBatis 的灵活性和简洁性使得它成为许多 Java 项目中首选的持久层框架之一。

= = = = = = = = 如果大家对以上的导读很懵怎么办!没关系 往下阅读! = = = = = = = = =

1. MyBatis 介绍

1.1. 什么是MyBatis

  • MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
  • MyBatis 本是 Apache 的一个开源项目 iBatis,2010 年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。2013 年 11 月迁移到 Github
  • 官网:点击前往

1.2. 持久层

  • 负责将数据到保存到数据库的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层

1.3. 框架

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

1.4. JDBC 弊端

在这里插入图片描述

1.5. MyBatis 简化

在这里插入图片描述

注册驱动——写到配置文件中
在这里插入图片描述
SQL硬编码——写到配置文件中
在这里插入图片描述

操作繁琐
在这里插入图片描述

MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作

来看看对持久层框架优化!

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

2. MyBatis 快速入门

2.1. 查询user表中所有数据

  1. 创建user表,添加数据
  2. 创建模块, 导入坐标
  3. 编写MyBatis核心配置文件→替换连接信息解决硬编码问题
  4. 编写SQL映射文件→统一管理sq|语句,解决硬编码问题
  5. 编码
    1. 定义POJO类
    2. 加载核心配置文件,获取SqlSessionFactory 对象
    3. 获取SqlSession对象,执行SQL语句
    4. 释放资源

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

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)创建模块,导入坐标

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模块创建结束

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

<?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>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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


</project>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--    console表示当前日志信息是可以输出到控制台的-->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level]  %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>
    <logger name="com.Carter_x" level="DEBUG" additivity="false">
        <appender-ref ref="Console"/>
    </logger>
</configuration>

从XML中构建SqlSessionFactory
每个基纡MyBatis的应用都是以一个Sq|SessionFactory的实例为核心的。SqlSessionFactory 的实例可以通过Sq|SessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的Configuration实例来构建出SqlISessionFactory实例。

从XML文件中构建SqlSessionFactory的实例非常简单,建议使用类路径下的资源文件进行配置。但也可以使用任意的输入流 (InputStream) 实例,比如用文件路径字符串或fle:// URL构造的输入流。MyBatis 包含一个名叫 Resources的工具类,它包含一实用方法,使得从类路径或其它位置加载资源文件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

3)编写 MyBatis 核心

XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。后面会再探讨 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="123456"/>
            </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="com/itheima/mapper/UserMapper.xml"/>-->

        <!--Mapper代理方式-->
        <package name="com.itheima.mapper"/>
    </mappers>
</configuration>

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

探究已映射的 SQL 语句
现在你可能很想知道 SqlSession 和 Mapper 到底具体执行了些什么操作,但 SQL 语句映射是个相当广泛的话题,可能会占去文档的大部分篇幅。 但为了让你能够了解个大概,这里先给出几个例子。

在上面提到的例子中,一个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现,这使得 MyBatis 在过去的数年间得以流行。如果你用过旧版本的 MyBatis,你应该对这个概念比较熟悉。 但相比于之前的版本,新版本改进了许多 XML 的配置,后面我们会提到这些改进。这里给出一个基于 XML 映射语句的示例,它应该可以满足上个示例中 SqlSession 的调用。

<?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">

<!--
    namespace:名称空间
-->

<mapper namespace="com.itheima.mapper.UserMapper">

    <!--statement-->
    <select id="selectAll" resultType="user">
        select * from tb_user;
    </select>
<!--    <select id="selectById" resultType="user">
        select *
        from tb_user where id = #{id};

    </select>-->


    <select id="select" resultType="user">
        select *
        from tb_user
        where
            username = #{arg0}
        and password = #{param2}
    </select>


</mapper>

5)编码

5-1. 定义 POJO 类

package com.itheima.pojo;


// alt + 鼠标左键 整列编辑
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 + '\'' +
                '}';
    }
}

5-2. 加载核心配置文件,获取 SqlSessionFactory 对象

//1. 获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

在这里插入图片描述

5-3. 获取 SqlSession 对象,执行 SQL 语句

在这里插入图片描述

5-4. 释放资源

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

在这里插入图片描述

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

在这里插入图片描述

  • 产生原因:Idea 和数据库没有建立连接,不识别表信息
  • 解决方式:在 Idea 中配置 MySQL 数据库连接


在这里插入图片描述

在这里插入图片描述

3. Mapper 代理开发

3.1. 目的

在这里插入图片描述

又写si了…

  • 解决原生方式中的硬编码
  • 简化后期执行 SQL

在这里插入图片描述

3.2. 使用 Mapper 代理方式完成入门案例

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

在这里插入图片描述

1.定义与 SQL 映射文件同名的 Mapper 接口,并且将 Mapper 接口和 SQL 映射文件放置在同一目录下

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
不方便管理!!!
要配置文件与代码 分开!那怎么办啊

那我是不是只需要建立相同层级!

——注意:Mapper文件的包容易出错,建包时可写成 " com/itheima/mapper "

在这里插入图片描述
在这里插入图片描述
但是 现在我们显示的还是
在这里插入图片描述
我们把xml文件拖进来

编译!我们发现确实在一起了


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

3.在 Mapper 接口中定义方法,方法名就是 SQL 映射文件中sql语句的 id,并保持参数类型和返回值类型一致

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

4.编码

  • 通过 SqlSession 的 getMapper 方式获取 Mapper 接口的代理对象
  • 调用对应方法完成 sql 的执行
//2. 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//3. 获取Mapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
//4. 执行方法
List<Brand> brands = brandMapper.selectAll();
System.out.println(brands);

包扫描!

在这里插入图片描述

在这里插入图片描述

4. MyBatis 核心配置文件

配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)
        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)
  • 官网:点击前往

注意:配置各个标签,需要遵循前后顺序

4.1. 类型别名(typeAliasess)

<typeAliases>
	<package name="com.itheima.pojo"/>
</typeAliases>

在这里插入图片描述
相当于 给POJO下的实体类起了个别名 默认的情况下 就是 类本身的名不区分大小写 且不用带包
在这里插入图片描述

在这里插入图片描述
细节:配置各个标签时,需要遵守前后顺序

在这里插入图片描述

4.2. 数据库配置连接环境信息

在这里插入图片描述

在这里插入图片描述

5. 配置文件完成增删改查

在这里插入图片描述

在这里插入图片描述

5.1. 准备环境

  • 数据库表tb brand
  • 实体类Brand
  • 测试用例
  • 安装MyBatisX插件

5.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;

5.1.2. 实体类 Brand

package com.itheima.pojo;

/**
 * 品牌
 *
 * alt + 鼠标左键:整列编辑
 *
 * 在实体类中,基本数据类型建议使用其对应的包装类型
 */

public class Brand {
    // id 主键
    private Integer id;
    // 品牌名称
    private String brandName;
    // 企业名称
    private String companyName;
    // 排序字段
    private Integer ordered;
    // 描述信息
    private String description;
    // 状态:0:禁用  1:启用
    private Integer status;


    public Integer getId() {
        return id;
    }

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

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getCompanyName() {
        return companyName;
    }

    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }

    public Integer getOrdered() {
        return ordered;
    }

    public void setOrdered(Integer ordered) {
        this.ordered = ordered;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    @Override
    public String toString() {
        return "Brand{" +
                "id=" + id +
                ", brandName='" + brandName + '\'' +
                ", companyName='" + companyName + '\'' +
                ", ordered=" + ordered +
                ", description='" + description + '\'' +
                ", status=" + status +
                '}';
    }
}

当前的层级关系
在这里插入图片描述

5.1.3. 测试用例

在这里插入图片描述

5.1.4. 安装MyBatiisX 插件

  • MybatisX是一款基于IDEA的快速开发插件,为效率而生。
  • 主要功能:
    • XML和接口方法相互跳转.
    • 根据接口方法生成 statement
  • 安装:

在这里插入图片描述

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

MyBatis 本身是一个用于在 Java 中进行持久性数据访问的开源框架。如果 “MyBatiisX” 是 MyBatis 的插件,那么安装它可能会带来一些好处,具体取决于该插件提供的功能。

一般来说,MyBatis 插件可以提供以下一些好处:

  1. 增强功能: 插件可以扩展或增强 MyBatis 的功能,为开发人员提供更多的选项和工具来简化开发过程。

  2. 性能优化: 一些插件可能专注于提高 MyBatis 的性能,通过优化查询或缓存策略,以提高应用程序的响应速度。

  3. 简化配置: 插件可能提供一些简化配置的功能,使得在使用 MyBatis 的过程中更加方便。

  4. 集成其他技术: 插件可以用于集成其他技术或框架,使得 MyBatis 能够更好地与其他组件协同工作。

  5. 代码生成: 一些插件可能提供代码生成的功能,可以减少手动编写重复性代码的工作。

请注意,具体的好处取决于插件的具体功能和你的项目需求。在考虑安装任何插件之前,建议查看插件的文档,了解它提供了什么功能以及它是否适合你的项目。此外,插件的稳定性、维护情况以及社区支持也是考虑的因素之一。

在这里插入图片描述

5.2. 查询

5.2.1. 查询所有数据

在这里插入图片描述

  1. 编写接口方法: Mapper接口

    • 参数:无
    • 结果: List< Brand>
    • List<Brand> selectAll();
  2. 编写SQL语句: SQL映射文件

<select id="selectAll" resultType="brand">
	select * from tb_ brand;
</select>
  1. 执行方法,测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

怎么办!!!!!!!

属性名与列名不一致

1)起别名:在 SQL 语句中,对不一样的类名起别名,别名与实体类属性名一样。可以定义 < 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>

2)resultMap:定义了 < resultMap> 完成不一致的属性名和列名的映射。

<!--
    id:唯一标识
    type:映射的类型,支持别名
-->

<resultMap id="brandResultMap" type="brand">
    <!--
        id:完成主键字段的映射
            column:表的列名
            property:实体类的属性名
        result:完成一般字段的映射
            column:表的列名
            property:实体类的属性名
    -->
    <result column="brand_name" property="brandName"/>
    <result column="company_name" property="companyName"/>
</resultMap>



<select id="selectAll" resultMap="brandResultMap">
    select *
    from tb_brand;
</select>

在这里插入图片描述

5.2.2. 查看详情

  1. 编写接口方法: Mapper接口
    • 参数: id
    • 结果: Brand
    • Brand selectByld(int id);
  2. 编写SQL语句: SQL 映射文件
<select id="selectByld" parameterType="int" resultType="brand">
	select * from tb_ brand where id = #{id};
</select>
  1. 执行方法,测试

在这里插入图片描述

使用细节

  1. 参数占位符:

    • 1) #{}: 执行SQL时,会将#{}占位符替换为?,将来自动设置参数值
      1. ${}: 拼sQL。会存在SQL注入问题
      1. 使用时机:
      • 参数传递,都使用#{}
      • 如果要对表名、列名不固定 ,进行动态设置,只能使用${}进行sq|拼接。
  2. parameterType:

    • 用于设置参数类型,该参数可以省略
    • 在这里插入图片描述
  3. SQL语句中特殊字符处理:

    • 转义字符&lt
    • <![CDATA[内容]]>: `CD提示`
    • 在这里插入图片描述

在这里插入图片描述

5.2.3. 条件查询

1.多条件查询
  1. 编写接口方法: Mapper接口
    • 参数:所有查询条件
    • 结果: List < Brand>
List<Brand> selectByCondition(@Param("status')int status, @Param("companyName") String companyName, @Param("brandName") String brandName);
List<Brand> selectByCondition(Brand brand);
List<Brand> selectByCondition(Map map);
  1. 编写SQL语句: SQL映射文件
  2. 执行方法,测试
<select id="selectByCondition" resultMap="brandResultMap">
	select *
	from tb brand
	where
		status = #{status}
		and company_ name like #{companyName}
		and brand_ name like #{brandName}
</select>

在这里插入图片描述

SQL 语句设置多个参数的三种方式

1)散装参数:需要使用 @Param (" SQL 中的参数占位符名称")

List<Brand> selectByCondition(@Param("status") int status, @Param("companyName") String companyName, @Param("brandName") String brandName);

2)实体类封装参数:只需要保证 SQL 中的参数名和实体类属性名对应上,即可设置成功

List<Brand> selectByCondition(Brand brand);

3)map 集合:只需要保证 SQL 中的参数名和 map 集合的键的名称对应上,即可设置成功

List<Brand> selectByConditionSingle(Brand brand);

测试代码:
MyBatisTest

@Test
    public void testSelectByCondition() 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);*/

        Map map = new HashMap();
        // map.put("status" , status);
        map.put("companyName", companyName);
        // map.put("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. 执行方法

        //List<Brand> brands = brandMapper.selectByCondition(status, companyName, brandName);
//        List<Brand> brands = brandMapper.selectByCondition(brand);
        List<Brand> brands = brandMapper.selectByCondition(map);
        System.out.println(brands);

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

    }

在这里插入图片描述

2.多条件-动态条件查询

在这里插入图片描述
动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach
<!--
        动态条件查询
            * if: 条件判断
                * test:逻辑表达式
            * 问题:
                * 恒等式  where 1 = 1
                * <where> 替换 where 关键字
    -->
    <select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        /* where 1 = 1*/
        <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>

where 就是我们之前说的到的 可以灵活的去掉and

在这里插入图片描述

3.单条件-动态条件查询

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

5.3. 添加

在这里插入图片描述

在这里插入图片描述

5.3.1. 主键返回

在这里插入图片描述

返回添加主键返回

<insert useGeneratedKeys="true" keyProperty="id">
<insert id="addOrderltem" >
	insert into tb_ order_item (goods_name, goods_price, count,order_id)
	values (#{goodsName} #{goodsPrice},#{count}, #{orderld});
</insert>

生成了 但是没有绑定到对象上面!

<insert id="addOrder" useGeneratedKeys="true" keyProperty="id">
	insert into tb_order (payment, payment_type, status)I
	values (#{payment},#{paymentType},#{status});
</insert>

在这里插入图片描述

5.4. 修改

5.4.1. 修改全部字段

在这里插入图片描述

  1. 编写接口方法: Mapper接口

    • 参数:所有数据
    • 结果: void
    • void update(Brand brand);
  2. 编写SQL语句: SQL映射文件

  3. 执行方法,测试

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

在这里插入图片描述

5.4.2. 修改动态字段

在这里插入图片描述

  1. 编写接口方法: Mapper接口
    • 参数:部分数据,封装到对象中
    • 结果: void
  2. 编写SQL语句: SQL映射文件
  3. 执行方法,测试
<update id="update">
	update tb_user
	set
		username = #{username},
		password = #{password},
		gender = #{gender},
		addr = #{addr}
	where
		id = #{id}
</update>

不能用到通用性,因为只能全改 否则就是赋值成null了
到👇

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

在这里插入图片描述

5.5. 删除

5.5.1. 删除一个

  1. 编写接口方法: Mapper接口

    • 参数: id
    • 结果: void
    • void deleteByld(int id);
  2. 编写SQL语句: SQL映射文件

  3. 执行方法,测试

<delete id="deleteByld">
	delete from tb_brand where id = #{id}
</delete>

5.5.2. 批量删除

在这里插入图片描述

  1. 编写接口方法: Mapper接口
    • 参数: id数组
    • 结果: void
    • void deleteBylds(@Param("ids") int[] ids);
  2. 编写SQL语句: SQL映射文件
  3. 执行方法,测试
<delete id="deleteBylds">
	delete from tb_brand
	where id in (?,?,?)
</delete>

不知道用几个问号啊!
所以要动态!!!!

<!--
        mybatis会将数组参数,封装为一个Map集合。
            * 默认:array = 数组
            * 使用@Param注解改变map集合的默认key的名称
    -->

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

在这里插入图片描述

6. 参数传递

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

建议:将来都使用 @Param 注解来修改 Map 集合中默认的键名,并使用修改后的名称获取值,这样可读性更高

6.1. 单个参数

  • POJO类型:直接使用,属性名 和 参数占位符名称一致
  • Map集合:直接使用,键名 和 参数占位符名称一致
  • Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",collection集合);
map.put("collection",collection集合);

List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",list集合);
map.put("collection",list集合);
map.put("list",list集合);

Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",数组);
map.put("array",数组);

其他类型:直接使用

在这里插入图片描述

6.2. 多个参数

多封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名

map.put("arg0",参数值1)
        map.put("param1",参数值1)
        map.put("param2",参数值2)
        map.put("agr1",参数值2)
        ---------------@Param("username")
        map.put("username",参数值1)
        map.put("param1",参数值1)
        map.put("param2",参数值2)
        map.put("agr1",参数值2)

在这里插入图片描述

7. 注解完成增删改查

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

写了注解 就不需要写xml的配置文件了

@Select("select * from tb_user where id = #{id}")
public User selectByld(int id);
  • 查询: @Select
  • 添加: @Insert
  • 修改: @Update
  • 删除:@Delete

提示:

  • 注解完成简单功能
  • 配置文件完成复杂功能 ;

使用注解来映射简单语句会使代码显得更加简洁但对于稍微复杂一点的语句, Java 注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此, 如果你需要做一些很复杂的操作, 最好用XML来映射语句。

选择何种方式来配置映射,以及认为是否应该要统映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式, 你可以很轻松的在基于注解和XML的语句映射方式间自由移植和切换。

在这里插入图片描述

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

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

相关文章

有成效的工作

从开始上班起&#xff0c;听到过工作是做不完得。 大概的意思&#xff0c;现在的工作做完了&#xff0c;就会分配新的工作。所以总也做不完。 如果是做不完的&#xff0c;那么是不是在一个岗位上就一直干着呢。既然这个很难成立。那其实工作是可以干得完的。 一个岗位的终结&am…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…

矩阵运算_矩阵的协方差矩阵/两个矩阵的协方差矩阵_求解详细步骤示例

1. 协方差矩阵定义 在统计学中&#xff0c;方差是用来度量单个随机变量的离散程度&#xff0c;而协方差则一般用来刻画两个随机变量的相似程度。 参考&#xff1a; 带你了解什么是Covariance Matrix协方差矩阵 - 知乎 2. 协方差矩阵计算过程 将输入数据A进行中心化处理得到A…

马斯克的SpaceX星舰又炸了!发射不久后失联自毁

就在几小时前&#xff0c;马斯克旗下SpaceX 发射了有史以来最强大的星舰&#xff0c;但在发射后不久发生爆炸。 在这次发射尝试中&#xff0c;星舰一二级成功进行了分离&#xff0c;但二级助推器和星舰都发生了快速意料之外的解体。在发射半小时后&#xff0c;SpaceX 宣布二级自…

7个最佳开源免费库存/仓库管理系统(WMS)

库存/仓库管理软件是一种用于帮助企业管理库存、仓储位置和交付过程的软件系统。这种类型的软件对于拥有大量库存和多个仓库的企业非常有用。 库存/仓库管理软件的作用包括以下几个方面&#xff1a; &#xff08;1&#xff09;减少库存节约成本 通过跟踪库存水平和存储位置&…

从零开始:Rust环境搭建指南

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起探讨如何从零开始搭建Rust开发环境。 Rust环境搭建概览 Rust是一种系统编程语言&#xff0c;以其安全性、并发性和性能闻名。搭建Rust环境是学习和使用这一语言的第一步。 第一步&#xff1a;安装Rust Rust的…

二维码智慧门牌管理系统升级解决方案:查询功能大提升,让地址查找变得轻松便捷!

文章目录 前言一、支持地址名称、小区等信息进行模糊查询二、支持地图上绘制多边形、圆形、矩形进行范围查询三、高效的数据处理能力&#xff0c;保证查询速度四、灵活的应用场景&#xff0c;满足多种需求 前言 随着科技的快速发展和城市化的加速推进&#xff0c;传统的门牌管…

六.Linux远程登录

1.说明&#xff1a;公司开发的时候&#xff0c;具体的应用场景是这样的 1.linux服务器是开发小组共享 2.正式上线的项目是运行在公网 3.因此程序员需要远程登录到Linux进行项目管理或者开发 4.画出简单的网络拓扑示意图(帮助理解) 5.远程登录客户端有Xshell6、Xftp6&#xff0…

MyISAM和innoDB两种引擎的对比

innoDB 3.23就有了innoDB引擎&#xff0c;5.5成为了默认引擎&#xff0c;支持外键 是一种事务型引擎&#xff0c;可以保证完整提交和回滚 更新、删除比较多的场景&#xff0c;推荐使用innoDB 不过innoDB对内存要求高&#xff0c;因为索引和数据存到一个表了&#xff1b;写操作…

7.22 SpringBoot项目实战【收藏 和 取消收藏】

文章目录 前言一、编写控制器二、编写服务层三、Postman测试最后前言 本系统还支持 收藏图书,就是对心仪的书加一下收藏,大家都懂,这是一个很常见的功能。 那么我们来看看怎么来做,先分析一下:【一个人】对【一本书】只需【收藏一次】,但可以【收藏N本】不同的书,收藏…

数据结构之链表练习与习题详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.习题解…

【LeetCode刷题-树】--654.最大二叉树

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 1.创建一个根节点&#xff0c;其值为 nums 中的最大值。 2.递归地在最大值 左边 的 子数组前缀上 构建左子树。 3.递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回…

庖丁解牛:NIO核心概念与机制详解 03 _ 缓冲区分配、包装和分片

文章目录 Pre概述缓冲区分配和包装 &#xff08;allocate 、 wrap&#xff09;缓冲区分片 (slice)缓冲区份片和数据共享只读缓冲区 &#xff08;asReadOnlyBuffer&#xff09;直接和间接缓冲区内存映射文件 I/O将文件映射到内存 Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解…

开源供应链管理系统 S2B2B2C系统方案及源码输出

这个开源供应链管理系统提供针对企业供应链管理需求的开放源代码解决方案。通过开源供应链管理系统&#xff0c;企业能够实现对供应商、进销存和物流配送等方面的全面管理和优化&#xff0c;涵盖了从供应商选择到门店到消费者服务交付的整个流程。开源系统使企业能够根据自身需…

ssm+vue的高校疫情防控管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的高校疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

Network(四)NAT实现方式与VRRP概述

一 NAT 1 NAT概述 &#xff08;1&#xff09;NAT的作用 Network Address Translation&#xff0c;网络地址转换 通过将内部网络的私有IP地址转换成全球唯一的公网IP地址使内部网络可以连接到互联网。 &#xff08;2&#xff09;私有IP地址分类 A类10.0.0.0~10.255.255.…

【LeetCode刷题-树】--998.最大二叉树II

998.最大二叉树II /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

8.1 Windows驱动开发:内核文件读写系列函数

在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可&#xff0c;而如果在内核中读写文件则应用层的API显然是无法被使用的&#xff0c;内核层需要使用内核专有API&#xff0c;某些应用层下的API只需要增加Zw开头即可在内核中使用&#xff0c;例如本章要讲解…

CICD 持续集成与持续交付——gitlab

部署 虚拟机最小需求&#xff1a;4G内存 4核cpu 下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 安装依赖性 [rootcicd1 ~]# yum install -y curl policycoreutils-python openssh-server perl[rootcicd1 ~]# yum install -y gitlab-ce-15.9.3-ce.0…

图像倾斜角度求取-Radon变换

Radon算法 Radon&#xff08;拉东&#xff09;算法是一种通过定方向投影叠加&#xff0c;找到最大投影值时角度&#xff0c;从而确定图像倾斜角度的算法。具体过程如图所示 图1 Radon变换算法 Radon计算示例 对于纹理方向明显的图像&#xff0c;如图2所示&#xff0c;可以通…