Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作JdbcTemplate实现批量增删改操作

news2024/7/6 20:33:06

Spring5学习总结(三)JdbcTemplate实现数据库增删改查操作/JdbcTemplate实现批量增删改操作

一、JdbcTemplate概述

什么是 JdbcTemplate?
JdbcTemplate是Spring 框架对 JDBC 进行的封装,使用它可以更方便实现对数据库的操作。

二、使用JdbcTemplate实现对数据库的操作

(一)准备工作

1.引入相关 jar 包
在这里插入图片描述
2.在 spring 配置文件配置数据库连接池
首先创建外部属性文件,properties 格式文件,写数据库信息
jdbc.properties(src下创建的):

prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/test_book?useUnicode=true&characterEncoding=utf8
prop.username=root
prop.password=123456

把外部 properties 属性文件引入到 spring 配置文件中(记得引入 context 名称空间):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${prop.url}" />
        <property name="username" value="${prop.username}" />
        <property name="password" value="${prop.password}" />
        <property name="driverClassName" value="${prop.driverClass}" />
    </bean>
</beans>

3.配置 JdbcTemplate 对象,注入 DataSource
通过查看JdbcTemplate的父类JdbcAccessor的源码,我们可以发现有一个设置数据源的set方法:
在这里插入图片描述
因此我们可以通过set注入,将我们的数据源注入:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${prop.url}" />
        <property name="username" value="${prop.username}" />
        <property name="password" value="${prop.password}" />
        <property name="driverClassName" value="${prop.driverClass}" />
    </bean>

    <!-- JdbcTemplate 对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入上面写好的dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

4.创建 service 类,创建 dao 类,在 dao 类中注入 jdbcTemplate 对象
在这里插入图片描述
BookDao:

public interface BookDao {
}

BookDaoImpl:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
}

BookService:

import com.fox.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;
}

5.在spring配置文件中开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.fox"></context:component-scan>

    <!--引入外部属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${prop.url}" />
        <property name="username" value="${prop.username}" />
        <property name="password" value="${prop.password}" />
        <property name="driverClassName" value="${prop.driverClass}" />
    </bean>

    <!-- JdbcTemplate 对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入上面写好的dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

(二)实现数据库添加操作

场景:假设我现在有以下这么一张book表,我想往表里添加数据
在这里插入图片描述
1.对应数据库创建实体类
在这里插入图片描述
Book类:

public class Book {
    private String bookId;
    private String bookName;
    private String author;
    private double price;

    public String getBookId() {
        return bookId;
    }

    public void setBookId(String bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookId='" + bookId + '\'' +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

2.编写 service 层和 dao 层

  • JdbcTemplate类中有一个update()方法:
    在这里插入图片描述
  • 这个方法可以实现数据库的添加、修改和删除。
  • 它共有两个参数:
    • 第一个参数:sql 语句
    • 第二个参数:是可变参数(其实是一个数组),表示填充占位符的值

BookDao:

import com.fox.pojo.Book;

public interface BookDao {
    public void add(Book book);
}

BookDaoImpl:

import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //添加一本书
    @Override
    public void add(Book book) {
        //创建 sql 语句
        String sql="insert into book values(?,?,?,?)";
        //将填充占位符的值写进一个数组里
        Object[] args={book.getBookId(), book.getBookName(), book.getAuthor(), book.getPrice()};
        //调用JdbcTemplate中的update方法实现
        int update = jdbcTemplate.update(sql,args);
        //update返回的结果就是数据表受影响的行数
        System.out.println("共"+update+"行受到影响");
    }
}

BookService:

import com.fox.dao.BookDao;
import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public void addBook(Book book){
        bookDao.add(book);
    }
}

3.测试类

import com.fox.pojo.Book;
import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        Book book = new Book();
        book.setBookId("10004");
        book.setBookName("精通HTML");
        book.setAuthor("小红");
        book.setPrice(10.0);
        bookService.addBook(book);
    }
}

运行:
在这里插入图片描述

我们的数据库也成功添加了一条记录:

在这里插入图片描述

(三)实现数据库修改操作

其实修改和删除操作和添加操作同理
BookDao:

public void update(Book book);

BookDaoImpl:

	@Override
    public void update(Book book) {
        //创建 sql 语句
        String sql="update book set book_name=?,author=?,price=? where book_id=?";
        //将填充占位符的值写进一个数组里
        Object[] args={book.getBookName(),book.getAuthor(),book.getPrice(),book.getBookId()};
        //调用JdbcTemplate中的update方法实现
        int update = jdbcTemplate.update(sql,args);
        //update返回的结果就是数据表受影响的行数
        System.out.println("共"+update+"行受到影响");
    }

BookService:

public void updateBook(Book book){
    bookDao.update(book);
}

测试类:

import com.fox.pojo.Book;
import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        Book book = new Book();
        book.setBookId("10004");
        book.setBookName("HTML入门");
        book.setAuthor("小红");
        book.setPrice(10.0);
        bookService.updateBook(book);
    }
}

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

(四)实现数据库删除操作

BookDao:

public void delete(String id);

BookDaoImpl:

    @Override
    public void delete(String id) {
        //创建 sql 语句
        String sql="delete from book where book_id=?";
        //调用JdbcTemplate中的update方法实现
        int update = jdbcTemplate.update(sql,id);
        //update返回的结果就是数据表受影响的行数
        System.out.println("共"+update+"行受到影响");
    }

BookService:

public void deleteBook(String id){
    bookDao.delete(id);
}

测试类:

import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.deleteBook("10004");
    }
}

在这里插入图片描述

在这里插入图片描述

(五)实现数据库查询操作

1.查询返回一个值

场景:还是以Book表为例,假如我们想查询Book表里有几条记录或者查询Book表里最贵的书的价格是多少等等,这种使用到分组函数的查询都是只返回一个值。

我们可以通过使用 JdbcTemplate 里的queryForObject()方法实现查询返回某个值:
在这里插入图片描述

  • 第一个参数:sql 语句
  • 第二个参数:查询结果类型的Class

案例
BookDao:

public interface BookDao {
    public void maxPrice();
}

BookDaoImpl:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void maxPrice() {
        String sql="select max(price) from book";
        Double query = jdbcTemplate.queryForObject(sql, Double.class);
        System.out.println("最贵的书的价格:"+query+"元");
    }
}

BookDaoService:

import com.fox.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public void selectMaxPrice(){
        bookDao.maxPrice();
    }
}

测试类:

import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        bookService.selectMaxPrice();
    }
}

在这里插入图片描述

2.查询返回一个对象

场景:假如我们想在book表中查询某一本图书的详情,那么数据库就会返回一行数据,也就是Java里的一个对象。
使用过原生JDBC的朋友应该知道,从数据库查询出来的记录全都被保存在ResultSet结果集中,我们需要将结果集中的数据一条条地获取并设置到具体的实体类上,如此,该实体类才能在接下来的程序中使用。然而问题是,每次都要这么操作实在是太麻烦了,JdbcTemplate就不应该提供什么功能来替我们做这些事情吗?答案当然是有的,那就是——RowMapper。

JdbcTemplate中查询返回对象的方法:
在这里插入图片描述

  • 第一个参数:sql 语句
  • 第二个参数:RowMapper 是一个接口,使用这个接口的实现类BeanPropertyRowMapper完成数据封装,将数据库查询结果转换为我们想要的Java类对象
  • 第三个参数:是可变参数(其实是一个数组),表示填充占位符的值

我们在使用BeanPropertyRowMapper时,是给queryForObject()方法传递一个BeanPropertyRowMapper对象,让JdbcTemplate帮我们把查询结果集ResultSet的每一行结果都使用BeanPropertyRowMapper.mapRow()方法,转化成我们想要的Java类对象。从BeanPropertyRowMapper名称上也能够看出来,它是用来映射Java对象的属性和MySQL表的字段名称的,它可自动将一行数据映射到指定类的实例中,它首先将这个类实例化,然后通过名称匹配的方式,映射到属性中去。但是,在映射的过程中,需要确保数据库表列名称与Java实体类属性名称相同(字段名字一样或者驼峰式与下划线式对应)

所以,如果在使用时,Java类名称要想和数据库字段名称匹配上,必须要把数据库字段名称设计成以下两种中的一种:

  • 数据库字段名设计成全小写的形式,如bookname;
  • 数据库字段名设计成下划线分割的形式,如book_name;

同时,Java属性名称应该尽量遵循Java编码风格,使用camelCase风格(驼峰命名形式),如bookName。

案例
首先确保数据库字段名和Java属性名都遵循以上格式:
在这里插入图片描述在这里插入图片描述
BookDao:

import com.fox.pojo.Book;

public interface BookDao {
    public Book selectById(String id);
}

BookDaoImpl:

import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public Book selectById(String id) {
        String sql="select * from book where book_id=?";
        Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
        return book;
    }
}

BookService:

import com.fox.dao.BookDao;
import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public Book selectById(String id){
        return bookDao.selectById(id);
    }
}

测试类:

import com.fox.pojo.Book;
import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        Book book = bookService.selectById("10002");
        System.out.println(book);
    }
}

在这里插入图片描述

3.查询返回集合

场景:假如我们想查询价格低于50元的图书,那么可能不止一本,查询的结果就是几行数据,也就是几个对象组成的集合。

JdbcTemplate中查询返回集合的方法:
在这里插入图片描述

  • 第一个参数:sql 语句
  • 第二个参数:RowMapper 是一个接口,使用这个接口的实现类BeanPropertyRowMapper完成数据封装,将数据库查询结果转换为我们想要的Java类对象
  • 第三个参数:是可变参数(其实是一个数组),表示填充占位符的值

案例
BookDao:

import com.fox.pojo.Book;
import java.util.List;

public interface BookDao {
    public List<Book> selectAllBook();
}

BookDaoImpl:

import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public List<Book> selectAllBook() {
        String sql="select * from book";
        List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
        return bookList;
    }
}

BookService:

import com.fox.dao.BookDao;
import com.fox.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public List<Book> selectAllBook(){
        return bookDao.selectAllBook();
    }
}

测试类:

import com.fox.pojo.Book;
import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        List<Book> bookList = bookService.selectAllBook();
        for (Book book : bookList) {
            System.out.println(book);
        }
    }
}

在这里插入图片描述

(六)实现数据库批量添加操作

场景:假如我想向book表中一次性添加多条数据,这就是批量添加操作

JdbcTemplate中批量添加、修改、删除的方法:
在这里插入图片描述

  • 第一个参数:sql 语句
  • 第二个参数:List 集合,需要添加的多个对象的集合
    这个List集合里的数据都是数组,每个数组装的是每一行记录的各个字段的值(即每一个对象的各个属性值)
  • 此方法会遍历集合中每个数组,对每个数组执行sql语句

案例
BookDao:

import java.util.List;

public interface BookDao {
    public void batchAdd(List<Object[]> batchArgs);
}
12345

BookDaoImpl:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Arrays;
import java.util.List;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void batchAdd(List<Object[]> batchArgs) {
        String sql="insert into book values(?,?,?,?)";
        //batchUpdate方法会遍历集合中每个数组,对每个数组执行sql语句
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(update));
    }
}

BookService:

import com.fox.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public void batchAdd(List<Object[]> batchArgs){
        bookDao.batchAdd(batchArgs);
    }
}

测试类:

import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        List<Object[]> list = new ArrayList<>();
        Object[] o1={"10004","CSS详解","小白",6.8};
        Object[] o2={"10005","JavaScript详解","小王",9.8};
        Object[] o3={"10006","MyBatis详解","小李",8.9};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        bookService.batchAdd(list);
    }
}

在这里插入图片描述
[1,1,1] 表示每条记录添加后受影响的行数,共三条记录。
在这里插入图片描述

(七)实现数据库批量修改操作

和批量添加同理。

案例
BookDao:

import java.util.List;

public interface BookDao {
    public void batchUpdate(List<Object[]> batchArgs);
}

BookDaoImpl:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Arrays;
import java.util.List;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void batchUpdate(List<Object[]> batchArgs) {
        String sql="update book set book_name=?,author=?,price=? where book_id=?";
        //batchUpdate方法会遍历集合中每个数组,对每个数组执行sql语句
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(update));
    }
}

BookService:

import com.fox.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public void batchUpdate(List<Object[]> batchArgs){
        bookDao.batchUpdate(batchArgs);
    }
}

测试类:

import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        List<Object[]> list = new ArrayList<>();
        Object[] o1={"CSS从入门到秃顶","小白",6.8,"10004"};
        Object[] o2={"JavaScript详解","小王",8.8,"10005"};
        Object[] o3={"MyBatis详解","李白",8.9,"10006"};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        bookService.batchUpdate(list);
    }
}

在这里插入图片描述

在这里插入图片描述

(八)实现数据库批量删除操作

案例
BookDao:

import java.util.List;

public interface BookDao {
    public void batchDelete(List<Object[]> batchArgs);
}

BookDaoImpl:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Arrays;
import java.util.List;

@Repository
public class BookDaoImpl implements BookDao {
    //注入 JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public void batchDelete(List<Object[]> batchArgs) {
        String sql="delete from book where book_id=?";
        //batchUpdate方法会遍历集合中每个数组,对每个数组执行sql语句
        int[] update = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println(Arrays.toString(update));
    }
}

BookService:

import com.fox.dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    public void batchDelete(List<Object[]> batchArgs){
        bookDao.batchDelete(batchArgs);
    }
}

测试类:

import com.fox.service.BookService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;

public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
        List<Object[]> list = new ArrayList<>();
        Object[] o1={"10004"};
        Object[] o2={"10005"};
        Object[] o3={"10006"};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        bookService.batchDelete(list);
    }
}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Redis序列化设置以及jetcache连接Redis序列化的设置

1、问题 问题&#xff1a;我在使用jetchche进行连接redis的时候&#xff0c;存入redis的value一直使用的是redis默认的序列化方式&#xff0c;是使用的jdk序列化。当我使用jetcache向redis存入一个对象 存入redis的结果: 这是使用jdk序列化的结果。 但是我记得使用redis的时候…

密码学期末复习(按考点整理,超详细!!!)

复习目录&#xff09; 题型第一章密码算法的安全性分类密码分析的难易程度凯撒密码加密原理古典密码中仿射变换的解密变换 第二章流密码的组成和特点流密码的基本思想 第三章分组密码的CBC工作模式&#xff0c;以及该模式的加密示意图AES中字节求逆雪崩效应分组密码的安全设计原…

让HR眼前一亮:30个APP项目软件测试经验,点燃你的简历

在求职过程中&#xff0c;我们都希望自己的简历能够吸引面试官的眼球&#xff0c;从而获得更多的面试机会。作为一名软件测试人员&#xff0c;丰富的实战经验是让自己脱颖而出的关键之一。 在我多年从事APP项目软件测试的工作中&#xff0c;我积累了大量的实践经验&#xff0c…

Java 之 String、StringBuffer与StringBuilder 区别

String String 是被 final 修饰的类&#xff0c;不能被继承&#xff1b;String实现了 Serializable 和Comparable接口&#xff0c;表示String支持序列化和可以比较大小&#xff1b;String底层是通过char类型的数据实现的&#xff0c;并且被final修饰&#xff0c;所以字符串的值…

大数据5--spark

1.Spark 定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 Spark 是什么 Spark 最早源于一篇论文 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing&#xff0c; 该论文是由加州大学柏克莱…

vue3中其他的变化

1.全局API的转移 Vue 2.x 有许多全局 API 和配置。 - 例如&#xff1a;注册全局组件、注册全局指令等。 //注册全局组件 Vue.component(MyButton, {data: () > ({count: 0}),template: <button click"count">Clicked {{ count }} times.</button> …

微信小程序+wx.connectSocket客服问答

项目需求&#xff0c;记录一下&#xff1a; 1.要求websocket实时返回会话结果 我项目这边是后端一次返回一个字&#xff0c;–finish–结束&#xff0c;所以实现方法是每获取到数据时就setData一次&#xff0c;直到获取到的数据为finish&#xff0c;停止setData 后端返回结果…

Banana Pi BPI-Centi-S3 使用MicroPython编程显示JPG图片

BPI-Centi-S3是我们新推出的一款板载1.9英寸彩屏的小尺寸ESP32-S3开发板&#xff01; BPI-Centi-S3 banana-pi wiki BPI-Centi-S3 bpi-steam wiki 1 关键特性 ESP32-S3&#xff0c;Xtensa 32 bit LX72M PSRAM , 8M FLASH2.4G WIFI &#xff0c;Bluetooth 5 &#xff0c;Blue…

Windows下安装使用Kafka(使用Kafka内置的ZooKeeper)

Windows下安装使用Kafka(使用Kafka内置的ZooKeeper) Kafka2.8版本才开始自带了Zookeeper&#xff0c;所以注意下版本 kafka官网&#xff1a;https://kafka.apache.org kafka配置快速入门&#xff1a;https://kafka.apache.org/quickstart kafka下载页面&#xff1a;https:/…

找出1-1000中的所有完美数

再次练习查找完美数&#xff0c;找出 1-1000 中的所有完美数。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https://l…

【LeetCode】剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫环问题) p300 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/ 1. 题目介绍&#xff08;62. 圆圈中最后剩下的数字&#xff09; 0,1,,n-1 这n个数字排成一个圆圈&#xff0c;从数字0开始&#xff0c;每次从这个圆圈里删除第m个数字&a…

人工标注或成过去式?SSA语义分割框架、SSA-engine自动类别标注引擎,大幅提升细粒度语义标注效率

推荐语 4月5日&#xff0c;Meta发布 Segment Anything 模型和 SA-1B 数据集&#xff0c;引发CV届“地震”&#xff0c;其凭借一己之力&#xff0c;成功改写了物体检测、数据标注、图像分割等任务的游戏规则。 复旦大学ZVG实验室团队基于此最新开源了SSA语义分割框架和SSA-engin…

javaEE初阶 — Servlet API 详解

文章目录 HttpServlet1 Servlet 的生命周期2 代码示例3 使用 postman 构造请求4 使用 ajax 构造请求 HttpServletRequest1 代码示例 前端如何给后端传参1 通过 GET 里的 query string 传参2 通过 POST 借助 form 表单传参3 通过 json 格式传参 HttpServletResponse1 代码示例1.…

ChatGPT会取代RPA?ta自己可不是这么说的!

先说一个AI热知识&#xff1a;ChatGPT 的推出在科技界引发了一场狂潮。 聊天机器人ChatGPT以及其背后的AI大模型GPT&#xff0c;在2023年引爆全球。GPT 全称为 Generative Pre-trained Transformer&#xff0c;是一种使用人工神经网络的深度学习技术&#xff0c;能够使机器像人…

Transformer and Self-attention

一谈到 NLP&#xff0c;大家都听说过 Transformer&#xff0c; Self-attention 这些词汇&#xff0c;以及 Attension is all you need 这篇论文。 大家可能多多少少看过这类博客&#xff0c;对这些概念有一些了解&#xff0c;什么 QKV呀&#xff0c; encoder&#xff0c; decod…

贪心-刷杂技的牛

题意 农民约翰的 N 头奶牛&#xff08;编号为 1..N&#xff09;计划逃跑并加入马戏团&#xff0c;为此它们决定练习表演杂技。 奶牛们不是非常有创意&#xff0c;只提出了一个杂技表演&#xff1a; 叠罗汉&#xff0c;表演时&#xff0c;奶牛们站在彼此的身上&#xff0c;形成一…

Revit中如何绘制轴线?CAD图纸转轴网操作

一、如何用revit来制作这么一个简单的轴线呢? 01 、新建项目 绘制轴线&#xff0c;首先新建项目建筑样板 02 、轴线快捷键 绘制轴线的快捷键需要牢记&#xff0c;因为经常使用GR 03 、编辑轴线类型 当你画好第一条轴线&#xff0c;需要对轴线类型属性进行调节&#xff0c;一般…

基于vivado(语言Verilog)的FPGA学习(5)——跨时钟处理

基于vivado&#xff08;语言Verilog&#xff09;的FPGA学习&#xff08;5&#xff09;——跨时钟处理 1. 为什么要解决跨时钟处理问题 慢时钟到快时钟一般都不需要处理&#xff0c;关键需要解决从快时钟到慢时钟的问题&#xff0c;因为可能会漏信号或者失真&#xff0c;比如&…

基于HTML5智慧监所三维可视化安防管控系统

前言 物联网技术的发展使云计算技术得到了迅猛的发展及广泛的应用&#xff0c;智能体系的创建已经成为监狱发展的必然趋势。 智慧监狱的创建、智能化管理的推行是监狱管理的创新&#xff0c;也是监狱整体工作水平提升的具体体现。 建设背景 近年来&#xff0c;司法部不断加大…

jumpserver设置密码强度

1、点击系统设置 – 点击安全设置 2、设置密码强弱规则