JdbcTemplate是Spring提供的一套JDBC模板框架,利用AOP技术来解决直接使用JDBC时大量重复代码的问题。JdbcTemplate虽然没有MyBatis那么灵活,但是比直接使用JDBC要方便很多。
Spring Boot中对JdbcTemplate的使用提供了自动化配置类JdbcTemplateAutoConfiguration,当classpath下存在DataSource和JdbcTemplate并且DataSource只有一个实例时,自动配置才会生效,若开发者没有提供JdbcOperations,则Spring Boot会自动向容器中注入一个JdbcTemplate(JdbcTemplate是JdbcOperations的子类)。由此可以看到,开发者想要使用JdbcTemplate,只需要提供JdbcTemplate的依赖和DataSource依赖即可。
具体操作步骤如下。
创建数据库和表
在数据库中创建表,代码如下:
create table z_book(
id int not null auto_increment,
name varchar(128),
author varchar(64),
primary key(id)
) comment '图书'
insert into z_book values (null,'图书名','作者');
创建项目
创建Spring Boot项目,添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
spring-boot-starter-jdbc中提供了spring-jdbc,另外还加入了数据库驱动依赖和数据库连接池依赖。
数据库配置
在application.properties中配置数据库基本连接信息:
server.port=8099
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=mysql123
创建实体类
创建Book实体类,代码如下:
Book.java
package com.shrimpking.pojo;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 15:27
*/
public class Book
{
private int id;
private String name;
private String author;
public Book()
{
}
public Book(String name, String author)
{
this.name = name;
this.author = author;
}
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 String getAuthor()
{
return author;
}
public void setAuthor(String author)
{
this.author = author;
}
@Override
public String toString()
{
return "Book{" + "id=" + id + ", name='" + name + '\'' + ", author='" + author + '\'' + '}';
}
}
创建数据库访问层
创建BookDao,代码如下:
package com.shrimpking.dao;
import com.shrimpking.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;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 15:29
*/
@Repository
public class BookDao
{
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 增加
* @param book
* @return
*/
public int addBook(Book book)
{
String sql = "insert into z_book(name,author) values(?,?)";
return jdbcTemplate.update(sql,book.getName(), book.getAuthor());
}
/**
* 修改
* @param book
* @return
*/
public int updateBook(Book book)
{
String sql = "update z_book set name=?,author=? where id=?";
return jdbcTemplate.update(sql,book.getName(),book.getAuthor(),book.getId());
}
/**
* 删除
* @param id
* @return
*/
public int deleteBookById(int id)
{
String sql = "delete from z_book where id=?";
return jdbcTemplate.update(sql,id);
}
/**
* 根据id查询
* @param id
* @return
*/
public Book getBookById(int id)
{
String sql = "select id,name,author from z_book where id=?";
return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Book.class),id);
}
/**
* 查询全部
* @return
*/
public List<Book> getAllBooks()
{
String sql = "select id,name,author from z_book";
return jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Book.class));
}
}
代码解释:
• 创建BookDao,注入JdbcTemplate。由于已经添加了spring-jdbc相关的依赖,JdbcTemplate会被自动注册到Spring容器中,因此这里可以直接注入JdbcTemplate使用。
• 在JdbcTemplate中,增删改三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法主要用来完成查询功能。另外,还有execute方法可以用来执行任意的SQL、call方法用来调用存储过程等。
• 在执行查询操作时,需要有一个RowMapper将查询出来的列和实体类中的属性一一对应起来。如果列名和属性名都是相同的,那么可以直接使用BeanPropertyRowMapper;如果列名和属性名不同,就需要开发者自己实现RowMapper接口,将列和实体类属性一一对应起来。
创建Service和Controller
创建BookService和BookController,代码如下:
BookService.java
package com.shrimpking.service;
import com.shrimpking.dao.BookDao;
import com.shrimpking.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 15:43
*/
@Service
public class BookService
{
@Autowired
private BookDao bookDao;
/**
* 增加
* @param book
* @return
*/
public int addBook(Book book)
{
return bookDao.addBook(book);
}
/**
* 修改
* @param book
* @return
*/
public int updateBook(Book book)
{
return bookDao.updateBook(book);
}
/**
* 删除
* @param id
* @return
*/
public int deleteBook(int id)
{
return bookDao.deleteBookById(id);
}
/**
* 根据id查询
* @param id
* @return
*/
public Book getBookById(int id)
{
return bookDao.getBookById(id);
}
/**
* 查询全部
* @return
*/
public List<Book> getAllBooks()
{
return bookDao.getAllBooks();
}
}
BookController.java
package com.shrimpking.controller;
import com.shrimpking.pojo.Book;
import com.shrimpking.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;
/**
* Created by IntelliJ IDEA.
*
* @Author : Shrimpking
* @create 2023/6/5 15:48
*/
@RestController
public class BookController
{
@Autowired
private BookService bookService;
@GetMapping("/books")
public void bookOperation()
{
//增加
Book b1 = new Book("高中语文","人教版");
int i = bookService.addBook(b1);
System.out.println("addBook>>>" + i);
//修改
Book b2 = new Book();
b2.setId(1);
b2.setName("大学语文");
b2.setAuthor("高教社");
int i2 = bookService.updateBook(b2);
System.out.println("updateBook>>>" + i2);
//查询一个
Book oneBook = bookService.getBookById(1);
System.out.println("getBookById>>>" + oneBook.toString());
//删除
int i3 = bookService.deleteBook(1);
System.out.println("deleteBook>>>" + i3);
//查询全部
List<Book> allBooks = bookService.getAllBooks();
for (Book book : allBooks)
{
System.out.println(book);
}
}
}