从jdbc到spring-boot-starter-jdbc

jdbc 是什么

JDBC是一种用于执行SQL语句的API,可以为多种关系数据库提供统一访问,它是由一组用Java语言编写的类和接口。是Java访问数据库的标准规范。

JDBC是Java提供的一种标准规范,具体的实现由各个数据库厂商去实现。对开发者来说屏蔽了不同数据库之间的区别,可以使用相同的方式(Java API)去操作不同的数据库。两个设备之间要进行通信需要驱动,不同数据库厂商对JDBC的实现类就是去连接数据库的驱动。如mysql-connector-java连接mysql数据库的驱动。

使用JDBC连接数据库的步骤

  1. 注册驱动,这里的执行 就需要驱动jar包

    复制代码
    // mysql 数据库:"com.mysql.jdbc.Driver"
    Class.forName(driver);
  2. 建立数据库连接 Connection

    复制代码
    Connection conn=DriverManager.getConnection(url,userName,password);
  3. 创建Statement对象 用来执行SQL语句

    复制代码
    Statement statement =conn.createStatement();
  4. 执行SQL语句

    复制代码
    ResultSet rs =statement.executeQuery(sql);
  5. 处理结果

  6. 释放资源

数据库连接池

在使用JDBC进行数据库操作过程中,每次使用就要创建连接,同时使用完毕还必须得关闭连接,操作繁琐容易出错,并且Connection的取得和释放是代价比较高的操作。解决这个问题的方法就是连接池。连接池就是事先取得一定数量的Connection,程序执行处理的时候不是新建Connection,而是取得预先准备好的Connection。

DataSource

提供连接池机能的技术叫做DataSource。DataSource是JDK提供一个标准接口在javax.sql.DataSource包下。常见的DBCP、C3P0、druid等。

spring-boot-starter-jdbc

spring-boot-starter-jdbc主要提供了三个功能,第一个就是对数据源的装配,第二个就是提供一个JdbcTemplate简化使用,第三个就是事务

数据源相关使用

查看数据源和连接信息

复制代码
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootApplication
public class Application implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(Application.class);

    @Autowired
    DataSource dataSource;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }


    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>>>服务启动执行");
        showConnection();
    }

    private void showConnection() throws SQLException {
        logger.info("dataSource:{}", dataSource.getClass().getName());
        Connection connection = dataSource.getConnection();
        logger.info("connection:{}", connection.toString());
    }
}

当前的pom文件中仅仅配置了spring-boot-starter-jdbc和mysql数据库驱动

复制代码
   <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        
    </dependencies>

Springboot支持的数据源

DataSourceAutoConfiguration类的内部类PooledDataSourceConfiguration标识了默认支持的数据源。

复制代码
   @Configuration
    @Conditional({DataSourceAutoConfiguration.PooledDataSourceCondition.class})
    @ConditionalOnMissingBean({DataSource.class, XADataSource.class})
    @Import({Hikari.class, Tomcat.class, Dbcp2.class, Generic.class, DataSourceJmxConfiguration.class})
    protected static class PooledDataSourceConfiguration {
        protected PooledDataSourceConfiguration() {
        }
    }

默认支持Hikari、Tomcat、Dbcp2、Generic、DataSourceJmxConfiguration这五种数据源。从上面的数据源和连接信息的打印可以知道默认情况下Springboot装配的是Hikari数据源。

使用druid数据源

对于Springboot默认支持的五种数据源,可以通过上面两种方式(一、排除默认数据源,添加使用的数据源;二、添加使用的数据源,使用配置文件指定使用的数据源) 进行选择使用数据源。如果是其他开源的数据源呢?比如阿里的druid数据源。有两种方式。

第一种

复制代码
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.23</version>
   </dependency

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/readinglist?characterEncoding=utf8&useSSL=false
    username: root
    password: 12345678
    type: com.alibaba.druid.pool.DruidDataSource
  1. 添加druid数据源依赖
  2. 在application.yml文件中指定数据源为com.alibaba.druid.pool.DruidDataSource

第二种

复制代码
import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

@SpringBootApplication
public class Application implements CommandLineRunner {

    Logger logger = LoggerFactory.getLogger(Application.class);

    @Autowired
    DataSource dataSource;



    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);

    }


    @Override
    public void run(String... args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>>>服务启动执行");
        showConnection();
    }

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/readinglist?characterEncoding=utf8&useSSL=false");
        dataSource.setUsername("root");
        dataSource.setPassword("12345678");
        return dataSource;
    }


    private void showConnection() throws SQLException {
        logger.info("dataSource:{}", dataSource.getClass().getName());
        Connection connection = dataSource.getConnection();
        logger.info("connection:{}", connection.toString());
    }

}
  1. 添加druid依赖
  2. 创建DataSource的bean,进行相关配置后,返回DruidDataSource

JdbcTemplate相关使用

JdbcTemplate 是什么

Spring对数据库的操作在jdbc上面做了深层次的封装。使用Spring的注入功能,可以把DataSource注册到JdbcTemplate之中。

JdbcTemplate主要提供了一下五类方法

  1. execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句
  2. update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句
  3. query方法及queryForXXX方法:用于执行查询相关语句
  4. call方法:用于执行存储过程、函数相关语句

事务的相关使用

Springboot中在需要使用事务的方法上面添加@Transactional,需要注意的是,默认只会对运行时异常进行事务回滚,非运行时异常不会回滚事务。

Controller层定义了两个接口

复制代码
@Service
public class DataOpeServiceImpl implements DataOpeService {

    private Logger logger = LoggerFactory.getLogger(DataOpeServiceImpl.class);

    @Autowired
    private JdbcTemplate template;


    @Override
    public String queryData() {
        String sql = "select * from t where id=1";
        RowMapper<T> data = new BeanPropertyRowMapper<>(T.class);
        T t = template.queryForObject(sql, data);
        return t.toString();
    }

    @Override
    public String addData() {
        List<T> data = new ArrayList<>();
        for (int i = 0; i < 2; i++) {
            T item = new T();
            item.setA(i);
            item.setB(i);
            data.add(item);
        }
        for (int i = 0; i < data.size(); i++) {
            String sql = "insert into t(a,b) values (" + data.get(i).getA() + "," + data.get(i).getB() + ")";
            logger.info("sql:{}", sql);
            template.execute(sql);
        }
        return null;
    }
}
相关推荐
float_六七1 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天2 小时前
JAVA stream().flatMap()
java·windows
颜如玉3 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂4 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年4 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152875 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草5 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6925 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea5 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha5 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统