Spring学习(十):JdbcTemplate操作数据库实现查询功能

228 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架.

作为 SpringJDBC 框架的核心, JDBC 模板的设计目的是为不同类型的JDBC操作提供模板方法. 每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务.通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低.

简而言之,Spring框架对JDBC进行封装,使用JdbcTemplate方便实现对数据库操作

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法:update方法用于执行新增、修改、删除等语句;
  • batchUpdate方法:batchUpdate方法用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • call方法:用于执行存储过程、函数相关语句。

今天记录查询返回三种类型:

  1. 查询后返回一个值
  2. 查询后返回一个对象
  3. 查询后返回一个集合

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()方法,传的参数和上面基本相同

测试结果:

和数据库里的记录刚好对应: