视频链接:Spring5框架最新版教程
文章源码:https://github.com/geyiwei-suzhou/spring5/

JdbcTemplate 概述和准备工作
  1. 什么是JdbcTemplate?
    (1)Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作

  2. 准备工作
    (1)引入相关jar包
    druid 提取码: 5ewy
    mysql-connector-java 提取码: sphm
    spring-jdbc-5.2.9.RELEASE.jar
    spring-tx-5.2.9.RELEASE.jar
    spring-orm-5.2.9.RELEASE.jar lib
    (2)配置连接池信息

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
      <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/user_db" />
      <property name="username" value="root" />
      <property name="password" value="123456" />
    </bean>
    

    (3)配置JdbcTemplate对象,注入DataSource

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

    (4)创建service类,创建dao类,在dao注入jdbcTemplate

    配置文件中添加组件扫描

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.antherd"></context:component-scan>
    

    BookDao、BookDaoImpl、Service

    package com.antherd.spring5.dao;
    
    public interface BookDao {
    
    }
    
    package com.antherd.spring5.dao;
    
    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;
    }
    
    package com.antherd.spring5.service;
    
    import com.antherd.spring5.dao.BookDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BookService {
    
      // 注入dao
      @Autowired
      private BookDao bookDao;
    }
    
JdbcTemplate 操作数据库(添加)

在数据库中添加两张表

CREATE TABLE `t_book` (
  `user_id` bigint(20) NOT NULL,
  `username` varchar(100) NOT NULL,
  `ustatus` varchar(50) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(1)对应数据库创建实体类

package com.antherd.spring5.entity;

public class Book {

  private Long userId;
  private String username;
  private String ustatus;

  public Long getUserId() {
    return userId;
  }

  public void setUserId(Long userId) {
    this.userId = userId;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public String getUstatus() {
    return ustatus;
  }

  public void setUstatus(String ustatus) {
    this.ustatus = ustatus;
  }
}

(2)编写service和dao
在dao进行数据库添加操作
调用JdbcTemplate对象里面update方法实现添加操作
有两个参数
- 第一个参数:sql语句
- 第二个参数:可变参数,设置sql语句值

package com.antherd.spring5.dao;

import com.antherd.spring5.entity.Book;

public interface BookDao {
  // 添加的方法
  void add(Book book);
}
package com.antherd.spring5.service;

import com.antherd.spring5.dao.BookDao;
import com.antherd.spring5.entity.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);
  }
}
package com.antherd.spring5.dao;

import com.antherd.spring5.entity.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) {
    // 1 创建sql语句
    String sql = "insert into t_book values(?, ? ,?)";
    // 2 调用方法实现
    Object[] args = {book.getUserId(), book.getUsername(), book.getUstatus()};
    int update = jdbcTemplate.update(sql, args);
    System.out.println(update);

  }
}

测试

@Test
public void testJdbcTemplate() {
  ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
  BookService bookService = context.getBean("bookService", BookService.class);
  Book book = new Book();
  book.setUserId(1L);
  book.setUsername("java");
  book.setUstatus("a");
  bookService.addBook(book);
}
JdbcTemplate 操作数据库(修改和删除)
// 修改的方法
void update(Book book);

// 删除的方法
void delete(Long id);
@Override
public void update(Book book) {
  String sql = "update t_book set username = ?, ustatus = ? where user_id = ?";
  Object[] args = {book.getUsername(), book.getUstatus(), book.getUserId()};
  int update = jdbcTemplate.update(sql, args);
  System.out.println(update);
}

@Override
public void delete(Long id) {
  String sql = "delete from t_book where user_id = ?";
  int update = jdbcTemplate.update(sql, id);
  System.out.println(update);
}
// 修改的方法
public void updateBook(Book book) {
  bookDao.update(book);
}

// 删除的方法
public void deleteBook(Long id) {
  bookDao.delete(id);
}

测试

// 修改
Book book = new Book();
book.setUserId(1L);
book.setUsername("java update");
book.setUstatus("antherd");
bookService.updateBook(book);

// 删除
bookService.deleteBook(1L);
JdbcTemplate 操作数据库(查询返回某个值)

查询表有多少条记录,返回是某个值,使用JdbcTemplate

// 查询表记录数
int selectCount();
// 查询表记录数
@Override
public int selectCount() {
  String sql = "select count(*) from t_book";
  Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
  return count;
}
// 查询表记录数
public int findCount() {
  return bookDao.selectCount();
}

测试

// 查询返回某个值
int count = bookService.findCount();
System.out.println(count);
JdbcTemplate 操作数据库(查询返回对象)

场景:查询图书详情,JdbcTemplate实现查询返回对象
jdbcTemplate.queryForObject方法,有三个参数

  • 第一个参数:sql语句
  • 第二个参数:RowMapper,是接口,针对不同类型数据,使用这个接口里面实现类完成数据封装
  • 第三个参数:sql语句值

Book.class

@Override
public String toString() {
  return "Book{" +
      "userId=" + userId +
      ", username='" + username + '\'' +
      ", ustatus='" + ustatus + '\'' +
      '}';
}
// 查询返回对象
Book findBookInfo(Long id);
// 查询返回对象
@Override
public Book findBookInfo(Long id) {
  String sql = "select * from t_book where user_id = ?";
  // 调用方法
  Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
  return book;
}
// 查询返回对象
public Book findOne(Long id) {
  return bookDao.findBookInfo(id);
}

测试

// 查询返回对象
Book book = bookService.findOne(1L);
System.out.println(book);
JdbcTemplate 操作数据库(查询返回集合)

场景:查询图书列表分页…
调用JdbcTemplate.query方法,有三个参数

  • 第一个参数:sql语句
  • 第二个参数:RowMapper,是接口,针对不同类型数据,使用这个接口里面实现类完成数据封装
  • 第三个参数:sql语句值
// 查询返回集合
List<Book> findAllBook();
// 查询返回集合
@Override
public List<Book> findAllBook() {
  String sql = "select * from t_book";
  // 调用方法
  List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
  return bookList;
}
// 查询返回集合
public List<Book> findAll() {
  return bookDao.findAllBook();
}

测试

//查询返回集合
List<Book> all = bookService.findAll();
System.out.println(all);
JdbcTemplate 操作数据库(批量添加操作)

批量操作:操作表里面多条记录
JdbcTemplate实现批量添加操作
batchUpdate
有两个参数

  • 第一个参数:sql语句
  • 第二个参数:List集合,添加多条记录数据
// 批量添加
void batchAddBook(List<Object[]> batchArgs);
@Override
public void batchAddBook(List<Object[]> batchArgs) {
  String sql = "insert into t_book values(?, ? ,?)";
  int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
  System.out.println(Arrays.toString(ints));
}
// 批量添加
public void batchAdd(List<Object[]> batchArgs) {
  bookDao.batchAddBook(batchArgs);
}

测试

// 批量添加
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3", "java", "a"};
Object[] o2 = {"4", "c++", "b"};
Object[] o3 = {"5", "mysql", "c"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
// 调用批量添加
bookService.batchAdd(batchArgs);
JdbcTemplate 操作数据库(批量修改操作)
// 批量添加
void batchUpdateBook(List<Object[]> batchArgs);
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
  String sql = "update t_book set username = ?, ustatus = ? where user_id = ?";
  int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
  System.out.println(Arrays.toString(ints));
}
// 批量添加
public void batchUpdate(List<Object[]> batchArgs) {
  bookDao.batchUpdateBook(batchArgs);
}

测试

// 批量添加
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"java0909", "a", "3"};
Object[] o2 = {"c++1010", "b", "4"};
Object[] o3 = {"mysq1111", "c", "5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
// 调用批量添加
bookService.batchUpdate(batchArgs);
JdbcTemplate 操作数据库(批量删除操作)
// 批量删除
void batchDeleteBook(List<Object[]> batchArgs);
// 批量删除
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
  String sql = "delete from t_book where user_id = ?";
  int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
  System.out.println(Arrays.toString(ints));
}
// 批量删除
public void batchDelete(List<Object[]> batchArgs) { bookDao.batchDeleteBook(batchArgs); }

测试

// 批量删除
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3"};
Object[] o2 = {"4"};
batchArgs.add(o1);
batchArgs.add(o2);
// 调用方法实现批量修改
bookService.batchDelete(batchArgs);
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐