JdbcTemplate的使用实例

299 篇文章 5 订阅

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

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

使用示例:

在数据库中先准备两张表:

在java工程中创建两个对应类:

public class Department {
    int id;
    String deptName;
    @Override
    public String toString() {
        return "Department [id=" + id + ", deptName=" + deptName + "]";
    }
    
}
public class Employee {
    int id;
    String lastName;
    String email;
    Department department;
    @Override
    public String toString() {
        return "Employee [id=" + id + ", lastName=" + lastName + ", email="
                + email + ", department=" + department + "]";
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Department getDepartment() {
        return department;
    }
    public void setDepartment(Department department) {
        this.department = department;
    }
    
    
}


引入Spring框架相关的jar包以及c3p0和mysql连接jar包。为了对方法进行测试,这里还需要引入JUnit4.这里以导入外部属性文件的方式来配置数据源:
jdbc.properties文件内容如下:

user=root
password=123
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///spring

initPoolSize=5
maxPoolSize=10

在xml文件中,导入这个属性文件以及配置c3p0数据源:
    <!-- 导入资源文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    
    <!-- 配置 c3p0 数据源 -->
    <bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${user}"></property>    
        <property name="password" value="${password}"></property>    
        <property name="jdbcUrl" value="${jdbcUrl}"></property>    
        <property name="driverClass" value="${driverClass}"></property>    
        
        <property name="initialPoolSize" value="${initPoolSize}"></property>    
        <property name="maxPoolSize" value="${maxPoolSize}"></property>    
    </bean>

配置好dataSource后就可以用这个数据源来配置JdbcTemplate了,在xml文件中添加:
    <!-- 配置 spring 的 JdbcTemplate -->
    <bean id="jdbcTemplate"
        class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
接下来创建一个测试类对JdbcTemplate的方法进行测试:
import java.util.ArrayList;
import java.util.List;
 
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;
 
public class JDBCTest {
    
    private ApplicationContext ctx= null;
    private JdbcTemplate jdbcTemplate = null;
//    private EmployeeDao employee;
 
    {
        ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
    }
 
    /**
     * 执行 INSERT,UPDATE,DELETE
     */
    @Test
    public void testUpdate() {
        String sql = "UPDATE employees SET last_name = ? WHERE id = ?";
        jdbcTemplate.update(sql, "Jack", 5);
    }
    /**
     * 测试批量更新操作
     * 最后一个参数是 Object[] 的 List 类型:因为修改一条记录需要一个 Object 数组,修改多条记录就需要一个 List 来存放多个数组。
     */
    @Test
    public void testBatchUpdate() {
        String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";
        
        List<Object[]> batchArgs = new ArrayList<>();
        
        batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1});
        batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2});
        batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3});
        batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3});
        batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2});
        
        jdbcTemplate.batchUpdate(sql, batchArgs);
    }
    
    /**
     * 从数据库中获取一条记录,实际得到对应的一个对象
     * 注意:不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法!
     * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
     * 1、其中的 RowMapper 指定如何去映射结果集的行,常用的实现类为 BeanPropertyRowMapper
     * 2、使用 SQL中的列的别名完成列名和类的属性名的映射,例如 last_name lastName
     * 3、不支持级联属性。 JdbcTemplate 只能作为一个 JDBC 的小工具, 而不是 ORM 框架
     */
    @Test
    public void testQueryForObject() {
        String sql = "SELECT id, last_name lastName,email,dept_id as \"department.id\" FROM employees WHERE ID = ?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        //在将数据装入对象时需要调用set方法。
        Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);
        
        System.out.println(employee);
    }
    
    /**
     * 一次查询多个对象
     * 注意:调用的不是 queryForList 方法
     */
    @Test
    public void testQueryForList() {
        String sql = "SELECT id, last_name lastName, email FROM employees WHERE id > ?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        List<Employee> employees = jdbcTemplate.query(sql, rowMapper,5);
        
        System.out.println(employees);
    }
    /**
     * 获取单个列的值或做统计查询
     * 使用 queryForObject(String sql, Class<Long> requiredType) 
     */
    @Test
    public void testQueryForObject2() {
        String sql = "SELECT count(id) FROM employees";
        long count = jdbcTemplate.queryForObject(sql, Long.class);
        
        System.out.println(count);
    }    
}

在实际的使用中,一般会创建一个dao类来封装对某个对象的所有增删改查操作.
比如,创建一个EmployeeDao类如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
 
@Repository
public class EmployeeDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    public Employee get(Integer id) {
        String sql = "SELECT id, last_name lastName, email FROM employees WHERE id = ?";
        RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
        Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, id);
        
        return employee;
    }
}

在这个Dao类中实现了通过id来获取记录并封装成对象返回的方法。如果有需要还可以实现其他操作如插入、删除、更新等。
由于这里使用了注解来配置bean以及bean的自动装配,所以还需要在xml文件中添加(要先导入context命名空间):

<context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>
测试一下EmployeeDao:
    @Test
    public void testEmployeeDao() {
        EmployeeDao employeeDao = (EmployeeDao) ctx.getBean("employeeDao");
        Employee employee = employeeDao.get(1);
        System.out.println(employee);
    }

打印输出如下:


总结:JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错。但是功能还是不够强大(比如不支持级联属性),在实际应用中还需要和hibernate、mybaties等框架混合使用。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lm_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值