MyBatis:配置文件增删改查_查询

发布于:2025-07-23 ⋅ 阅读:(15) ⋅ 点赞:(0)

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;

在这里插入图片描述

创建Brand实体类

package com.tsg.pojo;

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 +
                '}';
    }
}

测试用例

在这里插入图片描述

安装MyBatisX插件

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

实现

创建BrandMapper接口

package com.tsg.mapper;

import com.tsg.pojo.Brand;

import java.util.List;

public interface BrandMapper {
    List<Brand> selectAll();
}

编写sql语句:sql映射文件

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



<mapper namespace="com.tsg.mapper.BrandMapper">


    <select id="selectAll" resultType="com.tsg.pojo.Brand">
        select * from tb_brand;
    </select>


</mapper>

在这里插入图片描述

更改mybatis-config.xml文件

在这里插入图片描述

执行测试代码

package com.tsg.test;

import com.tsg.mapper.BrandMapper;
import com.tsg.pojo.Brand;
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 org.junit.Test;
import java.io.InputStream;
import java.util.List;

public class MybatisTest {

    @Test
    public void testSelectAll() throws Exception{

        // 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


        // 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        
        // 获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands = brandMapper.selectAll();

        System.out.println(brands);
        sqlSession.close();


    }


}

在这里插入图片描述

注意:数据库表的字段名称和实体类的属性名称不一样,则不能自动封装数据

解决:

  1. 起别名
    <select id="selectAll" resultType="com.tsg.pojo.Brand">
        select id,brand_name as brandName,company_name as companyName,ordered,description,status
        from tb_brand;
    </select>

在这里插入图片描述
执行代码

在这里插入图片描述

  1. 使用resultMap
<?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">



<mapper namespace="com.tsg.mapper.BrandMapper">


    <resultMap id="brandResultMap" type="com.tsg.pojo.Brand">
        <result column="brand_name" property="brandName" />
        <result column="company_name" property="companyName" />
    </resultMap>

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


</mapper>

在这里插入图片描述

2 查看详情

  1. 编写接口方法:Mapper接口
    参数是id
    结果是Brand

在这里插入图片描述

  1. 编写sql语句:sql映射文件
    <select id="selectById" resultMap="brandResultMap">
        select * from tb_brand where id = #{id};
    </select>

在这里插入图片描述
这里的#{id}也可以写成${id}

使用#的时候
在这里插入图片描述
使用$的时候

在这里插入图片描述
$存在sql注入问题

还有一个问题,特殊字符的处理

在这里插入图片描述
由于业务场景需要这里的=号可能会改成<,此时需要使用转义字符或者CDATA

<的转义字符是&lt;
在这里插入图片描述
或者将<写到CDATA区中

输入大写的CD,会提示,直接回车就可以
在这里插入图片描述
在这里插入图片描述

  1. 执行方法,测试
  @Test
    public void testSelectById() throws Exception{

        // 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);


        // 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        Brand brands = brandMapper.selectById(1);

        System.out.println(brands);
        sqlSession.close();


    }

在这里插入图片描述

3 条件查询

参数接收:

  1. 散装参数
    如果方法中有多个参数,需要使用@Param(“SQL参数占位符名称”)

  2. 对象参数
    对象的属性名称要和参数占位符名称一致

  3. map集合参数

3.1 多条件查询

散装参数实现

package com.tsg.mapper;

import com.tsg.pojo.Brand;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface BrandMapper {
    List<Brand> selectAll();

    Brand selectById(int id);

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


}

在这里插入图片描述

  </select>
    <select id="selectByCondition" resultMap="brandResultMap">

        select *
        from tb_brand
        where status = #{status}
            and company_name like #{companyName}
            and brand_name like #{brandName}
    </select>

在这里插入图片描述

编写测试代码测试

    @Test
    public void testSelectByCondition() throws Exception{

        // 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        
        // 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands = brandMapper.selectByCondition(1, "%华为%", "%华为%");
        
        System.out.println(brands);
        sqlSession.close();
        
    }

在这里插入图片描述

在这里插入图片描述

对象参数实现

    List<Brand> selectByCondition(Brand brand);

在这里插入图片描述
sql语句不用修改
编写测试方法

    @Test
    public void testSelectByCondition() throws Exception{

        int status = 1;
        String brandName = "%华为%";
        String companyName = "%华为%";

        Brand brand = new Brand();
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setStatus(status);

        // 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands = brandMapper.selectByCondition(brand);

        System.out.println(brands);
        sqlSession.close();
        
    }

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

map集合参数实现

    List<Brand> selectByCondition(Map map);

在这里插入图片描述
sql语句不用改

编辑测试代码

  @Test
    public void testSelectByCondition() throws Exception{

        int status = 1;
        String brandName = "%华为%";
        String companyName = "%华为%";

        Map map = new HashMap();

        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);

        // 加载mybatis的核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 获取SqlSession对象,用它来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 获取UserMapper接口的代理对象
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        List<Brand> brands = brandMapper.selectByCondition(map);

        System.out.println(brands);
        sqlSession.close();

    }

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

3.2 动态条件查询

3.2.1 多条件的动态条件查询

sql语句会随着用户的输入或外部条件的变化而变化,我们称为动态sql

   <!--
    动态条件查询
    -->

    <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="brand_name != null and brandName != '' ">
            and brand_name like #{brandName}
        </if>


    </select>

在这里插入图片描述
测试:

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

存在的问题
status不存在的时候就会报错

在这里插入图片描述

解决:

  1. 恒等式

在这里插入图片描述

  1. 使用<where>这个标签来替换where关键字
    在这里插入图片描述

3.2.2 单条件的动态条件查询

从多个条件中选择一个
choose(when,otherwise):选择,类似于Java中的switch语句

接口文件:

    List<Brand> selectByConditionSingle(Brand brand);

sql映射文件:

 <select id="selectByConditionSingle" resultMap="brandResultMap">

        select *
        from tb_brand
        where
        <choose>
            <when test="status != null">
                status = #{status}
            </when>
            <when test="companyName != null and companyName != ''">
                company_name like #{companyName}
            </when>
            <when test="brandName != null and brandName != ''">
                brand_name like #{brandName}
            </when>
        </choose>


    </select>

在这里插入图片描述

测试代码测试:

在这里插入图片描述
在这里插入图片描述
存在一个问题,一个都不选的情况,即传入一个空的brand

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

使用<where>标签

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

或者使用otherwise

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