MYSQL基础

第一章 mysql 的服务启动

第一节 启动过程

1.DriverManager 用于管理一组JDBC驱动程序的基本服务。

2.java.sql.Connection 数据库连接对象

1.static Connection getConnection(String url, String user, String password)
建立与给定数据库的连接并返回一个Connection对象。
2.Statement createStatement()    创建一个Statement对象,该对象 可用于执行不带参数的SQL查询和更新。
3.PreparedStatement prepareStatement(String sql)
返回一个PreparedStatement包含预编译语句的对象。该字符串sql包含一个带有一个或多个用?字符表示的参数占位符的SQL语句。
4.void close()    立即关闭当前连接及其创建的JDBC资源。
5.void setAutoCommit​(boolean autoCommit) throws SQLException
将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式,则其所有SQL语句将作为单个事务执行并提交。否则,将其SQL语句分组为通过调用method commit或method 终止的事务rollback。默认情况下,新连接处于自动提交模式。
语句完成后,将执行提交。语句完成的时间取决于SQL语句的类型:对于DML语句,例如Insert,Update或Delete和DDL语句,该语句在完成执行后立即完成。
对于Select语句,当关联的结果集关闭时,该语句完成。
对于CallableStatement对象或返回多个结果的语句,当所有关联的结果集都已关闭且所有更新计数和输出参数均已获取时,该语句完成。
注意: 如果在事务期间调用此方法,并且更改了自动提交模式,则提交事务。如果 setAutoCommit已呼叫且自动提交模式未更改,则该呼叫为无操作。
6.void rollback()  throws SQLException
撤消在当前事务中进行的所有更改,并释放此Connection对象当前持有的所有数据库锁。仅当禁用自动提交模式时,才应使用此方法。

3.java.sql.Statement:执行sql的对象

ResultSet executeQuery(String sqlQuery)    执行字符串中给定的SQL语句并返回一个ResultSet对象以查看查询结果。int executeUpdate(String sqlStatement)
long executeLargeUpdate(String sqlStatement) 8
执行SQL INSERT, UPDATE或DELETE由字符串指定的语句。还执行数据定义语言(DDL)语句,例如CREATE TABLE。返回受影响的行数,或返回0没有更新计数的语句。boolean execute(String sqlStatement)
执行由字符串指定的SQL语句。可能会产生多个结果集和更新计数。true如果第一个结果是结果集,false则返回;否则返回。调用getResultSet或getUpdateCount检索第一个结果。ResultSet getResultSet()
返回前一个查询语句的结果集,或者null如果前一个语句没有结果集。每个执行的语句仅调用一次此方法。int getUpdateCount()
long getLargeUpdateCount() 8
返回受-1前一条update语句影响的行数,或者如果前一条语句是没有更新计数的语句,则返回该行数。每个执行的语句仅调用一次此方法。void close()    关闭此语句对象及其关联的结果集。boolean isClosed()    如果此语句已关闭,则返回true。void closeOnCompletion()   导致该语句在所有结果集都关闭后立即关闭。

4.java.sql.ResultSet :结果集对象,封装查询结果

boolean next()    使结果集中的当前行向前移动一位。false在最后一行之后返回。请注意,必须调用此方法才能前进到第一行。Xxx getXxx(int columnNumber)
Xxx getXxx(String columnLabel)
(Xxx是诸如int, double, String, Date等的类型。)<T> T getObject(int columnIndex, Class<T> type) 7
<T> T getObject(String columnLabel, Class<T> type) 7
void updateObject(int columnIndex, Object x, SQLType targetSqlType) 8
void updateObject(String columnLabel, Object x, SQLType targetSqlType) 8
返回或更新具有给定列索引或标签的列的值,并将其转换为指定的类型。列标签是在SQL AS子句中指定的标签,如果AS未使用,则为列名。int findColumn(String columnName)   给出与列名关联的列索引。void close()    立即关闭当前结果集。boolean isClosed()   true如果此语句已关闭,则返回。

5.java.sql.PreparedStatement:执行sql的对象


void setXxx(int n, Xxx x)    (Xxx是诸如int, double, String, Date等的类型。)   将nth参数的值设置为x。void clearParameters()    清除预处理语句中的所有当前参数。ResultSet executeQuery()    执行准备好的SQL查询并返回一个ResultSet对象。int executeUpdate()    执行准备好的SQL INSERT, UPDATE或对象DELETE表示的语句PreparedStatement。返回受影响的行数,或返回0DDL语句(如)CREATE TABLE。

注意点:

ResultSet接口的迭代协议与接口的迭代协议略有不同java.util.Iterator。在此,迭代器被初始化为第一行之前的位置。您必须调用next一次方法,以将迭代器移至第一行。另外,没有hasNext方法。继续通话next直到返回false

第二节 事物

1.java.sql.Connection

boolean getAutoCommit()
void setAutoCommit(boolean b)    获取或设置此连接的自动提交模式为b。如果autocommit为true,则所有语句在执行完成后立即提交。void commit()    提交自上次提交以来发出的所有语句。void rollback()    撤消自上一次提交以来发出的所有语句的影响。Savepoint setSavepoint()
Savepoint setSavepoint(String name) 设置一个未命名或命名的保存点。void rollback(Savepoint svpt) 回滚到给定的保存点。void releaseSavepoint(Savepoint svpt) 释放给定的保存点。

2.java.sql.Savepoint

int getSavepointId()    获取此未命名保存点的ID,SQLException如果这是一个命名保存点,则抛出。String getSavepointName()    获取此保存点的名称,SQLException如果这是未命名的保存点,则抛出。

3.java.sql.Statement

void addBatch(String command)    将命令添加到该语句的当前命令批次中。int[] executeBatch() 1.2
long[] executeLargeBatch()   执行当前批处理中的所有命令。返回的数组中的每个值都对应于批处理语句之一。如果为非负数,则为行计数。如果它是value SUCCESS_NO_INFO,则语句成功,但是没有行数可用。如果为EXECUTE_FAILED,则语句失败。

4.java.sql.DatabaseMetaData

boolean supportsBatchUpdates()    true如果驱动程序支持批量更新,则返回。

1.事物流程图

5.事务回滚例子

package cn.itcast.jdbc;import cn.itcast.util.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;/*** 事务操作*/
public class JDBCDemo10 {public static void main(String[] args) {Connection conn = null;PreparedStatement pstmt1 = null;PreparedStatement pstmt2 = null;try {//1.获取连接conn = JDBCUtils.getConnection();//开启事务conn.setAutoCommit(false);//2.定义sql//2.1 张三 - 500String sql1 = "update account set balance = balance - ? where id = ?";//2.2 李四 + 500String sql2 = "update account set balance = balance + ? where id = ?";//3.获取执行sql对象pstmt1 = conn.prepareStatement(sql1);pstmt2 = conn.prepareStatement(sql2);//4. 设置参数pstmt1.setDouble(1,500);pstmt1.setInt(2,1);pstmt2.setDouble(1,500);pstmt2.setInt(2,2);//5.执行sqlpstmt1.executeUpdate();// 手动制造异常int i = 3/0;pstmt2.executeUpdate();//提交事务conn.commit();} catch (Exception e) {//事务回滚try {if(conn != null) {conn.rollback();}} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();}finally {JDBCUtils.close(pstmt1,conn);JDBCUtils.close(pstmt2,null);}}
}

第三节 读写BOL(存储大对象)

字符型大对象 :CLOB

二进制大对象: BLOB

1.java.sql.ResultSet

Blob getBlob(int columnIndex)
Blob getBlob(String columnLabel)
Clob getClob(int columnIndex)
Clob getClob(String columnLabel)
在给定列获取BLOB或CLOB。

2.java.sql.Blob

long length()    获取此BLOB的长度。byte[] getBytes(long startPosition, long length)    从此BLOB获取给定范围内的数据。InputStream getBinaryStream()
InputStream getBinaryStream(long startPosition, long length)    返回一个流以从此BLOB或给定范围读取数据。OutputStream setBinaryStream(long startPosition)   从给定位置开始返回用于写入此BLOB的输出流。

3.java.sql.Clob

long length()    获取此CLOB的字符数。String getSubString(long startPosition, long length)    从此CLOB获取给定范围内的字符。Reader getCharacterStream()
Reader getCharacterStream(long startPosition, long length)    返回一个读取器(不是流)以从此CLOB或给定范围读取字符。Writer setCharacterStream(long startPosition)   从给定位置开始,返回用于写入此CLOB的编写器(不是流)。

4.java.sql.Connection

Blob createBlob()
Clob createClob()
创建一个空的BLOB或CLOB。

5.例子

1.丛数据库读取图片

PreparedStatement stat = conn.prepareStatement("SELECT Cover FROM BookCovers WHERE ISBN=?");
. . .
stat.set(1, isbn);
try (ResultSet result = stat.executeQuery())
{if (result.next()){Blob coverBlob = result.getBlob(1);Image coverImage = ImageIO.read(coverBlob.getBinaryStream());}
}

2.将图片写进数据库

Blob coverBlob = connection.createBlob();
int offset = 0;
OutputStream out = coverBlob.setBinaryStream(offset);
ImageIO.write(coverImage, "PNG", out);
PreparedStatement stat = conn.prepareStatement("INSERT INTO Cover VALUES (?, ?)");
stat.set(1, isbn);
stat.set(2, coverBlob);
stat.executeUpdate();

第四节 SQL转义

  • 日期和时间文字,使用d, t, tsDATE, TIME,或TIMESTAMP值:
{d ‘2008-01-24’}
{t ‘23:59:59’}
{ts ‘2008-01-24 23:59:59.999’}
  • 调用标量函数
{fn left(?, 20)}
{fn user()}
  • 调用存储过程
{call PROC1(?, ?)}
{call PROC2}
{call ? = PROC3(?)}
  • 外连接
SELECT * FROM {oj Books LEFT OUTER JOIN Publishers
ON Books.Publisher_Id = Publisher.Publisher_Id}
  • LIKE子句中的转义字符
. . . WHERE ? LIKE %!_% {escape ‘!’}

第五节 多结果集

  1. 使用该execute方法执行SQL语句。
  2. 检索第一个结果或更新计数。
  3. 重复调用该getMoreResults方法以继续下一个结果集。
  4. 没有更多结果集或更新计数时结束。

1.java.sql.Statement

boolean getMoreResults()
boolean getMoreResults(int current)   获取此语句的下一个结果。所述current参数是以下之一CLOSE_CURRENT_RESULT(默认),KEEP_CURRENT_RESULT或CLOSE_ALL_RESULTS。返回true下一个结果是否存在并且是结果集。

2.例子

boolean isResult = stat.execute(command);
boolean done = false;
while (!done)
{if (isResult){ResultSet result = stat.getResultSet();do something with result}else{int updateCount = stat.getUpdateCount();if (updateCount >= 0)do something with updateCountelsedone = true;}if (!done) isResult = stat.getMoreResults();
}

第六节 自动生成键

1.java.sql.Statement设置键

getGeneratedKeys 检索由于执行此Statement对象而创建的任何自动生成的键 。如果此Statement对象未生成任何密钥,ResultSet 则返回一个空对象。boolean execute(String statement, int autogenerated)
int executeUpdate(String statement, int autogenerated)   如前所述执行给定的SQL语句。如果autogenerated设置为,Statement.RETURN_GENERATED_KEYS并且该语句为INSERT语句,则第一列包含自动生成的键。

2.例子


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;public class Tester {public static void main(String[] args) throws Exception {// 注册数据库驱动DriverManager.registerDriver(new com.mysql.jdbc.Driver());// 获取连接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "***");// 准备SQLString sql = "insert into user(name) values('Belin')";// 准备语句,配置为自动返回生成主键。PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);// 执行语句pstmt.executeUpdate();// 获取主键值,是一个ResultSet。ResultSet rs = pstmt.getGeneratedKeys();if (rs.next()) {System.out.println(rs.getInt(1));}}

第七节 可滚动和可更新的结果集

1.java.sql.Connection

Statement createStatement(int type, int concurrency) 1.2
PreparedStatement prepareStatement(String command, int type, int concurrency) 1.2创建一条语句或准备好的语句,以产生具有给定类型和并发性的结果集。的type参数是常数TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE,或者TYPE_SCROLL_SENSITIVE,和concurrency是的一个常量CONCUR_READ_ONLY或CONCUR_UPDATABLE在所定义的,所有ResultSet接口。

2.java.sql.ResultSet

int getType()     返回此结果集的类型- TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE或之一TYPE_SCROLL_SENSITIVE。int getConcurrency()   返回此结果集的并发设置- CONCUR_READ_ONLY或之一CONCUR_UPDATABLE。boolean previous()   将光标移动到上一行。返回true如果光标位于一行上,或者false光标位于第一行之前。int getRow()   获取当前行的编号。行从编号1。boolean absolute(int r)   将光标移动到行r。返回true如果光标位于行上。boolean relative(int d)   按d行移动光标。如果d为负,则光标向后移动。返回true如果光标位于行上。boolean first()
boolean last()    将光标移动到第一行或最后一行。返回true如果光标位于行上。void beforeFirst()
void afterLast()    将光标移动到第一行或最后一行之后。boolean isFirst()
boolean isLast()   测试光标是在第一行还是最后一行。boolean isBeforeFirst()
boolean isAfterLast()   测试光标是在第一行之前还是在最后一行之后。void moveToInsertRow() 将光标移动到插入行。插入行是用于使用和方法插入新数据的特殊行。updateXxxinsertRowvoid moveToCurrentRow()    将光标从插入行移回moveToInsertRow调用该方法时占用的行。void insertRow()    将插入行的内容插入数据库和结果集中。void deleteRow()   从数据库和结果集中删除当前行。void updateXxx(int column, Xxx data)
void updateXxx(String columnName, Xxx data) (Xxx是诸如int, double, String, Date等的类型。)
更新结果集当前行中的字段。void updateRow()   将当前行更新发送到数据库。void cancelRowUpdates()    取消当前行更新。

3.java.sql.DatabaseMetaData

boolean supportsResultSetType(int type)   返回true数据库是否可以支持给定类型的结果集;type是的一个常量TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE,或TYPE_SCROLL_SENSITIVE所述的ResultSet接口。boolean supportsResultSetConcurrency(int type, int concurrency)   true如果数据库可以支持类型和并发的给定组合的结果集,则返回。的type参数是的一个常量TYPE_FORWARD_ONLY, TYPE_SCROLL_INSENSITIVE,或TYPE_SCROLL_SENSITIVE,和concurrency是的一个常量CONCUR_READ_ONLY或CONCUR_UPDATABLE在所定义的,所有ResultSet接口。

第八节 行集

构建行集

  • CachedRowSet允许断开操作。我们将在下一节中讨论缓存的行集。
  • WebRowSet是可以保存到XML文件的缓存行集。可以将XML文件移动到Web应用程序的另一层,在该层中由另一个WebRowSet对象打开。
  • FilteredRowSetJoinRowSet接口支持行集等效于SQL轻便操作SELECTJOIN操作。这些操作是对存储在行集中的数据执行的,而无需建立数据库连接。
  • JdbcRowSet是围绕 的薄包装纸ResultSet。它从RowSet界面添加了有用的方法。

1.javax.sql.RowSet

String getURL()
void setURL(String url)    获取或设置数据库URL。String getUsername()
void setUsername(String username)    获取或设置用于连接数据库的用户名。String getPassword()
void setPassword(String password)    获取或设置用于连接数据库的密码。String getCommand()
void setCommand(String command)    获取或设置执行以填充此行集的命令。void execute()    通过发出带有的语句集来填充此行集setCommand。为了使驱动程序管理器获得连接,必须设置URL,用户名和密码。

2.javax.sql.rowset.CachedRowSet

void execute(Connection conn)    通过发出带有的语句集来填充此行集setCommand。此方法使用给定的连接并将其关闭。void populate(ResultSet result)    使用给定结果集中的数据填充此缓存的行集。String getTableName()
void setTableName(String tableName)    获取或设置从中填充此缓存行集的表的名称。int getPageSize()
void setPageSize(int size)    获取或设置页面大小。boolean nextPage()
boolean previousPage()    加载行的下一页或上一页。返回true是否有下一页或上一页。void acceptChanges()
void acceptChanges(Connection conn)    重新连接到数据库并写入由于编辑行集而导致的更改。SyncProviderException    如果由于数据库数据已更改而无法回写数据,则可能抛出。

3.javax.sql.rowset.RowSetProvider

static RowSetFactory newFactory()   创建行集工厂。

4.javax.sql.rowset.RowSetFactory

CachedRowSet createCachedRowSet()
FilteredRowSet createFilteredRowSet()
JdbcRowSet createJdbcRowSet()
JoinRowSet createJoinRowSet()
WebRowSet createWebRowSet()    创建指定类型的行集。

注意点 :

他的流程也是和数据库的流程差不多的

package cn.itcast.jdbc;import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;
import java.sql.*;public class jdbc11 {public static void main(String[] args) {try{RowSetFactory rowSetFactory = RowSetProvider.newFactory();CachedRowSet cachedRowSet = rowSetFactory.createCachedRowSet();cachedRowSet.setUrl("jdbc:mysql:///db3");cachedRowSet.setUsername("root");cachedRowSet.setPassword("941314zxc");String sql = "select balance from account";cachedRowSet.setCommand(sql);cachedRowSet.execute();if (cachedRowSet.next()){System.out.println("Id: " + cachedRowSet.getString(1));}} catch (SQLException throwables) {throwables.printStackTrace();}}
}

第九节 元数据

1.java.sql.Connection

DatabaseMetaData getMetaData()  以DatabaseMetaData对象的形式返回连接的元数据。

2.java.sql.DatabaseMetaData


ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])    返回目录中与模式和​​表名称模式以及类型条件匹配的所有表的描述。(模式描述了一组相关的表和访问权限。目录描述了一组相关的模式。这些概念对于构造大型数据库很重要。)该catalog和schemaPattern参数可以""检索这些表没有目录或模式,或者null不管返回目录或模式的表。该types数组包含要包含的表类型的名称。典型类型为TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARY, LOCAL TEMPORARY, ALIAS和SYNONYM。如果types为null,则返回所有类型的表。结果集包含五列,所有列均为type String。

int getJDBCMajorVersion()
int getJDBCMinorVersion()     返回建立数据库连接的驱动程序的主要或次要JDBC版本号。例如,JDBC 3.0驱动程序的主要版本号为3,次要版本号为0。int getMaxConnections()    返回此数据库允许的最大并发连接数。int getMaxStatements()    返回每个数据库连接允许的并发打开的最大语句数,或者0该数目是无限的或未知的。

3.java.sql.ResultSet

ResultSetMetaData getMetaData()    返回与当前ResultSet列关联的元数据。

4.java.sql.ResultSetMetaData

int getColumnCount()    返回当前ResultSet对象中的列数。int getColumnDisplaySize(int column)    返回由index参数指定的列的最大宽度。String getColumnLabel(int column)    返回该列的建议标题。String getColumnName(int column)    返回与指定列索引关联的列名。
public String getDriverName()throws SQLException:它返回JDBC驱动程序的名称。
public String getDriverVersion()throws SQLException:它返回JDBC驱动程序的版本号。
public String getUserName()throws SQLException:它返回数据库的用户名。
public String getDatabaseProductName()throws SQLException:它返回数据库的产品名称。
public String getDatabaseProductVersion()throws SQLException:它返回数据库的产品版本。
public ResultSet getTables(字符串目录,字符串schemaPattern,字符串tableNamePattern,字符串[]类型)引发SQLException:它返回指定目录表的描述。表格类型可以是TABLE,VIEW,ALIAS,SYSTEM TABLE,SYNONYM等。

5.例子

1.显示mysql驱动

import java.sql.*;
class Dbmd{
public static void main(String args[]){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");  Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe","system","oracle");
DatabaseMetaData dbmd=con.getMetaData();  System.out.println("Driver Name: "+dbmd.getDriverName());
System.out.println("Driver Version: "+dbmd.getDriverVersion());
System.out.println("UserName: "+dbmd.getUserName());
System.out.println("Database Product Name: "+dbmd.getDatabaseProductName());
System.out.println("Database Product Version: "+dbmd.getDatabaseProductVersion());  con.close();
}catch(Exception e){ System.out.println(e);}
}
}

2.表的总数

import java.sql.*;
class Dbmd2{
public static void main(String args[]){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");  Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe","system","oracle");  DatabaseMetaData dbmd=con.getMetaData();
String table[]={"TABLE"};
ResultSet rs=dbmd.getTables(null,null,null,table);  while(rs.next()){
System.out.println(rs.getString(3));
}  con.close();  }catch(Exception e){ System.out.println(e);}  }
}

3.视图总数

import java.sql.*;
class Dbmd3{
public static void main(String args[]){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");  Connection con=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe","system","oracle");  DatabaseMetaData dbmd=con.getMetaData();
String table[]={"VIEW"};
ResultSet rs=dbmd.getTables(null,null,null,table);  while(rs.next()){
System.out.println(rs.getString(3));
}  con.close();  }catch(Exception e){ System.out.println(e);}  }
}

第十节 Web与企业应用中的链接管理

1.使用database.properties

 1  package test;23  import java.nio.file.*;4  import java.sql.*;5  import java.io.*; 6  import java.util.*;78  /**9  * This program tests that the database and the JDBC driver are correctly configured.
10  * @version 1.03 2018-05-01
11  * @author Cay Horstmann
12  */
13  public class TestDB
14  {15    public static void main(String args[]) throws IOException
16    {17      try
18      {19        runTest();
20      }
21      catch (SQLException ex)
22      {23        for (Throwable t : ex)
24            t.printStackTrace();
25      }
26    }
27
28    /**
29    * Runs a test by creating a table, adding a value, showing the table contents, and
30    * removing the table.
31    */
32  public static void runTest() throws SQLException, IOException
33  {34      try (Connection conn = getConnection();
35            Statement stat = conn.createStatement())
36      {37        stat.executeUpdate("CREATE TABLE Greetings (Message CHAR(20))");
38        stat.executeUpdate("INSERT INTO Greetings VALUES (’Hello, World!’)");
39
40        try (ResultSet result = stat.executeQuery("SELECT * FROM Greetings"))
41        {42          if (result.next())
43            System.out.println(result.getString(1));
44        }
45        stat.executeUpdate("DROP TABLE Greetings");
46  }
47  }
48
49  /**
50    * Gets a connection from the properties specified in the file database.properties.
51    * @return the database connection
52    */
53    public static Connection getConnection() throws SQLException, IOException
54    {55      var props = new Properties();
56      try (InputStream in = Files.newInputStream(Paths.get("database.properties")))
57      {58        props.load(in);
59      }
60      String drivers = props.getProperty("jdbc.drivers");
61      if (drivers != null) System.setProperty("jdbc.drivers", drivers);
62      String url = props.getProperty("jdbc.url");
63      String username = props.getProperty("jdbc.username");
64      String password = props.getProperty("jdbc.password");
65
66      return DriverManager.getConnection(url, username, password);
67    }
68  }

第二章 jdbc连接池

第一节 jdbc连接池基础

package cn.itcast.datasource.c3p0;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;/*** c3p0演示*/
public class C3P0Demo2 {public static void main(String[] args) throws SQLException {//1. 获取DataSource,使用默认配置DataSource ds  = new ComboPooledDataSource();//2.获取连接for (int i = 1; i <= 11 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);if(i == 5){conn.close();//归还连接到连接池中}}//        testNamedConfig();}public static void testNamedConfig() throws SQLException {// 1.1 获取DataSource,使用指定名称配置DataSource ds  = new ComboPooledDataSource("otherc3p0");//2.获取连接for (int i = 1; i <= 10 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);}}}

第二节 c3p0

第三节 druid

这些等大数据的时候,具体再拉开来

小白的jdbc入门之旅相关推荐

  1. 打怪升级之小白的大数据之旅(四十一)<大数据与Hadoop概述>

    打怪升级之小白的大数据之旅(四十) Hadoop概述 上次回顾 好了,经过了java,mysql,jdbc,maven以及Linux和Shell的洗礼,我们终于开始正式进入大数据阶段的知识了,首先我会 ...

  2. 零基础小白,如何入门计算机视觉?

    文章目录 零基础小白,如何入门计算机视觉? 宏观认识 入门书籍 进阶书籍 深入实践 深度学习 视觉SLAM 此文发于公众号:计算机视觉life. 原文链接:零基础小白,如何入门计算机视觉? 零基础小白 ...

  3. 打怪升级之小白的大数据之旅(六十一)<Hive旅程第二站:Hive安装>

    打怪升级之小白的大数据之旅(六十一) Hive旅程第二站:Hive安装 上次回顾 上一章我们学习了Hive的概念以及框架原理,本章节是对Hive的安装进行分享,因为它有些需要自己配置的点,所以我单独开 ...

  4. 打怪升级之小白的大数据之旅(一)<Java基础语法之Java的身世之谜>

    打怪升级之小白的大数据之旅(一) Java基础语法之Java的身世之谜 打怪升级之小白的大数据之旅(一) 前言 一.学习大数据之前 二.Java基础 what? why? how? 总结 前言 做了几 ...

  5. 打怪升级之小白的大数据之旅(三十一)<JavaSE总结>

    打怪升级之小白的大数据之旅(三十) JavaSE总结 引言 Java这只小怪物我们已经练级差不多了,明天我们将进入新的旅程了,所以,我要对前面的整个JavaSE知识点进行总结,就像积攒够了经验升级一样 ...

  6. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...

    <小白7天入门PHP Web开发>系列文章,面向单纯善良的完全不懂Web开发编程的入门速成课程,小白们如果感兴趣可以研读此系列文章,也可以连线提问.各路大神有何指教还请指点一二.希望各路大 ...

  7. WCF 入门之旅(4): 怎样用客户端调用WCF服务

    WCF 入门之旅(4): 怎样用客户端调用WCF服务 前面的demo已经能够跑起来,现在开始考虑用客户端来测试所写的应用了,首先用个普通的应用程序来调用所写的wcf服务吧.其实最后运行wcf服务后的页 ...

  8. python视频教程从入门到精通全集-零基础小白python从入门到精通视频(全60集)...

    零基础小白python从入门到精通视频(全60集)课程目录: [真心软件]01Python编程语言历史及特性.mp4 [真心软件]02Python编程语言初接触.mp4 [真心软件]03Python程 ...

  9. 小白级OpenCV入门

    如今科技发展迅速,很多领域都涉及到"计算机视觉"这个细分领域.简单的说,就是将图像信息转化为计算机可以处理的数字信息,从而让计算机可以看得见,本文就介绍一下纯小白的opencv入门 ...

最新文章

  1. Reddit引入Envoy支持架构改造,性能显著提升
  2. maya怎么贴膜_maya怎么渲染成白膜?
  3. k8s核心技术-集群安全机制(RBAC实现鉴权)---K8S_Google工作笔记0040
  4. jQuery中的$.getJSON、$.ajax、$.get、$.post的区别
  5. you are not allowed to push code to protected branches on this project
  6. linux系统数据文件和信息--unix环境高级编程读书笔记
  7. ubuntu,win10 释放IP,重新获取IP
  8. H.266/VVC代码学习:xCheckRDCostMerge2Nx2N函数
  9. linux服务器弱密码检查,linux系统弱密码检测
  10. 信息学奥赛一本通(C++版)在线评测系统 1157:哥德巴赫猜想
  11. maven仓库repositories和mirrors的配置及区别详解(轻松搞明白)
  12. 新的开始——参加培训
  13. 考教师资格证需要买书吗?
  14. 柔性OLED触摸屏的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 《Hexo: 从零开始编写自己的主题》2. 入门Hexo主题编写
  16. JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率
  17. 【原创】在winform程序中实现在IE浏览器中打开一个新的页面,全屏化并屏蔽IE窗口的工具栏和地址栏
  18. Agent XPs disable
  19. django之 将字典数据导入数据库以及解决insert自动增长的id不是从1开始或不连续
  20. 【Microsoft Azure 的1024种玩法】二十六. 在Azure VM中手动部署Windows Admin Center管理平台

热门文章

  1. cdo (Climate Data Operators ) 常用命令介绍:(查看文件信息、多文件合并、数据裁剪、数据插值、数据计算。。)
  2. 为什么一定要用微软的Office?Docx等格式说明
  3. java手写计算器,GUI与鼠标适配器的配合
  4. 打工人必备:这10款VS Code摸鱼神器还没安装?
  5. 手摇机械计算机原理,科学网-计算尺和手摇计算器-胡懋仁的博文
  6. ROS2.9.27网吧限速脚本
  7. 【开发教程6】疯壳·开源蓝牙智能健康手表-触摸
  8. 票根不符合目标服务_档案数字化加工服务广州市天河区岑村东公司电话
  9. Python制作金钱豹收款码表情包
  10. Android 在相机加框,android自定义相机带取景框