Spring-jdbc的基本使用

使用说明

  • Spring-jdbc能帮助开发者在进行数据库数据交互的时候将注意力转移到SQL语句上来,关心核心业务;
  • Spring-jdbc将DML及DQL进行再次封装,使得数据库的交互变得更加简单高效,还能自动释放资源;
  • Spring-jdbc解决的是数据库交互问题,连接池不在其能力范围之内,需要从外面传入DataSource;

1、导包

2、准备一个DataSource

package com.yusian.pools;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class Utils {

    // DataSource
    private static DataSource ds;
    static {
        ClassLoader classLoader = Utils.class.getClassLoader();
        try {
            Properties pro = new Properties();
            pro.load(classLoader.getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取DataSource
     * @return DataSrouce
     */
    public static DataSource getDataSource() {
        return ds;
    }

    /**
     * 从连接池获取连接对象
     * @return 连接对象
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        if (ds == null) throw new SQLException("创建连接池失败!");
        return ds.getConnection();
    }

    /**
     * 释放查询类操作的所有资源
     * @param conn 连接对象,归还到连接池
     * @param stmt 查询对象
     * @param retSet 结果对象
     */
    public static void close(Connection conn, Statement stmt, ResultSet retSet) {
        releaseCloseableObject(retSet);
        releaseCloseableObject(stmt);
        releaseCloseableObject(conn);
    }

    /**
     * 释放更新类操作的所有资源
     * @param conn 连接对象
     * @param stmt 查询对象
     */
    public static void close(Connection conn, Statement stmt) {
        close(conn, stmt, null);
    }

    /**
     * 释放AutoCloseable对象资源
     * @param object 需要释放的对象
     */
    public static void releaseCloseableObject(AutoCloseable object) {
        if (object == null) return;
        try {
            object.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、基本使用

  1. 获取JdbcTemplate对象:
    JdbcTemplate template = new JdbcTemplate(Utils.getDataSource());
    
  2. 获取数据,支持各种数据结构类型
    // List
    List<Map<String, Object>> list = template.queryForList("select * from account");
    System.out.println(list);
    
    // Map
    Map<String, Object> map = template.queryForMap("select * from account where id = 1");
    System.out.println(map);
    
    // ResultSet
    SqlRowSet set = template.queryForRowSet("select * from account");
    System.out.println(set);
    
    // 自定义类型,实现RowMapper接口
    List<Account> accList = template.query("select * from account", (resultSet, i) -> {
       Account acc = new Account(resultSet);
       return acc;
    });
    System.out.println(accList);
    
    // Bean,BeanPropertyRowMapper是对RowMapper的一个实现,他能根据对象的属性及set方法自动将数据库中相同的字段赋值给对象属性
    List<Account> beanList = template.query("select * from account", new BeanPropertyRowMapper<>(Account.class));
    System.out.println(beanList);
    

Leave a Reply