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

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

sql 语句和参数更新数据库:

Spring 使用JdbcTemplate_mysql

批量更新数据库:

Spring 使用JdbcTemplate_java_02

查询单行:

Spring 使用JdbcTemplate_sql_03

便利的 BeanPropertyRowMapper 实现

Spring 使用JdbcTemplate_sql_04

查询多行:

Spring 使用JdbcTemplate_xml_05

单值查询:

Spring 使用JdbcTemplate_java_06

每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下.

JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个实例, 并将这个实例注入到所有的 DAO 实例中.

JdbcTemplate 也利用了 Java 1.5 的特定(自动装箱, 泛型, 可变长度等)来简化开发

Spring JDBC 框架还提供了一个 JdbcDaoSupport 类来简化 DAO 实现. 该类声明了 jdbcTemplate 属性, 它可以从 IOC 容器中注入, 或者自动从数据源中创建.

db.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306
jdbc.username=hern
jdbc.password=

jdbc.initPoolSize = 5
jdbc.maxPoolSize=10

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"
       xmlns:list="http://www.springframework.org/schema/util"
       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:property-placeholder location="classpath:com/db/pro/db.properties"></context:property-placeholder>

    <!--配置c3p0数据源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="driverClass" value="${jdbc.driver}"></property>
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>

    <!--配置Spring的JDBCTemplate-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>


</beans>

Java文件

package com.com.spring.jdbc;

import com.com.spring.user.UserInfo;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class JDBCTest {
    private ApplicationContext applicationContext = null;

    private JdbcTemplate jdbcTemplate;

    {
        applicationContext = new ClassPathXmlApplicationContext("com/com/spring/config/spring-db.xml");
        jdbcTemplate = (JdbcTemplate) applicationContext.getBean("jdbcTemplate");
    }

    /*
    * 批量插入
    * */
    @Test
    public void testBasicUpdate(){
        String sql = "INSERT INTO users(NAME,age,names) VALUES(?,?,?)";

        List<Object[]> info = new ArrayList<>();
        info.add(new Object[]{"111",1,"1"});
        info.add(new Object[]{"222",2,"2"});
        info.add(new Object[]{"333",3,"3"});
        info.add(new Object[]{"444",4,"4"});
        info.add(new Object[]{"555",5,"5"});
        info.add(new Object[]{"666",6,"6"});

        jdbcTemplate.batchUpdate(sql,info);
    }

    /*
    * 更新一条信息
    * */
    @Test
    public void testUpdate(){

        String name = "songzhaoheng";
        int age = 22;
        String names = "宋兆恒";
        String sql = "UPDATE users SET NAME = ?, age = ? WHERE id = ? ";
        jdbcTemplate.update(sql,name,age,1);
    }

    /*
    * 查询指定的一条信息
    * */
    @Test
    public void testQuery(){
        String sql = "SELECT NAME, age names from users where id = ?";
        RowMapper<UserInfo> rowMapper = new BeanPropertyRowMapper<>(UserInfo.class);
        UserInfo userInfo = jdbcTemplate.queryForObject(sql,rowMapper,1);

        System.out.println(userInfo);
    }

    /*
    * 查询指定的多条信息
    * */
    @Test
    public void testQueryList(){
        String sql = "select NAME , age, names from users where age > ?";
        RowMapper<UserInfo> rowMapper  = new BeanPropertyRowMapper<>(UserInfo.class);
        List<UserInfo> list = jdbcTemplate.query(sql,rowMapper,20);
        for (Object object : list){
            System.out.println(object);
        }
    }


    /*
    * 统计查询
    * */
    @Test
    public void testQueryForObject(){
        String sql = "select count (id) from users";
        long id = jdbcTemplate.queryForObject(sql,Long.class);
        System.out.println(id);
    }

    @org.junit.Test
    public void testDatasource() throws SQLException {
        DataSource dataSource = applicationContext.getBean(DataSource.class);
        System.out.println(dataSource.getConnection());
    }
}