开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.
作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.
简而言之,Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作
JdbcTemplate主要提供以下五类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法:update方法用于执行新增、修改、删除等语句;
- batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
今天记录查询返回三种类型:
- 查询后返回一个值
- 查询后返回一个对象
- 查询后返回一个集合
1、查询后返回一个值
例如:查询表中有多少条记录,返回一个int
代码间的具体逻辑见上篇博客
实体类Book:
package demo.entity;
public class Book {
private String userId;
private String username;
private String ustatus;
public String getUserId() {
return userId;
}
public String getUsername() {
return username;
}
public String getUstatus() {
return ustatus;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setUsername(String username) {
this.username = username;
}
public void setUstatus(String ustatus) {
this.ustatus = ustatus;
}
}
BookDao:
package demo.dao;
import demo.entity.Book;
public interface BookDao {
//添加
public void addBook(Book book);
//查询记录数量
int selectCount();
}
BookDaoImpl:
package demo.dao;
import demo.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 int selectCount() {
String sql = "select count(*) from t_book";
/*
第一个参数:sql
第二个参数:返回类型的class
*/
Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
return integer;
}
}
BookService:
package demo.service;
import demo.dao.BookDao;
import demo.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.addBook(book);
}
//查询表记录数
public int findCount(){
int count = bookDao.selectCount();
return count;
}
}
测试一下:
@Test
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
BookService bookService = context.getBean("bookService", BookService.class);
int count = bookService.findCount();
System.out.println(count);
}
运行结果:
数据库中确实只有一条记录:
2、查询后返回一个对象
与之前返回值的代码是一个思路,只不过返回类型不同,调用的queryForObject()方法中传的参数不同,这里就只放UserDaoImpl的代码了:
package demo.dao;
import demo.entity.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 selectBook(String id) {
String sql = "select * from t_book where user_id=? ";
/*
第一个参数:sql
第二个参数:RowMapper,是一个接口,返回不同类型的数据
使用该接口的实现类完成数据的封装
第三个参数:填充占位符的值
*/
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class),id);
return book;
}
}
测试时,传入id值为“1”,表示查询表中的第一条数据
测试结果:
3、查询后返回一个集合
例如:返回表中所有的记录
BookDaoImpl:
package demo.dao;
import demo.entity.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 t_book";
List<Book> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class));
return list;
}
}
调用的是query()方法,传的参数和上面基本相同
测试结果:
和数据库里的记录刚好对应: