简单了解MyBatis

news2024/11/26 19:25:58

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>

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

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

相关文章

AI写论文:如何结合AI工具和传统教学方法?

Sora——这个让人在24年初引爆AI圈的新产品&#xff0c;它究竟会如何改变我们的教育领域呢&#xff1f; 从gpt到Sora&#xff0c;从对话型的ai到游戏和短剧制作的新风口&#xff0c;我们从23年到24年一个接一个地被震惊&#xff01; Sora能够根据文本提示生成高质量的视频内容…

Java实现自动定时任务配置并判断当天是否需要执行示例

最近接到一个需求&#xff0c;用户要能配置一个定时循环的任务&#xff0c;就是和手机闹钟循环差不多&#xff0c;设置好比如周一、周二、周三&#xff0c;那么在这几天内这个任务就需要自动执行 需求不复杂&#xff0c;首先我需要判断当前是周几&#xff0c;当然用户说了让我…

北航数据结构与程序设计图部分选填题

一、 抓两个关键信息&#xff1a;无向图&#xff0c;邻接表。无向图中&#xff0c;边&#xff08;vi&#xff0c;vj&#xff09;要在vi的链表中记录一次&#xff0c;再以&#xff08;vj&#xff0c;vi&#xff09;的形式在vj的链表中记录一次。 每个边都要记录两次&#xff0c…

大创项目推荐 酒店评价的情感倾向分析

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 酒店评价的情感倾向分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/post…

qemu 安装ubuntu22.04虚拟机 -纯命令行-可ssh-带网络-编译安装 linux kernel-编译安装 kernel module

1&#xff0c;预备系统盘数据 1.1 下载光盘 注意需要 liver-server $ wget https://releases.ubuntu.com/22.04.4/ubuntu-22.04.4-live-server-amd64.iso 1.2 挂载并拷贝 $ sudo mkdir /mnt/iso_ubuntu-22.04.4-live-server-amd64 $ sudo mount ubuntu-22.04.4-live-ser…

采用java+B/S架构开发的工业级UWB(Ultra-Wideband)室内定系统源码UWB定位系统技术接口及技术特点

采用javaB/S架构开发的工业级UWB&#xff08;Ultra-Wideband&#xff09;室内定系统源码UWB定位系统技术接口及技术特点 UWB&#xff08;Ultra-Wideband&#xff09;定位技术本身并不直接连接蓝牙或其他无线通信技术进行定位。然而&#xff0c;在实际应用中&#xff0c;UWB定位…

RecyclerVIew->加速再减速的RecyclerVIew平滑对齐工具类SnapHelper

XML文件 ItemView的XML文件R.layout.shape_item_view <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"100dp"android:layout_heig…

Ubuntu 安装 CloudCompare

步骤&#xff1a; sudo apt install flatpakflatpak install flathub org.cloudcompare.CloudCompare此时会有报错&#xff1a; error: No remote refs found similar to ‘flathub’执行 flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.fla…

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题

【大模型驯化-gradio】成功解决gradio出现httpcore.ReadTimeout: timed out问题 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取…

LeetCode刷题之HOT100之LRU缓存

2024/6/21 酷暑难耐&#xff0c;离开空调我将不知道能否《活着》&#xff0c;昨天跑步感觉全身的热无法排出去&#xff0c;出门那种热浪一阵一阵打过来&#xff0c;一点风都舍不得给我。早早的来到实验室&#xff0c;也没多早&#xff0c;九点哈哈&#xff0c;做题啦&#xff0…

Linux【实操篇-文件目录类命令】

05【实操篇-文件目录类命令】 1.pwd 显示当前工作目录的绝对路径 pwd:print working directory 打印工作目录 到现在为止&#xff0c;我们还不知道自己在系统的什么地方。在浏览器上&#xff0c;我们能够通过导航栏上的url&#xff0c;了解到自己在互联网上的具体坐标。相似的…

GNSS是什么意思?探索全球导航卫星系统的应用与发展

GNSS是什么意思&#xff1f;GNSS是全球导航卫星系统&#xff08;Global Navigation Satellite System&#xff09;的缩写&#xff0c;它借助于多颗位于地球轨道上的卫星&#xff0c;通过接收和处理卫星信号来实现高精度的全球定位和导航。GNSS系统不仅包括美国的GPS&#xff08…

C# 语言在AGI 赛道上能做什么

自从2022年11月OpenAI正式对外发布ChatGPT依赖&#xff0c;AGI 这条赛道上就挤满了重量级的选手&#xff0c;各大头部公司纷纷下场布局。原本就在机器学习、深度学习领域占据No.1的Python语言更是继续稳固了自己AI一哥的位置。凭借着Microsoft 和 OpenAI 长期以来一直是紧密相连…

CVPR 2024 以物体为中心的多感知具身大语言模型

CVPR 2024发表了关于多感知以对象为中心的具身大型语言模型&#xff08;MultiPLY&#xff09;的研究论文&#xff0c;该模型在3D环境中进行编码和交互。 提出MultiPLY是一个多感知的具身大型语言模型&#xff08;LLM&#xff09;&#xff0c;能够将视觉、听觉、触觉和温度等多…

【netty】三万字详解!JAVA高性能通信框架,关于netty,看这一篇就够了

目录 1.概述 2.hello world 3.EventLoop 4.channel 4.1.同步 4.2.异步 4.3.调试 4.4.关闭 4.5.为什么要用异步 5.future 6.promise 7.pipeline 8.byteBuf 8.1.创建 8.2.内存模式和池化 8.2.1.内存模式 8.2.2.池化 8.3.组成 8.4.操作 8.4.1.读写 8.4.2.释放…

钢琴块小游戏(附源码)

代码结构 app.png是游戏运行主界面的图片&#xff08;可以加载自己喜欢的主界面图片&#xff09; Assets文件夹里面装的是一些需要用到的游戏图片 全部都可以替换为自己喜欢的图片 Fonts里面装的是 Sounds文件夹里面装的是 一 . 主程序代码 1.运行这个代码使得游戏开始 2.主界面…

深入理解Vue3.js响应式系统设计之调度执行

如果您觉得这篇文章有帮助的话&#xff01;给个点赞和评论支持下吧&#xff0c;感谢~ 作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…

Linux 一键部署 Nginx1.26.1 + ModSecurity3

前言 ModSecurity 是 Apache 基金会的一个开源、高性能的 Web 应用程序防火墙(WAF),它提供了强大的安全规则引擎,用于检测和阻止各种攻击行为,如 SQL 注入、XSS 跨站点脚本攻击等。而 nginx 是一个高性能的 Web 服务器,常用于处理大量的并发请求,具有很高的负载均衡能力…

知网期刊《新课程导学》投稿要求及收稿方向

知网期刊《新课程导学》投稿要求及收稿方向 知网期刊《新课程导学》作为一份专注于教育领域的学术期刊&#xff0c;一直以来都致力于为广大学术研究者提供一个高质量、高水平的学术交流平台。为了保证期刊的学术质量&#xff0c;编辑部对投稿要求和收稿方向有着严格的规定。 首…

Postman接口测试详解与进阶

Postman是一个功能强大的接口测试工具&#xff0c;它主要用于模拟用户发起的各类HTTP请求&#xff0c;从而验证响应中的结果数据是否和预期值相匹配。以下是关于Postman的详细介绍&#xff1a; Postman是一个功能全面、使用便捷、支持多种HTTP请求类型、提供丰富的测试数据和配…