JdbcTemplate的使用

本文详细介绍Spring框架中的JdbcTemplate,一种简化JDBC操作的工具。文章覆盖JdbcTemplate的基本使用,包括查询、更新、删除和增加数据的方法,以及如何通过依赖注入进行配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、简介

JDBC已经能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库资源如:获取PreparedStatement,设置SQL语句参数,关闭连接等步骤。

​ JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。

Spring源码地址:https://github.com/spring-projects/spring-framework

在JdbcTemplate中执行SQL语句的方法大致分为3类:

  • execute:可以执行所有SQL语句,一般用于执行DDL语句。
  • update:用于执行INSERT、UPDATE、DELETE等DML语句。
  • queryXxx:用于DQL数据查询语句。

2、具体使用

2.1、前提

  1. 添加依赖
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.6.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.5</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.10.RELEASE</version>
    </dependency>
</dependencies>
  1. applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">


    <!--包扫描-->
    <context:component-scan base-package="com.service"/>
    <context:component-scan base-package="com.dao"/>

    <!--引入配置文件-->
    <context:property-placeholder location="classpath*:db.properties"/>

    <!--c3p0数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--JdbcTemplate-->
    <bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--JdbcTemplate需要一个数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>

</beans>

在所有的的dao中注入JdbcTemplate

@Autowired
JdbcTemplate jdbcTemplate;

在所有的的service中注入dao

@Autowired
private BookDao bookDao;

在Test中注入service

public static BookService getBean(){
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    return context.getBean("bookServiceImpl", BookService.class);
}

2.2、查询

1、queryForLong返回一个long整数

API介绍

public long queryForLong(String sql)
执行查询语句,返回一个long类型的数据。

2、queryForInt返回一个int整数

API介绍

public int queryForInt(String sql)
执行查询语句,返回一个int类型的值。

3、queryForObject返回指定的数据类型

API介绍

public <T> T queryForObject(String sql, Class<T> requiredType)
执行查询语句,返回一个指定类型的数据。

具体实现

  1. BookDaoImpl.java
public Integer selectCounts() {
    return jdbcTemplate.queryForObject("select count(*) from ssmbuild.books", Integer.class);
}
  1. BookServiceImpl.java
public Integer selectCounts() {
    return bookDao.selectCounts();
}
  1. Test
@Test
public void selectCounts(){
    BookService bean = getBean();
    Integer integer = bean.selectCounts();
    System.out.println(integer);
}

4、queryForMap返回一个Map集合

API介绍

public Map<String, Object> queryForMap(String sql,@Nullable Object... args)
执行查询语句,将一条记录放到一个Map中。

具体实现

  1. BookDaoImpl.java
public Map selectById(Integer id) {
    return jdbcTemplate.queryForMap("select * from ssmbuild.books where bookid = ?",id);
}
  1. BookServiceImpl.java
public Map selectById(Integer id) {
    return bookDao.selectById(id);
}
  1. Test
@Test
public void  selectBookByID(){
    BookService bean = getBean();
    Map map = bean.selectById(2);
    System.out.println(map);
}

5、queryForList返回一个List集合

API介绍

public List<Map<String, Object>> queryForList(String sql)
执行查询语句,返回一个List集合,List中存放的是Map类型的数据。

具体实现

  1. BookDaoImpl.java
public List<Map<String, Object>> selectAll() {
    return jdbcTemplate.queryForList("select * from ssmbuild.books");
}
  1. BookServiceImpl.java
public List<Map<String, Object>> selectAll() {
    return bookDao.selectAll();
}
  1. Test
@Test
public void selectAll(){
    BookService bean = getBean();
    List<Map<String, Object>> list= bean.selectAll();
    for (Map<String, Object> map : list) {
        System.out.println(map);
    }
}

6、RowMapper返回自定义对象

API介绍

public <T> List<T> query(String sql, RowMapper<T> rowMapper)
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。

具体实现

  1. BookDaoImpl.java
public List<Book> selectAllTwo() {
    return jdbcTemplate.query("select * from ssmbuild.books", new RowMapper<Book>() {
        public Book mapRow(ResultSet resultSet, int i) throws SQLException {
            Book book = new Book();
            book.setBookId(resultSet.getInt("bookid"));
            book.setBookName(resultSet.getString("bookname"));
            book.setBookCounts(resultSet.getString("bookcounts"));
            book.setDetail(resultSet.getString("detail"));
            return book;
        }
    });
}

使用JdbcTemplate对象的query方法,并传入RowMapper匿名内部类

在匿名内部类中将结果集中的一行记录转成一个Product对象

  1. BookServiceImpl.java
public List<Book> selectAllTwo() {
    return bookDao.selectAllTwo();
}
  1. Test
@Test
public void selectAllTwo(){
    BookService bean = getBean();
    List<Book> books = bean.selectAllTwo();
    for (Book book : books) {
        System.out.println(book);
    }
}

7、BeanPropertyRowMapper返回自定义对象

API介绍

public <T> List<T> query(String sql, RowMapper<T> rowMapper)
执行查询语句,返回一个List集合,List中存放的是RowMapper指定类型的数据。
public class BeanPropertyRowMapper<T> implements RowMapper<T>
BeanPropertyRowMapper类实现了RowMapper接口

具体实现

  1. BookDaoImpl.java
public List<Book> selectAllThree() {
    return jdbcTemplate.query("select * from ssmbuild.books",new BeanPropertyRowMapper<Book>(Book.class));
}
  1. BookServiceImpl.java
public List<Book> selectAllThree() {
    return bookDao.selectAllThree();
}
  1. Test
@Test
public void selectAllThree(){
    BookService bean = getBean();
    List<Book> books = bean.selectAllThree();
    for (Book book : books) {
        System.out.println(book);
    }
}

2.3、删除

具体实现

  1. BookDaoImpl.java
public int deleteBookById(Integer id) {
    return jdbcTemplate.update("delete from ssmbuild.books where bookid = ?",id);
}
  1. BookServiceImpl.java
public int deleteBookById(Integer id) {
    return bookDao.deleteBookById(id);
}
  1. Test
@Test
public void deleteBookById(){
    BookService bean = getBean();
    int i = bean.deleteBookById(4);
    String message = i > 0?"删除成功":"删除失败";
    System.out.println(message);
}

2.4、更新

具体实现

  1. BookDaoImpl.java
public int updateBookById(Book book) {
    return jdbcTemplate.update("update ssmbuild.books set bookname = ? where bookid = ?",book.getBookName(),book.getBookId());
}
  1. BookServiceImpl.java
public int updateBookById(Book book) {
    return bookDao.updateBookById(book);
}
  1. Test
@Test
public void updateBookById(){
    BookService bean = getBean();
    Map map = bean.selectById(1);
    System.out.println("=========改之前=========");
    System.out.println(map);
    Book book = new Book();
    book.setBookName("嘿嘿嘿");
    book.setBookId(1);
    bean.updateBookById(book);
    Map map2 = bean.selectById(1);
    System.out.println("=========改之前=========");
    System.out.println(map2);
}

2.5、增加

具体实现

  1. BookDaoImpl.java
public int addBook(Book book) {
    return jdbcTemplate.update("insert into ssmbuild.books (bookname,bookcounts,detail) values (?,?,?)",book.getBookName(),book.getBookCounts(),book.getDetail());
}
  1. BookServiceImpl.java
public int addBook(Book book) {
    return bookDao.addBook(book);
}
  1. Test
@Test
public void addBook(){
    Book book = new Book();
    book.setBookName("html");
    book.setBookCounts("10");
    book.setDetail("很棒");
    int i = getBean().addBook(book);
    String message = i>0?"添加成功":"添加失败";
    System.out.println(message);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值