[JavaWeb玩耍日记]Mybatis快速入门与增删改查

目录

模块一:快速入门

1.创建数据库,插入数据

2.创建maven模块后,需要导入的依赖有哪些?

3.想要输出查询到的数据(包括日志打印),需要创建哪些文件?

4.如何放置UserMapper接口与User类?

5.如何放置UserMapper.xml配置文件?

6.在UserMapper.xml文件中需要写什么内容?

7.mybatis-config.xml,logback.xml的文件位置在哪里?在mybatis-config.xml中需要配置什么?

8.写测试方法,主要内容为调用mapper接口中的方法,完成对表的查询操作

模块二:增删改查

安装MyBatisX插件点击鸟就能自动跳转

准备数据

按照模块一再次创建工程,主要实验内容模块有:BrandMapper.xml,BrandMapper接口,App实验类。配置pom文件,mybatis-congfig.xml,logback.xml文件可复制粘贴

对于Brand实体类有部分内容需要快速构造,故增添了数个构造方法

0.在mapper.xml配置文件中如何简化增删改查标签中的全类名?

1..查询所有:实体类的属性与表的列名冲突不一样时,mybatis封装数据会出现什么问题?该如何解决?

2.单条件查询:如何根据传入的单个条件查询数据?

3.如何通过注解来给接口传递简单的sql语句(不写mapper.xml文件)?

4.多条件查询的Mapper接口中能够能够传递哪些数据?各有什么特点?多条件查询中,如有为null的数据,该查询将会如何执行?

5.如何实现动态的多条件查询(有查询条件则查询,为0~n个或者0~1个,条件为空就不查询),对于传递的字符串数据应该注意什么?

6.如何实现添加数据?添加数据等需要修改数据库表的内容的操作需要如何提交事务?

7.如何在添加数据之后快速获得该数据自动增长的id?

8..如何实现修改数据?修改数据能自动返回什么消息?

9.传递数据为空的话数据也会修改吗?如何实现动态修改数据?

10.根据id实现批量删除数据可向接口中传递数组,如何实现批量删除?

删除单个:

批量删除:

11.mapper接口中传入的参数不同,对应在mapper.xml文件中引用该参数应该如何描述?


模块一:快速入门

目标:查询USER表中的所有数据(以下内容有部分操作为非必要操作,有其余更多的解决方案,提出的问题仅用于加深记忆)

1.创建数据库,插入数据
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.创建maven模块后,需要导入的依赖有哪些?

1.mybatis

2.mysql-connector-java(用于连接数据库)

3.logback-classic(用于打印日志,mybatis自动适配,不必要)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>

3.想要输出查询到的数据(包括日志打印),需要创建哪些文件?

1.mybatis-config.xml,logback.xml

2.UserMapper.xml

3.UserMapper接口,User类,实验类

4.如何放置UserMapper接口与User类?

分别在pojo包与mapper包中创建pojo类User 与mapper接口UserMapper

mapper接口中需要用到的方法如下(查询所有用户)

public interface UserMapper {
    List<User> selectAll();
}
public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String addr;
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", gender='" + gender + '\'' +
                ", addr='" + 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;
    }
}

5.如何放置UserMapper.xml配置文件?

建立UserMapper.xml文件,放在和接口同名的resources/org/example/mapper目录下

此时可以使用package指令打包项目:可以在mapper包下发现了接口与xml配置文件。

6.在UserMapper.xml文件中需要写什么内容?

这个文件相当于为指定的mapper接口写具体实现,主要内容是写sql语句,还需要指定对应的接口(是哪一个mapper)与返回数据的类型(是哪一个pojo)

<?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">
<!--这个文件相当于为指定的mapper接口写具体实现-->
<!--该标签需要指定namespace属性为对应需要实现的接口的全类名-->
<mapper namespace="org.example.mapper.UserMapper">
    <!--该标签表示查询命令,属性指定返回数据的类型-->
     <select id="selectAll" resultType="org.example.pojo.User">
        select * from tb_user;
    </select>
</mapper>

7.mybatis-config.xml,logback.xml的文件位置在哪里?在mybatis-config.xml中需要配置什么?

文件位置在工程的resource目录下

在mybatis-config.xml的configuration标签中需要配置环境连接数据库与指定mapper.xml的位置。

logback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>[%level] %boldGreen(%logger{15}) - %msg %n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="Console"/>
    </root>
</configuration>

mybatis-config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--连接数据库,可以写多个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:///db1?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:///db1?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--指定mapper.xml配置文件的位置,包扫描-->
    <mappers>
        <package name="org.example.mapper"/>
    </mappers>
</configuration>

 工程详细目录:

8.写测试方法,主要内容为调用mapper接口中的方法,完成对表的查询操作
public class App
{
    public static void main( String[] args ) throws IOException {
        //1.加载mybatis核心配置文件
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        //2.获取sqlsession对象
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //3.获取接口,调用其方法执行sql
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        userMapper.selectAll().forEach(System.out::println);
        //4.释放资源
        sqlSession.close();
    }
}


模块二:增删改查


安装MyBatisX插件点击鸟就能自动跳转

准备数据
drop table if exists tb_brand;
create table tb_brand
(
    id           int primary key auto_increment,
    brand_name   varchar(20),
    company_name varchar(20),
    ordered      int,
    description  varchar(100),
    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;

按照模块一再次创建工程,主要实验内容模块有:BrandMapper.xml,BrandMapper接口,App实验类。配置pom文件,mybatis-congfig.xml,logback.xml文件可复制粘贴

对于Brand实体类有部分内容需要快速构造,故增添了数个构造方法
public class Brand {
    private Integer id;
    private String brandName;
    private String companyName;
    private Integer ordered;
    private String description;
    private Integer status;

    public Brand() {
    }

    public Brand(String brandName, String companyName, Integer status) {
        this.brandName = brandName;
        this.companyName = companyName;
        this.status = status;
    }
    public Brand(String brandName, String companyName, Integer ordered, String description, Integer status) {
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = status;
    }

    public Brand(Integer id, String brandName, String companyName, Integer ordered, String description, Integer status) {
        this.id = id;
        this.brandName = brandName;
        this.companyName = companyName;
        this.ordered = ordered;
        this.description = description;
        this.status = 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 +
                '}';
    }
}

0.在mapper.xml配置文件中如何简化增删改查标签中的全类名?

在mybatis-config.xml中起别名(标签的前后顺序有要求)

<configuration>
    <!--在此处加上该标签可起别名,在mapper.xml文件中type属性可以不使用全类名-->
    <typeAliases>
        <package name="org.example.pojo"/>
    </typeAliases>

    <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:///db1?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="org.example.mapper"/>
    </mappers>
</configuration>

下列案例的代码顺序:mapper.xml-mapper-实验类

1..查询所有:实体类的属性与表的列名冲突不一样时,mybatis封装数据会出现什么问题?该如何解决?
实体类的属性与表的列名冲突不一样时,mybatis不能自动封装数据,导致查询结果某列为null 比如mysql表的列名为brand_name,java类中变量名为brandName

Mapper.xml:

    <!--1.1无法查询完整的数据的写法-->
    <select id="selectAll1" resultType="Brand">
        select * from tb_brand;
    </select>

    <!--
        1.2能够查询完整数据的写法:对sql表与java类中名称不同的属性做映射

        resultMap标签中的属性:
        需要指定id(唯一标识),在后续标签中返回中会用到,代替原本的resultType
        需要指定返回的实体类type(可以使用别名)

        内部的标签:
        需要指定是主键还是其它键
        <id>标签是主键的映射,<result>标签是其他键的映射
        需要指定表的列名与实体类中的属性名
        column是表的列名,property是Java类中的属性名
    -->
    <resultMap id="brandResultMap" type="Brand">
        <id column="id" property="id"/>
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    </resultMap>
    <select id="selectAll2" resultMap="brandResultMap">
        select * from tb_brand;
    </select>

Mapper接口: 

    List<Brand> selectAll1();
    List<Brand> selectAll2();

 实验类:

    @Test
    public void selectAll() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        System.out.println("未做映射的输出:");
        brandMapper.selectAll1().forEach(System.out::println);
        System.out.println("做映射后的输出:");
        brandMapper.selectAll2().forEach(System.out::println);
        sqlSession.close();
    }

2.单条件查询:如何根据传入的单个条件查询数据?
使用#{name}代表接口中传入的数据,也可以使用${name}
前者将对数据进行处理(如防止sql注入,或给模糊查询中的数据自动封装双引号......)
后者则把数据原封不动传入标签中的sql语句(本工程中无此案例)。

使用大于小于符号时可以使用转义符(如&lt;)
    <select id="selectById" resultMap="brandResultMap">
        select * from tb_brand where id = #{id};
    </select>
    Brand selectById(int id);
    @Test
    public void selectById() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        System.out.println(brandMapper.selectById(1));
        sqlSession.close();
    }

3.如何通过注解来给接口传递简单的sql语句(不写mapper.xml文件)?
注解中的内容与mapper.xml文件中的内容一致
由于不会使用到mapper.xml文件中的属性,无法引用配置文件中的resultMap
映射类的属性与数据表的列名可以使用Results注解
    @Select("select * from tb_brand where id=#{id};")
    @Results(id="resultMap",value = {
            @Result(column = "brand_name",property = "brandName"),
            @Result(column = "company_name",property = "companyName"),
    })
    Brand selectById2(int id);
    @Test
    public void selectById2() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        System.out.println(brandMapper.selectById2(1));
        sqlSession.close();
    }

4.多条件查询的Mapper接口中能够能够传递哪些数据?各有什么特点?多条件查询中,如有为null的数据,该查询将会如何执行?

多条件查询,在mapper接口中能有多种方法(重载)去传递信息,在映射文件中只写一个查询语句

    <select id="selectByCondition" resultMap="brandResultMap">
        select * from tb_brand
        where status=#{status}
        and company_name like #{companyName}
        and brand_name like #{brandName};
    </select>

多条件查询接口1:传递多个参数

不写注解会报错,这里的注解名对应的是mapper.xml中#{}内的内容

如果传递多个参数,mybatis会创建map集合封装

不使用注解的话,mapper.xml文件中#{}内就只能用arg0~n和param1~n 

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

多条件查询接口2:传递实体类对象

映射文件里面找哪个值就去给他的对象的那个方法里面找对应的get方法 

    List<Brand> selectByCondition(Brand brand);

多条件查询接口3:传递Map

键对应类的属性(mapper.xml中#{}内的内容),值对应数据

    List<Brand> selectByCondition(Map map);
    @Test
    public void selectByCondition() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        System.out.println("1.通过传递多个参数查询数据");
        System.out.println(brandMapper.selectByCondition(0,"%三%","%三%"));
        System.out.println("2.通过传递对象查询数据");
        System.out.println(brandMapper.selectByCondition(new Brand("%三%","%三%",0)));
        System.out.println("3.通过传递Map查询数据");
        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put("status",0);
        hashMap.put("companyName","%三%");
        hashMap.put("brandName","%三%");
        System.out.println(brandMapper.selectByCondition(hashMap));
        System.out.println("4.缺少数据将会导致查询失误,为空的条件也将会被列入查询条件中");
        System.out.println(brandMapper.selectByCondition(0,"%三%",null));
        sqlSession.close();
    }

5.如何实现动态的多条件查询(有查询条件则查询,为0~n个或者0~1个,条件为空就不查询),对于传递的字符串数据应该注意什么?
使用where+choose+when标签,查询条件有0~1个
where可以去除choose标签中使用otherwise标签写1=1的情况,去除where会报错
    <select id="selectByCondition2" 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>

使用where标签与if标签,查询条件为0~n个 where去除第一个条件“1=1” 需要注意字符串可以为''和null的两种情况
    <select id="selectByCondition3" 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>

    List<Brand> selectByCondition2(
            @Param("status")int status,
            @Param("companyName")String companyName,
            @Param("brandName")String brandName);
    List<Brand> selectByCondition3(
            @Param("status")Integer status,
            @Param("companyName")String companyName,
            @Param("brandName")String brandName);
    @Test
    public void selectByCondition2() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        System.out.println("多条件查询:不为null或空串就查询");
        System.out.println(brandMapper.selectByCondition2(0,"%三%",null));
        System.out.println("多条件查询:最多只查询一个条件");
        System.out.println(brandMapper.selectByCondition3(null,"%三%","%四%"));
        sqlSession.close();
    }

6.如何实现添加数据?添加数据等需要修改数据库表的内容的操作需要如何提交事务?
    <insert id="add">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName},#{companyName},#{ordered},#{description},#{status});
    </insert>
    void add(Brand brand);
    @Test
    public void add() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        System.out.println("6.2在使用openSession时传递参数true设置为默认提交事务");
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        brandMapper.add(new Brand("京东","京东",10,"京东~",1));
        sqlSession.close();
    }

7.如何在添加数据之后快速获得该数据自动增长的id?
7.使用userGeneratedKeys与keyProperty属性可在添加数据时,
把数据库中的表中自动增长的数据赋值给实体类对象的属性(自动增长的id)
    <insert id="add2" useGeneratedKeys="true" keyProperty="id">
        insert into tb_brand (brand_name, company_name, ordered, description, status)
        values (#{brandName},#{companyName},#{ordered},#{description},#{status});
    </insert>
    void add2(Brand brand);
    @Test
    public void add2() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        Brand brand = new Brand("京东","京东",10,"京东~",1);
        brandMapper.add2(brand);
        System.out.print("7.添加数据的id为:");
        System.out.print(brand.getId());
        sqlSession.close();
    }

 

8..如何实现修改数据?修改数据能自动返回什么消息?
    <update id="updateById">
        update tb_brand set
            status =#{status},
            company_name =#{companyName},
            brand_name =#{brandName},
            ordered =#{ordered},
            description =#{description}
        where id=#{id};
    </update>
    int updateById(Brand brand);
    @Test
    public void updateById() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        Brand brand = new Brand(6,"淘宝","淘宝",10,"阿里巴巴~",1);
        System.out.print("8.修改数据,方法可返回修改条数:");
        System.out.println(brandMapper.updateById(brand));
        sqlSession.close();
    }

 

9.传递数据为空的话数据也会修改吗?如何实现动态修改数据?
9.动态修改数据
当传输的数据为空时,修改的数据也会变成空
使用set标签(只使用if标签可能会多出逗号)
    <update id="updateById2">
        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="status!=null">
                status =#{status},
            </if>
            <if test="description!=null and description!=''">
                description =#{description}
            </if>
        </set>
        where id=#{id};
    </update>
    int updateById2(Brand brand);
    @Test
    public void updateById2() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        Brand brand = new Brand(5,"",null,20,"阿里巴巴~",1);
        brandMapper.updateById2(brand);
        sqlSession.close();
    }

 修改前:

修改后: 

10.根据id实现批量删除数据可向接口中传递数组,如何实现批量删除?
删除单个:
    <delete id="deleteById">
        delete from tb_brand where id =#{id};
    </delete>
    int deleteById(int id);
    @Test
    public void deleteById() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        brandMapper.deleteById(5);
        sqlSession.close();
    }
批量删除:
mybatis会将数组参数封装为map集合
键为array,值是数组

这里使用foreach遍历数组
collection在这里可以写array,也能写arg0
item表示每一个数据,是#{}中的内容
separator分隔符,open 与close表示在这段左边与右边添加()
    <delete id="deleteByIds">
        delete from tb_brand where id in
        <foreach collection="array" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>;
    </delete>
    int deleteByIds(int[] ids);
    @Test
    public void deleteByIds() throws IOException {
        SqlSessionFactory sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession(true);
        BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
        int[] arr = {1,2,3,4};
        brandMapper.deleteByIds(arr);
        sqlSession.close();
    }

11.mapper接口中传入的参数不同,对应在mapper.xml文件中引用该参数应该如何描述?

pojo类:属性名

map集合:键名

Collection:collection

List:collection/list

数组:array

也可以使用arg0~n来引用

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

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

相关文章

RFID射频识别技术的优势

目前RFID在金融支付、物流、零售、制造业、医疗、身份识别、防伪、资产管理、交通、食品、动物识别、汽车、等行业都已经实现不同程度的商业化使用。未来&#xff0c;RFID技术有不可替代的六大优势&#xff0c;也保证了物联网的万物互联的有序发展! 1、无需可视&#xff0c;在无…

kibana7.17.7 将数据导出csv文件

配置kibana文件 首先先配置kibana.yaml内容如下&#xff0c;这里假设我的服务器ip地址为192.168.130.128&#xff0c;elasticsearch的ip地址为&#xff1a;192.168.130.129:9200&#xff0c;192.168.130.130:9200&#xff1a; server.host: "192.168.130.128" serv…

lc 每日一题 2024 - 03 - 01 划分型dp

链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 子集划分型dp , 设置dp[i1]表示前i个数字能否有效划分&#xff1b; 那么一个划分好的数组 两个相等的数字 &#xff0c; 新形成的数组也是有效划分数组; 同理&#xff0c;加上三个相等 或 三个递增的数字 &…

初学JavaScript总结

0 JavaScript html完成了架子&#xff0c;css做了美化&#xff0c;但是网页是死的&#xff0c;需要给他注入灵魂&#xff0c;所以接下来需要学习JavaScript&#xff0c;这门语言会让页面能够和用户进行交互。JavaScript又称为脚本语言&#xff0c;可以通过脚本实现用户和页面的…

CIES预告 | 飞凌嵌入式即将亮相第14届中国国际储能大会

第14届中国国际储能大会暨展览会将于2024年3月11日~13日在杭州举行&#xff0c;本届大会以“共建储能生态链&#xff0c;共创储能新发展”为主题&#xff0c;搭建储能行业国际化交流与合作平台&#xff0c;探索储能领域新技术、新业态、新模式&#xff0c;推进储能产业上下游供…

Kubernetes的Sevice管理

服务原理: 所有服务都是根据这个服务衍生或者变化出来,根服务---- 服务感知后端靠标签 slelector 标签选择器 kubectl label pods web1 appweb kubectl cluter-info dump | grep -i service-cluster-ip-range 服务ip取值范围 Service 管理: 创建服务: --- kind: Serv…

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库&#xff0c;常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步&#xff1a;确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本&#xff0c;您可…

虚拟机上为AzureDevOps Server 创建用户

为DevOpsServer创建登录用户 背景虚拟机的本地用户和组去DevOps Server上添加本地用户 背景 我们有一台虚拟机&#xff0c;然后在上面安装了一台Azure DevOps Server&#xff0c;然后我们创建几个登录用户。 虚拟机的本地用户和组 首先我们登陆到虚拟机&#xff0c;然后我们…

B站画质补完计划(2):视频超分让像素细腻生动

本期作者 1 前言 为了给用户提供更清晰的画质体验&#xff0c;B站自研的超分辨率算法已经在站内广泛应用&#xff0c;支持了如《赛马娘》、《流浪地球2》、《权力的游戏》、英雄联盟S赛赛事直播等知名番剧、电影电视剧以及重要游戏赛事直播的 4K 视频流生产。 2 超分算法的应用…

Excel2LaTeX插件的使用、LaTeX表格

目录 一、下载Excel2Latex 二、使用Excel2Latex 1、将Excel2LaTeX文件添加到加载项 2、导出LaTex的表格数据 3、注意事项 1&#xff09;生成的latex表格断断续续问题 2&#xff09;改变线形的粗细 3&#xff09;表格太大&#xff0c;需要缩小到适应大小 4&#xff09;…

CCDP.01.寄主机SSH连接虚拟机的QA

V0.0 初始版本-2024.2.29 检查VM的网卡配置 如上图&#xff0c;如果enp0s3网卡没有出现形如10.0.0.??/24的ip配置&#xff0c;说明该网卡配置存在错误&#xff0c;或者没有“使能”该网卡。在RockyLinux8.X中可检查“ifcfg-enp0s&#xff1f;” vi /etc/sysconfig/network-…

软件测试人的测试思维

系统性思维 如果以系统性思维来分析和解决问题&#xff0c;就不会出现&#xff1a; 只见树木不见森林片面地追求单个目标被表象所迷惑&#xff0c;看不到本质忽视某些产品质量风险千里之堤、溃于蚁穴用线性的思维方式来理解非线性的问题 而是会整体地、多角度地、多层次地分…

数据仓库与数据挖掘概述

目录 一、数据仓库概述 &#xff08;一&#xff09;从传统数据库到数据仓库 &#xff08;二&#xff09;数据仓库的4个特征 &#xff08;三&#xff09;数据仓库系统 &#xff08;四&#xff09;数据仓库系统体系结构 &#xff08;五&#xff09;数据仓库数据的粒度与组织…

babylonjs入门-点光源

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 ​ 懒得打字&#xff0c;粘贴复制&#xff0c;一气呵成

第二节:开始Sashulin Message Broker旅程

一、创建第一条消息流 1、新建工程 点击File->New Project或工具栏中的New Project按钮创建新工程&#xff0c;我们的示例中命名为"csdnProject"&#xff0c;工程名后缀是epr。点击Save即可。 2、新建消息流 建立好工程后&#xff0c;在Project Explorer中建立…

Spring IOC在业务中常见的使用方式

目录 1、什么是IOC 2、java实现创建对象的方式有哪些 3、基于配置文件的di实现 3.1、什么是di 3.2、入门案例 3.3、环境搭建 接口和实现类 ioc配置文件 测试程序 3.4、案例总结 3.5、简单类型属性的赋值&#xff08;set注入&#xff09; set注入要求 JavaBean sp…

推特API(Twitter API)对接说明,用户code To Token换取

前期准备 提前准备、说明&#xff1a;目前对接推特api开发门户分为3个版本&#xff0c;分别是免费的&#xff0c;100美金一个月的基础版以及5000美金一个月的企业版&#xff0c;免费的目前就两个接口可以调用&#xff0c;所以想要对接和使用推特最基本的也需要付100美元一个月…

BAT三家市值总和近7000亿美元,足见它们“富可敌国”

当中国互联网拥抱共享经济时&#xff0c;BAT依然展现出它的雄姿。 临近年中&#xff0c;阿里巴巴和腾讯市值均突破3000亿美元&#xff0c;并持续创出历史新高。 百度也逐渐走出低迷&#xff0c;市值已升至600亿美元以上。 BAT这三个公司的总市值接近7000亿美元&#xff0c;可见…

2024阿里云数据库费用价格,2核4G配置227元一年

阿里云数据库大全&#xff1a;RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;数据仓库如AnalyticDB MySQL版、PostgreSQL、ClickHouse&#xff0c;阿里云还提供数据库管理工具如数…

【开源项目】自动字幕生成和字幕翻译

文章目录 1. 安装ffmpeg2. 克隆项目3. 配置项目运行环境4. 填写配置文件5. 运行项目&#xff08;仅使用CPU&#xff09; 项目地址&#xff1a;Github - qinL-cdy/auto_ai_subtitle 项目原理&#xff1a;使用ffmpeg提取视频的音频&#xff0c;使用whisper将音频转写为字幕&#…