简单了解MyBatis

MyBatis

1、快速入门

MyBatis中文手册官网MyBatis中文网

1.1、创建数据表添加数据

create table user(
	id int auto_increment primary key comment '主键id',
	name varchar(20) comment '姓名',
	age int comment '年龄',
	gender char(1) comment '性别(1:男, 2:女)',
	phone char(11) comment '手机号'
) comment '用户基本信息表';

insert into user values (null '糖锅', 20, '1', '12011011934'),
						(null '糖解', 19, '2', '12011564514'),
						(null '糖魅', 27, '2', '19631011934'),
						(null '糖仁', 32, '1', '19018451934');

1.2、创建模块,导入坐标

1、新建一个项目,项目名字随意

在这里插入图片描述

2、鼠标右击项目,选择新建模块

在这里插入图片描述

3、设置模块信息

在这里插入图片描述

5、在pom.xml中添加如下配置信息

<dependencies>
        <!--MyBatis的依赖-->
        <dependency>

            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>

        <!--MySQL的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>

        <!--junit 单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!--添加slf4j日志api-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-parent</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>

1.3、编写MyBatis核心配置文件,替换连接信息,解决代码中硬编码问题

1、鼠标右击resources新建File文件,文件名字为mybatis-config.xml

在这里插入图片描述

2、在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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                 <!--数据库信息,根据自己情况配置-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--mybatis为连接的数据库名-->
                <property name="url" value="jdbc:mysql:///test?useSSL=false"/>
                <!--填写数据库用户名-->
                <property name="username" value="root"/>
                <!--填写数据库密码-->
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <!--加载mapper的映射文件-->
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

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

1、鼠标右击resources新建File文件,文件名字为UserMapper.xml

在这里插入图片描述

2、在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">

<!--
    namespace:名称空间
-->
<mapper namespace="test">
    <select id="selectAll" resultType="com.tg.pojo.User">
        select * from user;
    </select>
</mapper>

1.5、日志文件配置(看个人情况)

这里我简单配置一个日志文件

1、鼠标右击resources新建File文件,文件名字为logback.xml

2、根据自己情况配置自己的日志文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <target>System.out</target>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
                %msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>
        </encoder>
    </appender>

    <!-- File是输出的方向通向文件的 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--日志输出路径-->
        <file>C:/code/itheima-data.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--

    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
   , 默认debug
    <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
    -->
    <root level="ALL">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>
</configuration>

具体步骤:

1、定义POJO类

鼠标右击java,创建包com.tg.pojo,在包下创建类User

在这里插入图片描述

public class User {
    private int id;
    private String name;
    private int age;
    private int gender;
    private String phone;

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getGender() {
        return gender;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", phone='" + phone + '\'' +
                '}';
    }
}

java中创建类MyBatisTest1类进行如下操作

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

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

  • 释放资源

/**
 * MyBatis测试类
 */
public class MyBatisTest1 {
    public static void main(String[] args) throws IOException {
        //加载MyBatis核心配置文件,获取SqlSessionFactory对象
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);					   

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

        //执行Sql语句
        List<Object> users = sqlSession.selectList("test.selectAll");

        System.out.println(users);

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

2、Mapper代理开发

2.1、目的

解决原生方式中的硬编码问题

简化后期SQL

2.2、具体步骤

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

  • 鼠标右击java,创建包com.tg.mapper,在包中创建接口UserMapper

  • 鼠标右击resources,创建文件夹com/tg/mapper,将UserMapper.xml转移到该文件夹中

在这里插入图片描述

  • 修改UserMapper.xml中的namespace=“com.tg.mapper.UserMapper”

在这里插入图片描述

  • 修改mabatis-config.xml中的mapper映射为resource=“com/tg/mapper/UserMapper.xml”

在这里插入图片描述

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

public interface UserMapper {
    List<User> selectAll();
}

4、编码

在java中创建类MyBatisTest2

  • 通过SqlSession对象的gerMapper方法获取Mapper接口的代理对象

  • 调用对应的方法完成Sql的执行

如果Mapper接口名称和SQL映射文件名称相同,并在统一目录下,则可以使用包扫描的方式简化SQL映射文件加载

上述红色信息意思就是,可以在mabatis-config.xml使用**< package name=“com.tg.mapper”/>代替< mapper resource=“com/tg/mapper/UserMapper.xml”/>**

在这里插入图片描述

代码示例:

/**
 * MyBatis测试类
 */
public class MyBatisTest2 {
    public static void main(String[] args) throws IOException {
        //加载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 mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectAll();

        System.out.println(users);

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

3、MyBatis核心配置文件详解

3.1、MyBatis核心配置文件的顶层结构

在这里插入图片描述

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

示例,我们在MyBatis的配置文件中添加别名配置

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

在这里插入图片描述

当我们添加此配置之后我们可以在Sql映射文件中简写刚才数据查询的返回值为user或者User

在这里插入图片描述

当然我们还可以配置多个数据源

示例:

<!--环境配置,可根据需要配置多个,通过对应的default属性切换不同的environment-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库信息,根据自己情况配置-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>

4、MyBatis文件完成增删改查

4.1、环境准备

建立数据库表tb_brand
CREATE TABLE tb_brand (
  id int NOT NULL AUTO_INCREMENT COMMENT 'id主键',
  brand_name varchar(20) DEFAULT NULL COMMENT '品牌名称',
  company_name varchar(20) DEFAULT NULL COMMENT '企业名称',
  ordered int DEFAULT NULL COMMENT '排序字段',
  escription varchar(200) DEFAULT NULL COMMENT '描述信息',
  status int DEFAULT NULL COMMENT '状态:0-禁用、1-启用',
  PRIMARY KEY (`id`)
) COMMENT '品牌信息表';

在这里插入图片描述

创建实体类
public class Brand {
    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    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 +
                '}';
    }
}
创建测试类com.tg.test.BrandTest

在这里插入图片描述

安装MyBatisX插件

具体步骤:依次点击File>>Settings>>plugins>>搜索MybatisX>>INSTALL>>重启IDEA就欧克啦

4.2、需要完成的功能

4.2.1、查询
查询所有数据
  • 编写接口方法:Mapper接口

    参数:无

    结果:List< Brand>

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"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--
    namespace:名称空间
-->
<mapper namespace="com.tg.mapper.BrandMapper">

    <select id="selectAll" resultType="brand">
        select *
        from tb_brand;
    </select>
</mapper>
  • 执行测试方法
public class BrandTest {
    @Test
    public void testBrandSelectAll() throws IOException {
        //获取SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //基于SqlSessionFactory对象获取SqlSession对象
        SqlSession ss = ssf.openSession();

        //基于SqlSession对象获取Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        //执行SQL
        List<Brand> list = mapper.selectAll();
        for (Brand brand : list) {
            System.out.println(brand);
        }

        //释放资源
        ss.close();
    }
}

当我们执行完成后会发现一些小问题

在这里插入图片描述

怎么会有null值呢?!

原来是因为我们数据库表的字段名和实体类的属性名不一样造成的,那有什么解决办法吗,🤭嘿嘿,当然是有的:

起别名,重新书写SQL映射文件中的查询语句

select id, brand_name as brandName, company_name as companyName, ordered, description, status
from tb_brand;

或者书写一个sql片段

在这里插入图片描述

不过上述两种方式不是很灵活的感觉,所以我们经常使用的是resultMap来解决此类问题

在这里插入图片描述

其中resultMap标签中的id可以是任意名字,type是返回值类型,resultMap标签中的result标签 column是数据库表中的字段名,property是实体类中的属性名,记得还要把select标签中原来的resultType换成resultMap并且赋值,其值为resultMap标签中的id名。

查看
  • 编写接口方法:Mapper接口

    参数:id

    结果:brand

Brand selectById(int id);
  • 编写SQL语句:SQL映射文件
<!--paramaterType可以省略不写-->
<select id="selectById" parameterType="int" resultMap="brandResultMap">
        select
            *
        from tb_brand
        where id = #{id};
    <!--
		参数占位符
			1、#{}:会被替换成?,防止sql注入
			2、${}:存在注入问题
	-->
</select>

在进行sql语句编写的过程中我们会遇到一些特殊字符比如”<“,这时候我们需要进行特殊字符处理,保证程序能够成功运行。

特殊字符处理:

转义字符:例如小于符号写成&lt

CDATA区:小于符号可以写成

select * 
form table1
where id
<![CDATA[
	<
]]>#{id};
  • 执行方法
public class BrandTest1 {
    @Test
    public void testSelectDescription() throws IOException {
        //创建SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //基于SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession();

        //基于SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        //执行sql
        Brand brand = mapper.selectById(1);
        System.out.println(brand);

        //释放资源
        ss.close();
    }
}
条件查询
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);
  • 编写SQL语句:SQL映射文件
<select id="selectByCondition" resultMap="brandResultMap">
        select *
        from tb_brand
        where
            status = #{status}
        and company_name like #{companyName}
        and brand_name like #{brandName};
</select>
  • 执行方法,测试
public class BrandTest2 {
    @Test
    public void testSelectByCondition() throws IOException {
        //接受参数
        int status = 1;
        String companyName = "华锅";
        String brandName = "华";

        //参数处理
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        //创建Brand对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setBrandName(brandName);
//        brand.setCompanyName(companyName);

        //创建Map集合
        Map map = new HashMap();
        map.put("status", status);
        map.put("companyName", companyName);
        map.put("brandName", brandName);

        //创建SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //根据SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession();

        //根据SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        //查询
        //List<Brand> brands = mapper.selectByCondition(status, companyName, brandName);

        //List<Brand> brands = mapper.selectByCondition(brand);

        List<Brand> brands = mapper.selectByCondition(map);

        for (Brand br : brands) {
            System.out.println(br);
        }

        //释放资源
        ss.close();
    }
}
2、动态条件查询

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

MyBatis对动态SQL有很强大的支撑

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

示例:我们修改上面多条件查询中的SQL映射文件就可以实现动态多条件查询了

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

单条件的动态条件查询:

choose(when, otherwise):选择,类似于java中的switch语言

<select id="selectBySingle" 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>
        </where>
    </select>
4.2.2、添加
  • 编写接口方法:Mapper接口

    参数:除了id以外的所有数据

    结果:void

void insertNOId(Brand brand);
  • 编写SQL语句:SQL映射文件
<insert id="insertNOId">
        insert into tb_brand(brand_name, company_name, ordered, description, status)
        values(#{brandName}, #{companyName}, #{ordered}, #{description}, #{status});
</insert>
  • 执行测试
@Test
    public void testInsertNoId() throws IOException {
        //接受参数
        int status = 1;
        int ordered = 7;
        String companyName = "糖魅集团";
        String brandName = "小魅手机";
        String description = "小魅手机就是牛皮";

        //创建Brand对象
        Brand brand = new Brand();
        brand.setStatus(status);
        brand.setBrandName(brandName);
        brand.setCompanyName(companyName);
        brand.setDescription(description);
        brand.setOrdered(ordered);

        //创建SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //根据SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession(true);//true:自动提交事务

        //根据SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        mapper.insertNOId(brand);
        
        //提交事务:若没有设置opensession方法中的参数为true则需要手动提交事务
        //ss.commit();

        //释放资源
        ss.close();
    }

此时我们如果想要在添加数据的同时获取其id可以完成吗?当我们在mapper.insertNoid(brand)下边紧接着执行System.out.println(brand.getId())时,我们发现运行结果是null。

当我们想要实现主键返回时,我们只需要稍微修改一下我们的SQL映射文件即可:

<insert id="insertNOId" useGeneratedKeys="true" keyProperty="id">

添加上**useGeneratedKeys=“true” keyProperty=“id”**即可。

4.2.3、修改
修改全部字段
  • 编写接口方法:Mapper接口

    参数:所有参数

    结果:int影响的行数

int updateAll(Brand brand);
  • 编写SQL方法:SQL映射文件
<update id="updateAll">
        update tb_brand
        set
            brand_name = #{brandName},
            company_name = #{companyName},
            ordered = #{ordered},
            description = #{description},
            status = #{status}
        where id = #{id};
</update>
  • 执行方法测试
@Test
    public void testUpdateAll() throws IOException {
        //接受参数
        int id = 4;
        int status = 1;
        int ordered = 89;
        String companyName = "糖魅集团";
        String brandName = "小魅手机";
        String description = "小魅手机就是牛皮,哦嚯嚯嚯";

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

        //创建SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //根据SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession(true);

        //根据SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        mapper.updateAll(brand);

        //释放资源
        ss.close();
    }
修改动态字段

只需要修改SQL映射文件即可

<update id="updateAll">
        update tb_brand
        <set>
            <if test="companyName != null and companyName != '' ">
                company_name = #{companyName},
            </if>
            <if test="brandName != null and brandName != '' ">
                brand_name = #{brandName},
            </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>
4.2.4、删除
删除一个
  • 编写接口方法:Mapper接口

    参数:id

    返回值:void

void delById(int id);
  • 编写SQL语句:SQL映射文件
<delete id="delById">
        delete
        from tb_brand
        where id = #{id};
</delete>
  • 执行测试方法
@Test
    public void testDeleteById() throws IOException {
        //接受参数
        int id = 6;

        //创建SqlSessionFactory对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //根据SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession(true);

        //根据SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        mapper.delById(id);

        //释放资源
        ss.close();
    }
批量删除
  • 编写接口方法

    参数:id数组

    返回值:void

/**
     *此时mapper配置文件中
     *<foreach collection="ids" item="id" separator="," open="(" close=")">
     *      #{id}
     * </foreach>
     * collection可以等于ids
     *
     * 若是delByIds(int[] ids)
     * 此时
     * <foreach collection="array" item="id" separator="," open="(" close=")">
     *       #{id}
     * </foreach>
     * collection要写等于array
     */
void delByIds(@Param("ids") int ids);
  • 编写SQL映射文件
<delete id="delByIds">
        delete from tb_brand
        where in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
</delete>
rceAsStream("mybatis-config.xml");
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);

        //根据SqlSessionFactory对象创建SqlSession对象
        SqlSession ss = ssf.openSession(true);

        //根据SqlSession对象创建Mapper代理对象
        BrandMapper mapper = ss.getMapper(BrandMapper.class);

        mapper.delById(id);

        //释放资源
        ss.close();
    }
批量删除
  • 编写接口方法

    参数:id数组

    返回值:void

/**
     *此时mapper配置文件中
     *<foreach collection="ids" item="id" separator="," open="(" close=")">
     *      #{id}
     * </foreach>
     * collection可以等于ids
     *
     * 若是delByIds(int[] ids)
     * 此时
     * <foreach collection="array" item="id" separator="," open="(" close=")">
     *       #{id}
     * </foreach>
     * collection要写等于array
     */
void delByIds(@Param("ids") int ids);
  • 编写SQL映射文件
<delete id="delByIds">
        delete from tb_brand
        where in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
</delete>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么我在 PostgreSQL 中 Commit 很慢?

有时&#xff0c;我们的一位客户会查看数据库中最耗时的语句&#xff08;使用pg_stat_statements或pgBadger&#xff09;&#xff0c;并发现COMMIT排名靠前。通常&#xff0c;COMMIT这是 PostgreSQL 中非常快的语句&#xff0c;因此值得研究。在本文中&#xff0c;我将探讨速度…

四川赤橙宏海商务信息咨询有限公司可信吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一领域的佼佼者&#xff0c;四川赤橙宏海商务信息咨询有限公司凭借其在抖音电商服务领域的深厚积累和卓越表现&#xff0c;成为了引领行业创新发展的重要力量。 四川赤橙宏海商务信息咨询有…

华为设备telnet 远程访问配置实验简述

一、实验需求: 1、AR1模拟电脑telnet 访问AR2路由器。 二、实验步骤&#xff1a; 1、AR1和AR2接口配置IP&#xff0c;实现链路通信。 2、AR2配置AAA模式 配置用户及密码 配置用户访问级别 配置用户telnet 访问服务 AR2配置远程服务数量 配置用户远程访问模式为AAA 配置允许登录…

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具&#xff0c;该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接&#xff08;死链&#xff09;。所谓死链&#xff0c;即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话&#xff0c;…

【2024.6.21】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

[STM32]万年历

[STM32]万年历 需要资料的请在文章末尾获取~ ​​ 01描述 使用原件&#xff1a;stm32f103c8t6最小系统板x1&#xff0c;0.96寸OLED显示屏四角x1&#xff0c;4x4矩阵按键x1; 键位对应图&#xff1a; 1&#xff0c; 2&#xff0c; 3&#xff0c; 4------------- 切换页面 设置…

干货分享|如何将前端代理服务器(BFF)接入身份认证(1)

本篇文章将通过实例来详细讲解如何将前端代理服务器&#xff08;BFF&#xff09;接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。 通过这些实例讲解&#xff0c;你将掌握 BFF 与身份认证的集成技巧&#xff0c;为你的前端应用提供安全可靠的认证机制。…

APP IOS

APP IOS苹果源生应用程序 APP Android-CSDN博客

【Sa-Token|3】Sa-Token集成到现有微服务详细介绍

一、系统架构调整 用户中心&#xff1a;保持现有的用户登录、注册接口不变。多个项目&#xff1a;前后端分离&#xff0c;保持现有逻辑不变。网关服务&#xff1a;新增或配置网关服务&#xff0c;处理所有请求并进行 Token 校验和转发。统一 Token 管理&#xff1a;通过 Sa-Tok…

肇庆具有资质等保机构有几家?在哪里?

在近期揭晓的“中国百强城市排行榜”中&#xff0c;广东省共有12个城市入选&#xff0c;其中包括肇庆。肇庆-山水之城&#xff0c;文化之韵&#xff0c;端砚之乡&#xff0c;岭南瑰宝&#xff0c;是一个非常有发展的城市&#xff0c;企业多多。这不不少肇庆企业在问&#xff0c…

嵌入式PID算法总结

参考 CMSIS-DSP PID 控制 学习历程 最开始&#xff0c;根据公式自己写PID算法&#xff1b;后面找资料时&#xff0c;发现wiki上介绍PID时&#xff0c;提供了伪代码&#xff0c;直接照着翻译一下就可用了&#xff1b;然后想要实现一个自己的PID库&#xff08;能够实现多级PID…

10条提升大模型任务微调效果的tricks

在大型语言模型&#xff08;LLMs&#xff09;的研究和应用中&#xff0c;如何通过微调来适应特定任务是一个关键问题。尽管提示工程&#xff08;PE&#xff09;在提升LLMs的零样本学习和上下文内学习方面取得了显著成效&#xff0c;但关于如何设计有效的微调样本以进一步提升LL…

Elasticsearch中的Term_Filter过滤器技术

文章目录 一、引言二、Term Filter的工作原理与内部机制三、Term Filter的多样化使用场景3.1 精确匹配3.2 过滤分类与标签3.3 数据范围筛选3.4 复杂查询的构建 四、Term Filter的最佳实践与应用建议4.1 避免使用分析器4.2 优化索引映射4.3 充分利用缓存4.4 持续监控性能 五、结…

Redis 7.x 系列【2】单机部署

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. Windows2. Linux 1. Windows Redis作为一个高性能的内存数据库&#xff0c;和Linu…

查询mysql库表的几个语句

1、查询某个数据库的所有表 SELECTtable_name FROMinformation_schema.TABLES WHEREtable_schema database_namedatabase_name替换成你需要查询的数据库名称 2、查询某张表的所有字段名称 SELECTCOLUMN_NAME,column_comment FROMinformation_schema.COLUMNS WHEREtable…

功能测试 之 单模块测试----购物车模块

1.需求分析 &#xff08;1&#xff09;购物车显示 1.若未登录&#xff0c;提示登录&#xff0c;提示文案“购物车内暂时没有商品&#xff0c;登录后将显示您之前加入的商品” 2.若已登录&#xff0c;购物车没有商品&#xff0c;提示去购物。 未登录状态 已登录状态 3.购物车有…

Java图形用户界面设计AWT事件处理

AWT事件处理 前言一、GUI事件处理机制定义使用步骤Swing事件处理机制与AWT的区别 二、GUI中常见事件和事件监听器事件低级事件高级事件 事件监听器AWT事件类的继承关系 三、事件适配器三、示例代码示例示例一示例二 示例三 前言 推荐一个网站给想要了解或者学习人工智能知识的…

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存&#xff0c;但彼此之间交互可以在共享的内存中进行&#xff0c;即堆内存&#xff0c;堆内存会将这些消息放到队列中&#xff0c;具体实现jvm见&#xff0c;栈内存各自维护&#xff0c;堆内存大家共享 进…

华为手机怎么找回删除的照片?掌握3个方法,恢复不是梦

由于误删、设备故障、软件更新等原因&#xff0c;我们有时可能会不慎丢失这些宝贵的照片。当面对空空如也的相册时&#xff0c;那种失落感无法言喻。华为手机该怎么找回删除的照片呢&#xff1f;但是&#xff0c;请不要绝望&#xff01;在科技的帮助下&#xff0c;我们可以采取…

记忆化搜索——AcWing 901. 滑雪

记忆化搜索 定义 记忆化搜索是一种结合了搜索和动态规划思想的方法。它通过将已经计算过的结果存储起来&#xff0c;在后续遇到相同情况时直接返回存储的结果&#xff0c;避免重复计算。 运用情况 当问题可以用递归方式求解&#xff0c;但存在大量重复计算时。一些复杂的组…