JDBC核心技术3

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC核心技术3

第8章:数据库连接池

8.1JDBC数据库连接池的必要性

在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:

在主程序(如servlet, beans)中建立数据库连接

进行sq|操作

断开数据库连接
这种模式开发,存在的问题:

普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求 一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严 重的甚至会造成服务器的崩溃

对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统 中的内存泄漏,最终将导致重启数据库。(回忆:何为Java的内存泄漏?)

这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内 存泄漏,服务器崩溃

8.2数据库连接池技术

  • 为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。
  • 数据库连接池的基本思想:就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
    数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池清求的连接数超过最大连接数星时,这些请求将被加入到等待队列中。



  • 工作原理


    数据库连接池技术的状点

1.资源重用

由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。
2.要快的系练反应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间
3.新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库 连接数的限制,避免某一应用独占所有的数据库资源
4.统一的连接管理,避免数据库连接泄漏

在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据 库连接操作中可能出现的资源泄露

8.3多种开源的数据库连接池

  • JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由服务器 (Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:
    DBCP是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持
    C3P0是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以。hibernate官方推荐使用
  • Proxool是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点BoneCP是一个开源组织提供的数据库连接池,速度快
  • Druid是阿里提供的数据库连接池,据说是集DBCP、C3P0、Proxool优点于一身的数据库连接池,但 是速度不确定是否有BoneCP快
    DataSource通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把DataSource称为连 接池

DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速 度。

特别注意:

数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源。

8.3.1 C3P0 数据库连接池

相关文章:【JDBC】使用c3p0数据库连接池的各种报错警告

https://blog.csdn.net/weixin_39928544/article/details/113356499
jar包及其官网下载

mysql-connector-java-8.0.20.jar

https://downloads.mysql.com/archives/c-j/

c3p0-0.9.5.5.jar

https://sourceforge.net/

相关文章

mchange-commons-java-0.2.19.jar

在c3p0的lib目录下

配置文件 c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <named-config name="helloc3p0"> 
    <!-- 提供获取连接的四个基本信息 -->
    <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <!-- 进行数据库连接管理的基本信息 -->
    <!-- 当数据库连接池中的连接数不够时,c3p0一次性向数据库服务器申请的连接数 -->
    <property name="acquireIncrement">5</property>
    <!-- c3p0数据库连接池中初始化的连接数 -->
    <property name="initialPoolSize">10</property>
    <!-- c3p0数据库连接池维护的最少连接数 -->
    <property name="minPoolSize">10</property>
    <!-- c3p0数据库连接池维护的最多连接数 -->
    <property name="maxPoolSize">100</property>
    <!-- c3p0数据库连接池最多维护的Statement的个数 -->
    <property name="maxStatements">50</property> 
    <!-- 每个连接中可以最多使用的Statement的个数 -->
    <property name="maxStatementsPerConnection">2</property>
  </named-config>
</c3p0-config>

测试代码 C3P0Test.java

package com._4.connection;
import java.sql.Connection;
import org.junit.Test;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
public class C3P0Test {
  //方式一:
  @Test
  public void testGetConnection() throws Exception {
    //获取c3p0数据库连接池
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setDriverClass( "com.mysql.cj.jdbc.Driver" );         
    cpds.setJdbcUrl( "jdbc:mysql://localhost:3306/test?useSSL=false&amp;serverTimezone=UTC" );
    cpds.setUser("root");                                  
    cpds.setPassword("root");          
    //通过设置相关的参数,对数据库连接池进行管理:
    //设置初始时数据库连接池的连接数
    cpds.setInitialPoolSize(10);
    Connection conn = cpds.getConnection();
    System.out.println(conn);
    DataSources.destroy(cpds);
  }
  //方式二:使用配置文件
  @Test
  public void testGetConnection1() throws Exception {
    ComboPooledDataSource cpds =new ComboPooledDataSource("helloc3p0");
    Connection conn = cpds.getConnection();
    System.out.println(conn);
  }
}

8.3.2 DBCP数据库连接池

相关文章:Mysql 8.0 创建DBCP连接池

https://blog.csdn.net/weixin_39858881/article/details/85775502

jar包及其官网下载

mysql-connector-java-8.0.20.jar

commons-collections4-4.4.jar
https://commons.apache.org/proper/commons-collections/download_collections.cgi

commons-dbcp2-2.8.0.jar

https://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

commons-logging-1.2.jar

https://commons.apache.org/proper/commons-logging/download_logging.cgi

commons-pool2-2.10.0.jar

https://commons.apache.org/proper/commons-pool/download_pool.cgi


配置文件 dbcp.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf8;useSSL=false;serverTimezone=UTC;allowPublicKeyRetrieval=true
defaultAutoCommit=true
defaultTransactionIsolation=REPEATABLE_READ

测试代码 DBCPTest.java

package com._4.connection;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.junit.Test;
/**
 * 
 * @Description 测试DBCP的数据库连接池技术
 * @author jishuo Email:3063494684@qq.com
 * @version
 * @date 2021年8月2日下午5:37:01
 */
public class DBCPTest {
  //方式一:不推荐
  @Test
  public void testGetConnection() throws Exception {
    //创建了DBCP的数据库连接池
    BasicDataSource source=new BasicDataSource();
    //设置基本信息
    source.setDriverClassName("com.mysql.jc.jdbc.Driver");
    source.setUrl("jdbc:mysql://localhost:3306/test");
    source.setUsername("root");
    source.setPassword("root");
    //还可以设置其他涉及数据库连建池管理的相关属性
    source.setInitialSize(10);
//    source.setMaxActive(10);
    Connection conn = source.getConnection();
    System.out.println(conn);
  }
  //方式二:推荐:使用配置文件
  @Test
  public void testGetConnection1() throws Exception {
    Properties pros = new Properties();
    //方式1:
//    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
    //方式2:
    FileInputStream is=new FileInputStream(new File("src/dbcp.properties"));
    pros.load(is);
    BasicDataSource source = BasicDataSourceFactory.createDataSource(pros);
    Connection conn = source.getConnection();
    System.out.println(conn);
  }
}

8.3.3 Druid(德鲁伊)数据库连接池

相关文章:Druid连接池连接mysql8.0的druid.properties配置文件和Druid工具类Utils参考代码

https://blog.csdn.net/qq_45771848/article/details/113800808

jar包及其官网下载

mysql-connector-java-8.0.20.jar

druid-1.2.6.jar

http://druid.apache.org/downloads.html

配置文件 druid.properties

username=root
password=root
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&useUnicode=yes
initialSize=10
maxActive=50
maxWait=3000

测试代码 DruidTest.java

package com._4.connection;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
import javax.sql.DataSource;
import org.junit.Test;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DruidTest {
  @Test
  public void getConnection() throws Exception {
    Properties pros=new Properties();
    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
    pros.load(is);
    DataSource source = DruidDataSourceFactory.createDataSource(pros);
    Connection conn = source.getConnection();
    System.out.println(conn);
  }
}

更新工具类 JDBCUtils.java

package com._4.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.commons.dbutils.DbUtils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
  /**
   * 
   * @Description 获取数据库连接
   * @author jishuo 
   * @date 2021年7月28日下午2:19:29
   * @param 
   * @return
   */
  public static Connection getConnection()throws Exception {
    //1.读取配置文件的4个基本信息
    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
    Properties pros=new Properties();
    pros.load(is);
    String user = pros.getProperty("user");
    String password = pros.getProperty("password");
    String url = pros.getProperty("url");
    String driverClass = pros.getProperty("driverClass");
    //2.加载驱动
    Class.forName(driverClass);
    //3.获取连接
    Connection conn = DriverManager.getConnection(url, user, password);
    return conn;
  }
  /**
   * 
   * @Description 使用C3P0的数据库连接池技术
   * @author jishuo 
   * @date 2021年8月2日下午5:13:27
   * @param 
   * @return
   */
  //数据库连接池只需提供一个即可
  private static ComboPooledDataSource cpds =new ComboPooledDataSource("helloc3p0");
  public static Connection getConnection1() throws Exception {
    Connection conn = cpds.getConnection();
    return conn;
  }
  /**
   * 
   * @Description 使用DBCP的数据库连接池技术获取数据库连接
   * @author jishuo 
   * @date 2021年8月2日下午6:05:26
   * @param 
   * @return
   */
  private static DataSource source;
  static{
    try {
      Properties pros = new Properties();
      FileInputStream is=new FileInputStream(new File("src/dbcp.properties"));
      pros.load(is);
      //创建DBCP连接池
      source =  BasicDataSourceFactory.createDataSource(pros);
    } catch (Exception e) {
      e.printStackTrace();
    }   
  }
  public static Connection getConnection2() throws Exception {
    Connection conn = source.getConnection();
    return conn;
  }
  /**
   * 使用Druid数据库连接池技术
   */
  private static DataSource source1;
  static{
    try {
      Properties pros=new Properties();
      InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
      pros.load(is);
      source1 = DruidDataSourceFactory.createDataSource(pros);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static Connection getConnection3() throws Exception {
    Connection conn = source1.getConnection();
    return conn;
  }
  /**
   * 
   * @Description 关闭连接和Statement的操作
   * @author jishuo 
   * @date 2021年7月28日下午2:23:42
   * @param 
   * @return
   */
  public static void closeResource(Connection conn,Statement ps) {
    try {
      if (ps!=null) {
        ps.close();                 
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if (conn!=null) {
        conn.close();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
  /**
   * 
   * @Description 关闭资源的操作
   * @author jishuo 
   * @date 2021年7月28日下午3:30:37
   * @param 
   * @return
   */
  public static void closeResource(Connection conn,Statement ps,ResultSet rs) {
    try {
      if (ps!=null) {
        ps.close();                 
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if (conn!=null) {
        conn.close();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    try {
      if (rs!=null) {
        rs.close();
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

测试工具类 UtilTest.java

package com._4.utilTest;
import java.sql.Connection;
import org.junit.Test;
import com._2.bean.Customer;
import com._3.dao.CustomerDAOImpl;
import com._4.util.JDBCUtils;
public class UtilTest {
  private CustomerDAOImpl dao= new CustomerDAOImpl();
  @Test
  public void testGetCustomerById() {
    Connection conn=null;
    try {
      conn = JDBCUtils.getConnection3();//改变方法名
      Customer cust = dao.getCustomerById(conn, 2);
      System.out.println(cust);
    } catch (Exception e) {     
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
}

第9章:Apache-DBUtils实现CRUD操作

jar包及其官网下载

https://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

9.1Apache-DBUtils简介

  • comlmons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对DBC的简单封装,学习成本极 低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
  • API介绍:
  • org.apache.commons.dbutils.QueryRunner
  • org.apache.commons.dbutils.ResultSetHandler
  • 工具类:0rg.apache.commons.dbutils.DbUtils
  • API包说明:略

9.2 注意API的使用

9.2.1 DbUtils

9.2.2 QueryRunner

9.2.3 ResultSetHandler接口及其实现类

QueryRunnerTest.java

package com._5.dbutils;
/*
 * commons-dbutils 是Apache 组织提供的一个开源JDBC工具类库,封装了针对于数据库的增删改查操作
 */
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import javax.xml.crypto.Data;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import com._2.bean.Customer;
import com._4.util.JDBCUtils;
public class QueryRunnerTest {
  //测试插入
  @Test
  public void testInsert()  {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="insert into customers(name,email,birth)values(?,?,?)";
      int insertCount = runner.update(conn,sql,"蔡徐坤","caixukun@126.com","1997-09-08");
      System.out.println("添加了"+insertCount+"条记录");
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  //测试查询
  /*
   * BeanHander:是ResultSetHandler接口的实现类,用于封装表中的一条记录
   */
  @Test
  public void testQuery1()  {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select id,name,email,birth from customers where id = ?";
      BeanHandler<Customer> handler =new BeanHandler<>(Customer.class);
      Customer customer = runner.query(conn, sql, handler, 10);
      System.out.println(customer);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * BeanListHander:是ResultSetHandler接口的实现类,用于封装表中的多条记录的集合
   */
  @Test
  public void testQuery2() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select id,name,email,birth from customers where id < ?";
      BeanListHandler<Customer> handler =new BeanListHandler<>(Customer.class);
      List<Customer> list = runner.query(conn, sql, handler, 10);
      list.forEach(System.out::println);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * MapHander:是ResultSetHandler接口的实现类,对应表中的一条记录
   * 将字段及相应字段的值作为map中的key和value
   */
  @Test
  public void testQuery3() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select id,name,email,birth from customers where id = ?";
      MapHandler handler =new MapHandler();
      Map<String, Object> map = runner.query(conn, sql, handler, 10);
      System.out.println(map);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * MapListHander:是ResultSetHandler接口的实现类,对应表中的多条记录。
   * 将字段及相应字段的值作为map中的key和value。将这些map添加到list中。
   */
  @Test
  public void testQuery4() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select id,name,email,birth from customers where id < ?";
      MapListHandler handler =new MapListHandler();
      List<Map<String, Object>> list = runner.query(conn, sql, handler, 10);
      list.forEach(System.out::println);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * ScalarHandler : 用于查询特殊值
   */
  @Test
  public void testQuery5() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select count(*) from customers ";
      ScalarHandler handler = new ScalarHandler();
      Long count =(Long) runner.query(conn, sql, handler);
      System.out.println(count);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  @Test
  public void testQuery6() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select max(birth) from customers ";
      ScalarHandler handler = new ScalarHandler();
      Date maxBirth=(Date) runner.query(conn, sql, handler);
      System.out.println(maxBirth);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * 自定义ResultSetHandler的实现类
   */
  @Test
  public void testQuery7() {
    Connection conn=null;
    try {
      QueryRunner runner = new QueryRunner();
      conn = JDBCUtils.getConnection1();
      String sql="select id,name,email,birth from customers where id = ? ";
      ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>() {
        @Override
        public Customer handle(ResultSet rs) throws SQLException {
//          System.out.println("handler");
//          return null;
//          return new Customer(12,"成龙","Jack@126.com",new Date(23154649831L));
          if (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String email = rs.getString("email");
            Date birth = rs.getDate("birth");
            Customer customer = new Customer(id, name, email, birth);
            return customer;
          }
          return null;
        }
      };
      Customer customer = runner.query(conn, sql, handler,10);
      System.out.println(customer);
    } catch (Exception e) {
      e.printStackTrace();
    }finally {
      JDBCUtils.closeResource(conn, null);
    }
  }
  /*
   * DAO 改进
   */
}

JDBCUtil.Java

/**
   * 
   * @Description 使用dbutils.jar中提供的DbUtils工具类,实现资源关闭
   * @author jishuo 
   * @date 2021年8月3日下午2:08:59
   * @param 
   * @return
   */
  public static void closeResource1(Connection conn,Statement ps,ResultSet rs) {
//    try {
//      DbUtils.close(conn);
//    } catch (SQLException e) {
//      
//      e.printStackTrace();
//    }
//    try {
//      DbUtils.close(ps);
//    } catch (SQLException e) {
//      
//      e.printStackTrace();
//    }
//    try {
//      DbUtils.close(rs);
//    } catch (SQLException e) {
//      
//      e.printStackTrace();
//    }
    DbUtils.closeQuietly(conn);
    DbUtils.closeQuietly(ps);
    DbUtils.closeQuietly(rs);
  }

JDBC总结

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
探索Java数据库连接的奥秘:JDBC技术全攻略
63 8
|
6月前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
68 3
|
6月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
38 1
|
6月前
|
XML 前端开发 Java
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
36 0
|
6月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接数据库的标准,提供统一API访问多种数据库。本文涵盖JDBC的基本概念、核心组件(如DriverManager、Connection、Statement、PreparedStatement和ResultSet)和最佳实践。示例展示了如何用JDBC连接MySQL,执行查询并处理结果。最佳实践包括使用PreparedStatement防SQL注入,妥善管理资源,处理异常,使用事务以及优化性能。了解和掌握JDBC能提升数据库操作的效率和安全性。
44 0
|
6月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
【6月更文挑战第24天】Java的JDBC是连接Java和数据库的标准,提供统一的API访问各种数据库。核心组件包括DriverManager(加载驱动和创建连接)、Connection(表示数据库连接)、Statement(执行SQL)和PreparedStatement(参数化查询,防止SQL注入)。
34 0
|
6月前
|
SQL Java 关系型数据库
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
Java与数据库连接技术JDBC关键核心之PreparedStatement以及SQL注入演示解决和原理
43 0
|
6月前
|
缓存 监控 druid
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
对比各大数据库连接池技术-Jdbc-Dbcp-C3p0-Druid-Hikaricp
80 0
|
7月前
|
SQL Java 数据库连接
Java从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
ava从入门到精通:2.3.1数据库编程——学习JDBC技术,掌握Java与数据库的交互
|
7月前
|
SQL Java 关系型数据库
JDBC技术文章
JDBC技术文章

热门文章

最新文章