JdbcTemplate概述:
JdbcTemplate是Spring提供的一套JDBC模板框架,利用AOP技术来解决直接使用JDBC时大量重复代码的问题。JdbcTemplate虽然没有MyBatis那么灵活,但是比直接使用JDBC要方便灵活的多。
JdbcTemplate是Spring的一部分,JdbcTemplate处理了资源的建立和释放。帮助我们避免一些常见的错误,比如关闭连接等等。它运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。
JdbcTemplate更新数据库的常用方法:
- update(用于执行insert、update、delete等DML语句)
- execute (可执行所有的SQL语句)
- batchUpdate(批量更新数据库)
- queryForObject(查询单行)
- query(查询多行)
SpringBoot整合JdbcTemplate:
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
数据配置:
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://localhost:3306/chapter05?characterEncoding=utf8&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password = root
如此之后,配置就完成了。
JdbcTemplate基本用法:
创建实体类:Book.java
import lombok.Data;
@Data
public class Book {
private Integer id;
private String name;
private String author;
}
创建数据库访问层:BookDao.java
import java.util.List;
/**
* @Repository 注解:
* 该注解作用在dao类上,可以将类别识别为bean
* 但该注解作用不只是将类别识别为bean,同时它还能将所标注的类中抛出的数据访问异常封装为Spring的数据访问异常类型
* Spring本身提供了一个丰富的并且是于具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常
* 使得异常独立于底层的框架
*/
@Repository
public class BookDao {
@Autowired
JdbcTemplate jdbcTemplate;
//新增记录
public int addBook(Book book){
return jdbcTemplate.update("insert into book(name,author) values (?,?)",book.getName(),book.getAuthor());
}
//更新记录
public int updateBook(Book book){
return jdbcTemplate.update("update book set name = ?,author = ? where id = ?",book.getName(),book.getAuthor(),book.getId());
}
//删除记录
public int deleteBookById(Integer id){
return jdbcTemplate.update("delete from book where id = ?",id);
}
//根据id查询记录
public Book getBookById(Integer id){
return jdbcTemplate.queryForObject("select * from book where id = ?",new BeanPropertyRowMapper<>(Book.class),id);
}
//查询全部记录
public List<Book> getAllBooks(){
return jdbcTemplate.query("select * from book",new BeanPropertyRowMapper<>(Book.class));
}
}
代码解释:
- 创建BookDao,注入JdbcTemplate,由于已经添加了spring-jdbc相关依赖,JdbcTemplate会被自动注册到Spring容器中,因此这里可以直接注入使用
- 在JdbcTemplate中,增删改查三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法主要用来完成查询功能。另外,execute方法可以用来执行任意的SQL、call方法来调用存储过程等
- 在执行查询操作时,需要有一个RowMapper将查询出来的列和实体类中的属性一一对应起来。如果列名和属性名时相同的,那么可以直接使用BeanPropertyRowMapper,如果不相同,就需要自己实现RowMapper接口,将列和实体类属性一一对应起来
创建Service:
import com.example.demo.Dao.BookDao;
import com.example.demo.Domain.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BookService {
@Autowired
BookDao bookDao;
public int addBook(Book book){
return bookDao.addBook(book);
}
public int updateBook(Book book){
return bookDao.updateBook(book);
}
public int deleteBookById(Integer id){
return bookDao.deleteBookById(id);
}
public Book getBookById(Integer id){
return bookDao.getBookById(id);
}
public List<Book> getAllBooks(){
return bookDao.getAllBooks();
}
}
创建Controller:
import com.example.demo.Domain.Book;
import com.example.demo.Service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BookController {
@Autowired
BookService bookService;
@GetMapping("/bookOps")
public void bookOps(){
Book book = new Book();
book.setName("西厢记");
book.setAuthor("王实甫");
int i = bookService.addBook(book);
System.out.println("addBook:"+i);
Book book1 = new Book();
book1.setName("朝花夕拾");
book1.setAuthor("鲁迅");
int updateBook = bookService.updateBook(book1);
System.out.println("updateBook:"+updateBook);
Book book2 = bookService.getBookById(1);
System.out.println("getBook:"+book2);
int delete = bookService.deleteBookById(2);
System.out.println("deleteBook:"+delete);
List<Book> allBooks = bookService.getAllBooks();
System.out.println("getAllBooks:"+allBooks);
}
}
访问路径:
http://localhost:8080/bookOps
控制台打印日志:
addBook:1
updateBook:0
getBook:Book(id=1, name=三国演义, author=罗贯中)
deleteBook:0
getAllBooks:[Book(id=1, name=三国演义, author=罗贯中), Book(id=3, name=西厢记, author=王实甫), Book(id=4, name=西厢记, author=王实甫), Book(id=5, name=西厢记, author=王实甫)]