JdbcTemplate基本使用

1,228 阅读3分钟

一.介绍

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

JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。JdbcTemplate是Spring的一部分。JdbcTemplate处理了资源的建立和释放。他帮助我们避免一些常见的错误,比如忘了总要关闭连接。他运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果。 Spring源码地址:github.com/spring-proj… 在JdbcTemplate中执行SQL语句的方法大致分为3类:

execute:可以执行所有SQL语句,一般用于执行DDL语句。 update:用于执行INSERT、UPDATE、DELETE等DML语句。 queryXxx:用于DQL数据查询语句。 call方法:用于执行存储过程、函数相关语句。

二.集成

目的是把JdbcTemplate放入spring容器中管理

1.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-4.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
 
    <!-- 导入资源文件
        读取db.properties文件中的数据 -->
    <context:property-placeholder location="classpath:db.properties"/>
 
    <!-- 配置C3P0数据源 -->
    <bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
 
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>
 
    <!-- 配置Spring的jdbcTemplate 
        并注入一个dataSource数据源-->
    <bean id="jdbcTemplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>    
    </bean>
</beans>

2.springboot形式

springboot框架是自动装配

## yml:
spring:
  profiles: win
  application:
    name: cgfy-mybatis
  datasource:
    name: test
    # 数据源类型
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/cgfy_web?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
      username: root
      password: 123456
      # 初始化连接池大小
      initial-size: 0
      # 最大链接数
      max-active: 20
      # 最小链接间隔
      min-idle: 1
      # 最大等待时间,单位是毫秒
      max-wait: 60000
 
## pom:
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

3.注入

    @Autowired
    private JdbcTemplate jdbcTemplate;

三.增删改查等基本操作

@Component
public class JdbcTemplateDemo {
    @Autowired
    private static JdbcTemplate jdbcTemplate;
 
    public static void test() throws Exception {
        //使用execute-创建表的SQL语句
        String sql0 = "CREATE TABLE product("
                + "pid INT PRIMARY KEY AUTO_INCREMENT,"
                + "pname VARCHAR(20),"
                + "price DOUBLE"
                + ");";
        jdbcTemplate.execute(sql0);
 
        //添加数据
        String sql1 = "INSERT INTO product VALUES (NULL, ?, ?);";
        jdbcTemplate.update(sql1, "iPhone3GS", 3333);
        //修改数据
        String sql2 = "UPDATE product SET pname=?, price=? WHERE pid=?;";
        jdbcTemplate.update(sql2, "XVIII", 18888, 10);
        //删除数据
        String sql3 = "DELETE FROM product WHERE pid=?;";
        jdbcTemplate.update(sql3, 7);
        //查询数据-queryForObject返回String
        String sql4 = "SELECT pid FROM product WHERE price=18888;";
        String str = jdbcTemplate.queryForObject(sql4, String.class);
        //查询数据-queryForMap返回一个Map集合
        String sql5 = "SELECT * FROM product WHERE pid=?;";
        Map<String, Object> map = jdbcTemplate.queryForMap(sql5, 6);
        //查询数据-queryForList返回一个List集合
        String sql6 = "SELECT * FROM product WHERE pid<?;";
        List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql6, 8);
        /**
         * 查询数据-RowMapper返回自定义对象
         * 使用JdbcTemplate对象的query方法,并传入RowMapper匿名内部类
         * 在匿名内部类中将结果集中的一行记录转成一个Product对象
         */
        String sql7 = "SELECT * FROM product  WHERE pid=?;";
        List<Product> beanList1 = jdbcTemplate.query(sql7, new RowMapper<Product>() {
            @Override
            public Product mapRow(ResultSet arg0, int arg1) throws SQLException {
                Product p = new Product();
                p.setPid(arg0.getInt("pid"));
                p.setPname(arg0.getString("pname"));
                p.setPrice(arg0.getDouble("price"));
                return p;
            }
        },1);
 
 
        String sql8 = "SELECT * FROM product  WHERE pid=?;";
        Product queryForObject1 = jdbcTemplate.queryForObject(sql8, new RowMapper<Product>() {
            @Override
            public Product mapRow(ResultSet arg0, int arg1) throws SQLException {
                Product p = new Product();
                p.setPid(arg0.getInt("pid"));
                p.setPname(arg0.getString("pname"));
                p.setPrice(arg0.getDouble("price"));
                return p;
            }
        },1);
 
        /**
         * 查询数据-BeanPropertyRowMapper返回自定义对象
         * BeanPropertyRowMapper实现RowMapper接口
         */
 
        String sql9 = "SELECT * FROM product ;";
        List<Product> beanList2 = jdbcTemplate.query(sql9, new BeanPropertyRowMapper<>(Product.class));
        String sql10 = "select * from product where pid = ?";
        Product  queryForObject2 = jdbcTemplate.queryForObject(sql10, new BeanPropertyRowMapper<Product>(Product.class),5);
 
    }
 
    //使用RowMapper实现接口方式,覆盖mapRow方法
    public Product getById(Integer id) {
        String sql = "SELECT * FROM product WHERE pid = ?;";
        Product product =jdbcTemplate.queryForObject(sql, new Product(), new Object[] { id });
        return product;
    }
 
    public List findAll() {
        String sql = "SELECT * FROM product;";
        List products = jdbcTemplate.query(sql, new Product());
        return products;
    }
 
}

Product:

 
/**
 * title:
 * Description:使用RowMapper实现接口方式,覆盖mapRow方法
 * Author: Administrator
 * Date: 2021/5/20
 */
public class Product implements RowMapper<Product>  {
    private int pid;
    private String pname;
    private Double price;
 
    //使用RowMapper实现接口方式,覆盖mapRow方法,实现复用
    @Override
    public Product mapRow(ResultSet rs, int rowNum) throws SQLException {
        Product product = new Product();
        product.setPid(rs.getInt("id"));
        product.setPname(rs.getString("pname"));
        product.setPrice(rs.getDouble("price"));
        return product;
    }
 
 
 
 
    public int getPid() {
        return pid;
    }
 
    public void setPid(int pid) {
        this.pid = pid;
    }
 
    public String getPname() {
        return pname;
    }
 
    public void setPname(String pname) {
        this.pname = pname;
    }
 
    public Double getPrice() {
        return price;
    }
 
    public void setPrice(Double price) {
        this.price = price;
    }
}