使用spring JdbcTemplate持久化数据

原始jdbc开发操作数据库需写大量样板代码,使用Spring的JdbcTemplate可改善这一情况,让程序员专注业务。文中对比了传统jdbc和JdbcTemplate的代码量,并介绍了使用JdbcTemplate的步骤,包括配置数据源和注入数据源等,还说明了相关方法的参数。

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

在原始的jdbc开发中,如果想对数据库进行操作,会写大量的样板代码,比如获取连接、释放资源等,使用spring的JdbcTemplate将可以改善这种情况,让程序员只关注具体的业务,对比一下使用传统jdbc和JdbcTemplate的代码量:

传统jdbc:

package com.llg.dao.test;

import com.llg.bean.Student;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestJdbc {

    public void addStudent(Student student){
        Connection conn = null;
        PreparedStatement statement = null;
        try {
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql:///test", "root", "admin");
            String sql = "insert into t_student values(null,?,?)";
            statement = conn.prepareStatement(sql);
            statement.setString(1,student.getName());
            statement.setInt(2,student.getAge());
            statement.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(statement != null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

JdbcTemplate:

package com.llg.dao.impl;

import com.llg.bean.Student;
import com.llg.dao.StudentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.stereotype.Repository;


@Repository
public class StudentDaoImpl implements StudentDao {
    private static final String ADD_STUDENT = "insert into t_student values(null,?,?)";
  
    @Autowired
    private JdbcOperations jdbcOperations;

    @Override
    public void addStudent(Student student) {
        jdbcOperations.update(ADD_STUDENT, student.getName(), student.getAge());
    }
}

如何使用spring JdbcTemplate

maven依赖:

 <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.5.RELEASE</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
  </dependencies>

第一步:配置数据源

<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql:///test"/>
    <property name="username" value="root"/>
    <property name="password" value="admin"/>
</bean>

我使用的阿里的Druid连接池,其他方案同理

第二步:配置JdbcTemplate,并注入数据源

<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

就这么简单,使用如下:

package com.llg.dao.impl;

import com.llg.bean.Student;
import com.llg.dao.StudentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import java.sql.ResultSet;
import java.sql.SQLException;

@Repository
public class StudentDaoImpl implements StudentDao {
    private static final String ADD_STUDENT = "insert into t_student values(null,?,?)";
    private static final String DELETE_STUDENT = "delete from t_student where id = ?";
    private static final String UPDATE_STUDENT = "update t_student set name = ? , age = ? where id = ?";
    private static final String GET_BY_ID = "select * from t_student where id = ?";


    //注入JdbcTemplate
    @Autowired
    private JdbcOperations jdbcOperations;

    //增
    @Override
    public void addStudent(Student student) {
        jdbcOperations.update(ADD_STUDENT, student.getName(), student.getAge());
    }

    //查
    @Override
    public Student getStudentById(Integer id) {
        Student student = jdbcOperations.queryForObject(GET_BY_ID, new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student s = new Student();
                s.setId(resultSet.getInt("id"));
                s.setName(resultSet.getString("name"));
                s.setAge(resultSet.getInt("age"));
                return s;
            }
        },id);
        return student;
    }

    //改
    @Override
    public void updateStudent(Student student) {
        jdbcOperations.update(UPDATE_STUDENT,student.getName(),student.getAge(),student.getId());
    }

    //删
    @Override
    public void deleteStudent(Integer id) {
        jdbcOperations.update(DELETE_STUDENT,id);
    }

}

JdbcTemplate是JdbcOperations的实现类。

getStudentById()方法调用了jdbcOperations的queryForObject()方法,该方法有三个参数:

参数一:sql

参数二:一个RowMapper实例,RowMapper接口只有mapRow()一个方法,该方法有两个参数:ResultSet和当前遍历的索引

参数三:可变参数列表,用于填充sql占位符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值