
- 简 称
- JDBC
- 类 别
- 应用程序接口
- 中文名
- Java数据库连接
- 外文名
- Java Database Connectivity
-
2021-04-18 20:00:03
Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 问题解决 Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust
初次创建MyBatis的过程中遇到了一下的报错信息如下:
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 1,302 milliseconds ago. The last packet sent successfully to the server was 1,295 milliseconds ago. ### The error may exist in com/liglei/dao/UserMapper.xml ### The error may involve com.liglei.dao.UserDao.getUserById ### The error occurred while executing a query ### Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 1,302 milliseconds ago. The last packet sent successfully to the server was 1,295 milliseconds ago. at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) at com.sun.proxy.$Proxy4.getUserById(Unknown Source) at com.liglei.dao.UserTest.test(UserTest.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 1,302 milliseconds ago. The last packet sent successfully to the server was 1,295 milliseconds ago. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:990) at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:201) at com.mysql.jdbc.MysqlIO.negotiateSSLConnection(MysqlIO.java:4914) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1663) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2199) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2025) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:778) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:208) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:221) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:216) at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95) at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:422) at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89) at org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:138) at org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:60) at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:85) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ... 28 more Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1946) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:316) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:310) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1639) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:223) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1037) at sun.security.ssl.Handshaker.process_record(Handshaker.java:965) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1064) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379) at com.mysql.jdbc.ExportControlled.transformSocketToSSLSocket(ExportControlled.java:186) ... 60 more Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors at com.mysql.jdbc.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:302) at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(SSLContextImpl.java:1099) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1621) ... 68 more Caused by: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:154) at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:80) at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292) at com.mysql.jdbc.ExportControlled$X509TrustManagerWrapper.checkServerTrusted(ExportControlled.java:295) ... 70 more
很明显出现错误后我就一直搜索
Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
这个错误但是无果!根据提示
The last packet successfully received from the server was 1,302 milliseconds ago.
说 从服务器成功接收到的最后一个数据包是1302毫秒之前这个错误原因应该是数据库连接超时了,但是我已经把MySql的连接失效日期改过啦!默认是8个小时。- interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。参数默认值:28800秒(8小时)
- wait_timeout:服务器关闭非交互连接之前等待活动的秒数。
解决方法如下:
- 修改数据库连接配置在数据库连接上,加“&autoReconnect=true&failOverReadOnly=false”配置,但是mysql4以下的版本有效,mysql5以上的无效。
- 修改数据库连接有效时间,在数据库配置上设置,把数据库连接有效时间设置长一点,比如设置12小时或者24小时。**方法:**在MySql的配置文件my.ini或者mysql.xml的配置文件里边加上
interactive_timeout=388000
和wait_timeout=388000
即可!
本作者以上问题解决不了!!!!
继续往下看!
继续往下看还有几个原因:
- Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
- Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
- Caused by: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
其中第一个问题的错误,需要把数据库连接配置德的
useSSL=true
改成useSSL=false
useSSL:
MySQL在高版本需要指明是否进行SSL连接
1.true 需要连接
2.false 不需要连接就是使用JDBC跟你的数据库连接的时候,你的JDBC版本与MySQL版本不兼容,MySQL的版本更高一些,在连接语句后加上“useSSL=‘true’” ,就可以连接到数据库了。更高版本。
到此本作者的问题就已经解决啦!!!
暂时未发现其他的错误,发现错误的小伙伴,欢迎在下方的评论区留言,互相交流经验!!!
连接的时候,你的JDBC版本与MySQL版本不兼容,MySQL的版本更高一些,在连接语句后加上“useSSL=‘true’” ,就可以连接到数据库了。更高版本。
到此本作者的问题就已经解决啦!!!
暂时未发现其他的错误,发现错误的小伙伴,欢迎在下方的评论区留言,互相交流经验!!!
更多相关内容 -
sun.jdbc.odbc.JdbcOdbcDriver下载
2019-08-02 11:24:16jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver, 原因:从jdk从1.8开始,删除了jdbc-odbc桥,所以odbc的驱动是用不了的 解决方法:这里为提供一个解决JDK1.8不... -
sqljdbc4-4.0.jar
2018-09-10 15:35:27SQLSERVER数据库连接jar/jdbc包: sqljdbc4-4.0.jar -
Access_JDBC30.jar 完全破解版
2018-04-26 15:25:32亲测, 已破解Access_JDBC30.jar 无查询次数限制, 无最大1000行限制, 已经完全破解. -
jdbc
2020-06-02 13:08:52文章目录一,什么是JDBC二,JDBC的原理三,程序员,JDBC,JDBC驱动的关系及说明四,JDBC的总结五,JDBC连接数据的步骤六,JDBC连接数据的详细步骤 一,什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库...一,什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
二,JDBC的原理
早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!
JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!
三,程序员,JDBC,JDBC驱动的关系及说明
JDBC API
提供者:Sun公司
内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,如
1.DriverManager类 作用:管理各种不同的JDBC驱动
2.Connection接口
3.Statement接口
4.ResultSet接口
JDBC 驱动
提供者:数据库厂商
作用:负责连接各种不同的数据库
Java程序员
JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。
三方关系
SUN公司是规范制定者,制定了规范JDBC(连接数据库规范)
数据库厂商微软、甲骨文等分别提供实现JDBC接口的驱动jar包
程序员学习JDBC规范来应用这些jar包里的类。
四,JDBC的总结
简单地说,JDBC 可做三件事:与数据库建立连接、发送 操作数据库的语句并处理结果。
DriverManager :依据数据库的不同,管理JDBC驱动Connection :负责连接数据库并担任传送数据的任务
Statement :由 Connection 产生、负责发送执行SQL语句
ResultSet:负责保存Statement执行后所产生的查询结果
五,JDBC连接数据的步骤
1:加载一个Driver驱动
2:创建数据库连接(Connection)
3 : 创建SQL命令发送器Statement
4:通过Statement发送SQL命令并得到结果
5:处理SQL结果(select语句)
6:关闭数据库资源
ResultSet
Statement
Connection。
六,JDBC连接数据的详细步骤
1.加载驱动
加载JDBC驱动是通过调用方法java.lang.Class.forName(),下面列出常用的几种数据库驱动程序加载语句的形式 :
Class.forName(“oracle.JDBC.driver.OracleDriver”);//使用Oracle的JDBC驱动程序
Class.forName(“com.microsoft.JDBC.sqlserver.SQLServerDriver”);//使用SQL Server的JDBC驱动程序
Class.forName(“com.ibm.db2.JDBC.app.DB2Driver”);//使用DB2的JDBC驱动程序
Class.forName(“com.mysql.JDBC.Driver”);//使用MySql的JDBC驱动程序
2.创建数据库连接
与数据库建立连接的方法是调用DriverManager.getConnection(String url, String user, String password )方法
Connection conn=null;
String url=“jdbc:oracle:thin:@localhost:1521:orcl”;
String user=“scott";
String password=“tiger";
conn = DriverManager.getConnection(url, user, password);
3.创建Statement并发送命令
Statement对象用于将 SQL 语句发送到数据库中,或者理解为执行sql语句
有三种 Statement对象:
Statement:用于执行不带参数的简单SQL语句;
PreparedStatement(从 Statement 继承):用于执行带或不带参数的预编译SQL语句;
CallableStatement(从PreparedStatement 继承):用于执行数据库存储过程的调用。
4.处理ResultSet结果
ResultSet对象是executeQuery()方法的返回值,它被称为结果集,它代表符合SQL语句条件的所有行,并且它通过一套getXXX方法(这些get方法可以访问当前行中的不同列)提供了对这些行中数据的访问。
ResultSet里的数据一行一行排列,每行有多个字段,且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。
ResultSet对象自动维护指向当前数据行的游标。每调用一次next()方法,游标向下移动一行。
初始状态下记录指针指向第一条记录的前面,通过next()方法指向第一条记录。循环完毕后指向最后一条记录的后面。
5.关闭数据库资源
作为一种好的编程风格,应在不需要Statement对象和Connection对象时显式地关闭它们。关闭Statement对象和Connection对象的语法形式为:
public void close() throws SQLException
用户不必关闭ResultSet。当它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该ResultSet将被自动关闭。
注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接是才可以使用的,所以在使用结束之后有可能其他的Statement还需要连接,所以不能先关闭Connection。
-
sun.jdbc.odbc.JdbcOdbcDriver.jar
2018-07-12 01:09:42jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver,解决办法!因为jdk1.8环境不支持sun.jdbc.odbc.JdbcOdbcDriver驱动,所以这里为特别为您提供一个解决JDK1.8不... -
maven 下载 sqljdbc4-4.0.jar
2017-10-26 16:12:39sqlserver数据库连接驱动包 sqljdbc4-4.0.jar,摘要必须大于50个字节! -
kettle链接SQL server驱动 sqljdbc
2017-10-17 08:52:02kettle 链接SQL server驱动,高版本的jdk建议使用 sqljdbc4,其他的建议使用 sqljdbc。 kettle 链接数据库必须的。 -
Mysql5.6、Mysql5.7 JDBC驱动
2017-12-29 16:05:02mysql-connector-java-5.1.34.jar,mysql 5.6 5.7可以用 -
mysql8.0版本jdbc驱动jar包
2018-07-11 13:19:47mysql8.0版本jdbc驱动jar包,支持mysql8.0新版本驱动。。 -
SpringBoot+Sharding-JDBC分库分表实战
2018-12-19 10:19:04 -
hana jdbc 驱动
2017-11-17 12:48:05hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana jdbc 驱动hana... -
JDBC介绍
2021-10-14 13:37:401 JDBC简介 概念:JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。如图所示: 此前我们学习过SQL后,可以通过 ...1 JDBC简介
- 概念:JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。如图所示:
此前我们学习过SQL后,可以通过Navicat
、SQLyog
等图形化客户端发送SQL操作数据库。本质上,JDBC的作用和图形化客户端的作用相同,都是发送SQL操作数据库。差别在图形化界面的操作是图形化、傻瓜化的,而JDBC则需要通过编码(这时候不要思考JDBC代码怎么写,也不要觉得它有多难)完成图形操作时的效果。
总结:JDBC本质上也是一种发送SQL操作数据库的client技术,只不过需要通过Java编码完成。 - 作用:
通过JDBC技术与数据库进行交互,使用Java语言发送SQL语句到数据库中,可以实现对数据的增、删、改、查等功能,可以更高效、安全的管理数据。 JDBC是数据库与Java代码的桥梁(链接)、
2 JDBC技术相关接口
-
作用:JDBC要通过Java代码操作数据库,JDBC中定义了操作数据库的各种接口和类型:
接口 作用 Driver 驱动接口,定义建立链接的方式 DriverManager 工具类,用于管理驱动,可以获取数据库的链接 Connection 表示Java与数据库建立的连接对象(接口) PreparedStatement 发送SQL语句的工具 ResultSet 结果集,用于获取查询语句的结果 -
JDBC是规范(接口)不是实现(类)
JDBC 是一种规范,由Sum公司它提供了一套完整的接口,由数据库厂商根据特点予以实现,因此只要学会接口的使用就可以轻松的用 JDBC编写适用于各种数据库的程序。 -
Mysql提供的JDBC实现
Mysql提供的JDBC实现称为Mysql Connector
,不同的数据库版本需要使用不同的Connector
。
实际开发时根据数据库版本、JDK版本、选择不同的Connector
。Connector版本 MySQL版本 JDK版本 8.0 5.6, 5.7, 8.0 JDK 8.0 或更高 5.1 5.6, 5.7, 8.0 JDK 5.0 或更高 下载地址:https://mvnrepository.com/artifact/mysql/mysql-connector-java
为什么JDBC只有接口,没有提供实现?
不同数据库的底层技术不同,不少数据库是闭源的,源代码不公开的。Sun公司无力为所有数据库提供具体实现,只能提供接口而由数据库厂商提供具体实现,Sun公司只是制定JDBC标准,各个厂商准守标准提供具体的实现。JDBC和数据库实现的关系就好比List接口和ArrayList、LinkedList之间的关系。
面向JDBC接口规范编程,写出的JDBC代码可以在不同的数据库间轻松的迁移。
3 JDBC的编程步骤
- JDBC操作数据库的步骤和
Navicat
操作数据库步骤就大同小异,下面我们先回顾下Navicat
的操作步骤,然后分析出JDBC的步骤。如图所示: - JDBC开发六步
1.打开IDEA如图所示的界面,点击Create New Project。1. 加载驱动 2. 获取链接 3. 准备SQL以及发送SQL的工具 4. 执行SQL 5. 处理结果集 6. 释放资源
2.选择Empty Java和点击Next,如图所示:
3.填写项目名称和点击Finish,如图所示:
4.点击File–>New–Module,如图所示:
5.选择Java,点击Next。如图所示:
6.填写子项目名称和点击Finish,如图所示:
4 第一个JDBC程序
- 准备工作:向
t_person
表中新增一行数据。
如图所示:create table t_person( person_id int primary key auto_increment, person_name varchar(20), age tinyint, sex varchar(6), mobile varchar(20), address varchar(200) ); -- 需求 向t_person表中插入一行数据 insert into t_person values(null,'王月华',88,'其他','138383838','硅谷');
1、搭建开发环境
-
在项目中引入数据库驱动jar包(jar文件:针对class文件的压缩格式包含了多个带包的class文件,类似于普通文件打包的zip、rar)。
-
eclipse
将mysql-connector-java.jar添加到项目环境中 1. 右键选中项目,新建一个folder名为lib,将jar包复制到lib目录中。 2. 右键选中jar包,build path-->add to build path。
-
idea
将mysql-connector-java.jar添加到项目环境中。 1. 右键选中项目,新建一个Directory名为lib,将jar包复制到lib文件夹中。 2. 右键选中jar包,Add as Library --> OK。
如图所示:
2 JDBC访问数据库
- 编码:
Applications no longer need to explicitly load JDBC drivers using Class.forName(). 应用程序不再需要使用Class.forName()显式加载JDBC驱动程序。 Existing programs which currently load JDBC drivers using Class.forName() will continue to work without modification 当前使用Class.forName()加载JDBC驱动程序的,将继续工作而不进行修改。
演示的代码如下:
package com.txw.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; @SuppressWarnings("all") // 注解警告信息 public class JdbcTesrt { public static void main(String[] args) throws Exception { // 1.连接驱动类 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.获取连接 // 数据库用户名 String username = "root"; // 数据库密码 String password = "123456"; /* url参数用来确定连接的数据库信息: 数据库机器ip 端口号port 数据库名db_name 连接的参数,比如编解码集、时区... url格式:jdbc:mysql://ip:port/db_name?k=v参数 ,只需要了解url的组成,不需要记忆 */ String url = "jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn = DriverManager.getConnection(url,username,password); // url错误创建链接时会出现异常 // 参数错误不会导致运行时异常 System.out.println( conn ); // 3.准备发送SQL String sql = "insert into t_person values(null,'Adair',25,'T','1383838381','硅谷');"; PreparedStatement pstm = conn.prepareStatement(sql); // 4.发送执行SQL int update = pstm.executeUpdate(); System.out.println( update ); // 5.(如果是查询语句,需要处理结果集) // 6.关闭资源 pstm.close(); conn.close(); } }
如图所示:
- 参数解释:
1. useUnicode = true&characterEncoding=UTF-8:mysql编码默认为GBK,此参数的作用就是允许插入unicode字符集中的数据,使用UTF-8编码方式进行编码。 2. useSSL=false: SSL是高版本Mysql提供的数据加密、安全保障的新协议,为了向下兼容所以设置为false关闭此协议。 3. serverTimezone=Asia/Shanghai:为了确保日期类型数据能够正确存储,需要指定时区为上海时区(上海时区与北京一致),默认为美国时区。
3 结果集的处理
- 需求:查询t_person表中的数据。
select * from t_person;
如图所示:
- 开发步骤回顾
1 加载驱动 2 创建和数据库之间的连接 3 准备一个发送SQL的工具 4 发送并执行SQL 5 处理结果集 6 释放资源。
- 演示的代码如下:
package com.txw.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; @SuppressWarnings("all") // 注解警告信息 public class JdbcTest01 { public static void main(String[] args) throws Exception { // 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2 创建和数据库之间的连接 String username = "root"; String password = "123456"; String url = "jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn = DriverManager.getConnection(url,username,password); // 3.准备发送SQL String sql = "select * from t_person"; PreparedStatement pstm = conn.prepareStatement(sql); // 4.执行SQL,接收结果集 ResultSet rs = pstm.executeQuery(); // 5 处理结果集 while(rs.next()){ /* rs.getXxx(列顺序从1开始) 或者 rs.getXxx("列名") 获取指定列的数据,Xxx为数据类型 实战中多使用列名,可读性强 */ /* int personId2 = rs.getInt(1); String personName2 = rs.getString(2); int age2 = rs.getInt(3); String sex2 = rs.getString(4); String mobile2 = rs.getString(5); String address2 = rs.getString(6); System.out.println("personId="+personId2+",personName="+personName2 +",age="+age2+",sex="+sex2+",mobile="+mobile2+",address="+address2); */ int personId1 = rs.getInt("person_id"); String personName1 = rs.getString("person_name"); int age1 = rs.getInt("age"); String sex1 = rs.getString("sex"); String mobile1 = rs.getString("mobile"); String address1 = rs.getString("address"); System.out.println("personId="+personId1+",personName="+personName1 +",age="+age1+",sex="+sex1+",mobile="+mobile1+",address="+address1); } // 6.释放资源 rs.close(); pstm.close(); conn.close(); } }
如图所示:
-
PreparedStatement常用方法
方法声明 作用 int executeUpdate(String sql) 可执行增,删,改,返回执行受到影响的行数 ResultSet executeQuery(String sql) 执行SQL查询,并返回ResultSet对象 boolean execute(String sql) 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。(只有执行查询才为true) -
ResultSet常用方法
方法声明 作用 boolean next() 游标下移,判断该行是否有结果 xx getXx(int index) 获取该行结果中某个字段的数据,index为编号,index从1开始 xx getXx(String name) 获取改行结果中某个字段的数据,name为字段名 xx为数据类型, 如图所示:
5 数据绑定
- 作用:数据绑定:将用户输入的数据,绑定到要执行的SQL语句中。
JDBC执行的SQL中的数据要根据用户的输入发生变化,比如 登录功能背后的查询sql要根据用户名不同,执行不同的条件。这就需要将用户输入的数据绑定到执行的SQL中。 - 准备工作:建表t_user 插入测试数据.
create table t_user( user_id int primary key auto_increment, username varchar(20) unique not null, password varchar(50) not null ); -- 添加测试数据 insert into t_user values(null,'Adair','123456');
如图所示:
1 字符串拼接SQL
- 步骤:
演示:根据用户输入的id进行查询。1. 在需要数据的地方,使用变量名替换。 2. 在变量名前添加"+,变量后添加+"。 3. 注意:如果拼接的是字符串,那么需要在"+之前添加' 在+"后添加'。
package com.txw.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner; public class JdbcTest02 { public static void main(String[] args) throws Exception{ // 用户输入数据 Scanner sc = new Scanner(System.in); String id = sc.nextLine(); // 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.创建链接 String dbUsername = "root"; String dbPassword = "123456"; String url = "jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn = DriverManager.getConnection(url,dbUsername,dbPassword); // 3.准备执行SQL String sql = "select * from t_user where user_id = "+id+";"; PreparedStatement pstm = conn.prepareStatement( sql ); // 4.执行SQL获取结果集 ResultSet rs = pstm.executeQuery(); // 5.处理结果集 while( rs.next() ){ Integer userId = rs.getInt("user_id"); String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(userId + "\t" + username + "\t" + password); } // 6.关闭资源 pstm.close(); conn.close(); } }
如图所示:
2、SQL注入问题
- 使用字符串拼接SQL出现的问题。
在进行查询操作时 恶意填入or 1=1 这类字符,使将要执行的sql变为无条件查询语句,泄漏数据或无法正确验证。
演示:
Scanner sc = new Scanner(System.in); String id = sc.nextLine();//输入 1 or 1=1 String sql = "select * from t_user where user_id = "+id+";"; //拼接后:select * from t_user where user_id =1 or 1=1
3、?占位符
- ?占位符是JDBC的一种特殊语法,专用于参数绑定,可以有效避免SQL注入问题。
使用步骤:
例:在数据库中插入用户输入的数据。1. 在需要使用数据的地方,使用?代替(占位)。 2. 发送sql前,通过pstm.setXXX(index,数据)方法给?赋值。 index:占位符编号,从1开始,表示第几个占位符。 xxx 为数据类型,需要根据数据库字段类型选择对应的赋值方法。
package com.txw.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Scanner; public class JdbcTest04 { public static void main(String[] args) throws Exception { // 用户输入数据 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String name = sc.next(); System.out.println("请输入年龄:"); int age = sc.nextInt(); System.out.println("请输入性别:(男/女)"); String sex = sc.next(); System.out.println("请输入手机号:"); String mobile = sc.next(); System.out.println("请输入地址:"); String address = sc.next(); // 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.创建和数据库之间的连接 String username = "root"; String password = "123456"; String url = "jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; Connection conn = DriverManager.getConnection(url,username,password); // 3.准备执行SQL,数据使用?占位 String sql = "insert into t_person values(null,?,?,?,?,?);"; PreparedStatement pstm = conn.prepareStatement(sql); // 为?占位符赋值 pstm.setString(1,name); pstm.setInt(2,age); pstm.setString(3,sex); pstm.setString(4,mobile); pstm.setString(5,address); // 4.执行SQL pstm.executeUpdate(); //5.关闭资源 pstm.close(); conn.close(); } }
如图所示:
演示:解决SQL注入问题。package com.txw.jdbc; import java.sql.*; import java.util.Scanner; public class JdbcTest05 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm = null; try { // 用户输入数据 Scanner sc = new Scanner(System.in); String id = sc.nextLine(); // 1.加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2.创建和数据库之间的连接 String username = "root"; String password = "123456"; String url = "jdbc:mysql://192.168.64.128:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai"; conn = DriverManager.getConnection(url,username,password); // 3.准备执行SQL,数据使用?占位 String sql = "select * from t_user where user_id = ? "; pstm = conn.prepareStatement( sql ); // 为?占位符赋值 pstm.setString(1,id); // 4.执行SQL ResultSet rs = pstm.executeQuery(); // 5.处理结果集 while( rs.next() ){ Integer userId = rs.getInt("user_id"); username = rs.getString("username"); password = rs.getString("password"); System.out.println(userId + "\t" + username + "\t" + password); } }catch (Exception e ){ e.printStackTrace(); }finally { // 6.关闭资源 try { pstm.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } try { conn.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } }
如图所示:
6 JDBC异常处理
- 定位问题(哪一行出错)
1. 添加打印语句,检查程序执行流程。 2. 根据异常信息定位(找到异常信息中关于自己写的代码部分)。
- 单元测试更容易定位问题
以某个小功能为单位进行测试,例如将用户输入的数据插入到数据库。 1. 完成用户输入的数据,测试运行。 2. 完成数据库Connection对象的创建,测试运行。 3. 准备执行SQL语句,测试运行。 4. 为?占位符赋值并执行SQL,测试运行。
- 根据异常日志分析
分析异常最高效的办法是阅读异常日志,根据异常日志的信息,可以快速定位问题的位置、问题的原因设置是问题的解决方案。
演示:
调试步骤:Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver at java.net.URLClassLoader.findClass(URLClassLoader.java:382) // 数字指的是代码行号 at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) at java.lang.ClassLoader.loadClass(ClassLoader.java:351) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.baizhi.test.ResultSetTest.main(ResultSetTest.java:8)
说明:阅读异常日志挑错是最有效的,但是对于初学者而言难度过高。刚开始不用急于求成,异常信息也非常有规范,在学习过程中慢慢提升异常阅读能力,最终掌握阅读异常信息的能力。1. 先看异常类型: ClassNotFoundException: com.mysql.cj.jdbc.Driver,说明是驱动类文件没有找到。 2. 再看异常位置: 自上而下看出现数字的行,找到自己写的代码。比如当前案例下:自己的代码 ResultSetTest.java第8行有问题,那么错误就在这里发生的。 3. 解决方案: com.mysql.cj.jdbc.Driver类没找到,这行代码是加载驱动类的,就一定要先找到对应的类。 4. 错误原因: 1.包名或类名可能写错了。 2.如果包名与类名完全正确,检查驱动jar包没有导入当前项目中。
- 快速掌握JDBC中的常见异常处理方案
JDBC的异常其实还是非常固定的,就那么几种:类加载问题、数据库用户名密码错误、sql语法错误、绑定数据错误、获取数据错误…
有1个办法可以快速的掌握JDBC中的异常:
站在上帝视角,人为的造错,观察记录异常信息,日后出现时可以快速调错。
- 概念:JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。如图所示:
-
Java JDBC连接Oracle 11g的jar包
2016-09-18 17:19:29Java JDBC连接Oracle 11g的jar包 -
Oracle的JDBC驱动官方完全版
2014-08-21 14:12:06因为Oracle的JDBC驱动 ojdbc12,ojdbc14 很古老了,是针对JDK1.2以及JDK1.4平台的。很多时候会有各种问题,所以从官网下载了最新的驱动,包括支持JDK1.5的ojdbc5.jar, 以及 支持JDK1.6的ojdbc6.jar驱动包,以及官方demo... -
jdbc连接hive数据库的驱动jar包
2016-09-19 11:21:04jdbc连接hive数据库的jar包.整理可用合集. -
DB2的JDBC驱动包
2014-05-27 10:21:15链接DB2数据库的时候采用的JDBC驱动包 -
spring+mybatis+sharding-jdbc 整合
2016-03-19 14:48:38下载后要jdk1.7 ,sql也在conf下,文档在http://blog.csdn.net/linuu/article/details/50929904 -
sqljdbc.jar和sqljdbc4.jar
2013-06-12 12:16:11sqljdbc.jar和sqljdbc4.jar,经过实践,非常好用!! -
使用JDBC连接MySQL数据库
2021-12-13 11:23:20用五种方式使用JDBC连接MySQL数据库!!!目录
1、JDBC概述
1.1 JDBC介绍
JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,(java.sql,javax.sql)使用这些类库可以以一种标准的方法、方便地访问数据库资源。
JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
如果没有JDBC,那么Java程序访问数据库时是这样的:
有了JDBC,Java程序访问数据库时是这样的:
1.2 JDBC体系结构
JDBC接口(API)包括两个层次:
面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)
面向数据的API:Java Driver API,供开发商开发数据库驱动程序用
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。不同的数据库厂商,需要针对这套接口,提供不同的实现。不同的实现的集合,即为不同数据库的驱动--------面向接口编程
1.3 JDBC程序编写步骤
补充:ODBC(Open Database Connectivity,开放式数据库连接),是微软在Windows平台下推出的。使用者在程序中只需要调用ODBC API,由 ODBC 驱动程序将调用转换成为对特定的数据库的调用请求。
2、连接要素
2.1 Driver 接口实现类
2.1.1 Driver 接口介绍
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
MySQL的驱动: com.mysql.jdbc.Driver
附上下载地址:密码:1234idea导入MySQL驱动步骤:
2.1.2 加载与注册JDBC驱动
加载驱动:加载 JDBC 驱动需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名
Class.forName(“com.mysql.jdbc.Driver”);
注册驱动:DriverManager 类是驱动程序管理器类,负责管理驱动程序
使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实 例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
2.2 URL
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的 驱动程序,从而建立到数据库的连接。
JDBC URL的标准由三部分组成,各部分间用冒号分隔。
jdbc:子协议:子名称
协议:JDBC URL中的协议总是jdbc
子协议:子协议用于标识一个数据库驱动程序
子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名比如:
MySQL的连接URL编写方式:
jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值
jdbc:mysql://localhost:3306/test
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8(如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集)
jdbc:mysql://localhost:3306/test?user=root&password=1234562.3 用户名和密码
user,password可以用“属性名=属性值”方式告诉数据库
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接3、连接数据库方式
3.1 连接方式一
@Test public void testConnection1() { try { //1.提供java.sql.Driver接口实现类的对象 Driver driver = null; driver = new com.mysql.jdbc.Driver(); //2.提供url,指明具体操作的数据 String url = "jdbc:mysql://localhost:3306/test"; //3.提供Properties的对象,指明用户名和密码 Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "123456"); //4.调用driver的connect(),获取连接 Connection conn = driver.connect(url, info); System.out.println(conn); } catch (SQLException e) { e.printStackTrace(); } }
说明:上述代码中显式出现了第三方数据库的API
3.2 连接方式二
@Test public void testConnection2() { try { //1.实例化Driver String className = "com.mysql.jdbc.Driver"; Class clazz = Class.forName(className); Driver driver = (Driver) clazz.newInstance(); //2.提供url,指明具体操作的数据 String url = "jdbc:mysql://localhost:3306/test"; //3.提供Properties的对象,指明用户名和密码 Properties info = new Properties(); info.setProperty("user", "root"); info.setProperty("password", "123456"); //4.调用driver的connect(),获取连接 Connection conn = driver.connect(url, info); System.out.println(conn); } catch (Exception e) { e.printStackTrace(); } }
说明:相较于方式一,这里使用反射实例化Driver,不在代码中体现第三方数据库的API。体现了面向接口编程思想。
3.3 连接方式三
@Test public void testConnection3() { try { //1.数据库连接的4个基本要素: String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; String driverName = "com.mysql.jdbc.Driver"; //2.实例化Driver Class clazz = Class.forName(driverName); Driver driver = (Driver) clazz.newInstance(); //3.注册驱动 DriverManager.registerDriver(driver); //4.获取连接 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } catch (Exception e) { e.printStackTrace(); } }
说明:使用DriverManager实现数据库的连接。体会获取连接必要的4个基本要素。
3.4 连接方式四
@Test public void testConnection4() { try { //1.数据库连接的4个基本要素: String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; String driverName = "com.mysql.jdbc.Driver"; //2.加载驱动 (①实例化Driver ②注册驱动) Class.forName(driverName); //Driver driver = (Driver) clazz.newInstance(); //3.注册驱动 //DriverManager.registerDriver(driver); /* 可以注释掉上述代码的原因,是因为在mysql的Driver类中声明有: static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException var1) { throw new RuntimeException("Can't register driver!"); } } */ //3.获取连接 Connection conn = DriverManager.getConnection(url, user, password); System.out.println(conn); } catch (Exception e) { e.printStackTrace(); } }
说明:不必显式的注册驱动了。因为在DriverManager的源码中已经存在静态代码块,实现了驱动的注册。
3.5 连接方式五(推荐使用)
在工程的src目录下新建配置文件:jdbc.properties
user=root password=123455 url=jdbc:mysql://localhost:3306/test driverClass=com.mysql.jdbc.Driver
说明:使用配置文件的方式保存配置信息,在代码中加载配置文件
使用配置文件的好处:
①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
②如果修改了配置信息,省去重新编译的过程。@Test public void testConnection5() throws Exception { //1.加载配置文件 InputStream is = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties"); Properties pros = new Properties(); pros.load(is); //2.读取配置信息 String user = pros.getProperty("user"); String password = pros.getProperty("password"); String url = pros.getProperty("url"); String driverClass = pros.getProperty("driverClass"); //3.加载驱动 Class.forName(driverClass); //4.获取连接 Connection conn = DriverManager.getConnection(url,user,password); System.out.println(conn); }
输出以下结果表示连接成功
-
SpringBoot 使用JDBC
2022-01-17 22:52:02SpringBoot 使用JDBC 我超,又要开始了。太久不写,全忘完了,就当 Remake 了! 1. 使用JDBC SringBoot 对数据层进行访问,无论是 SQL(关系型数据库)还是 NoSQL(非关系型数据库),其底层都是采用 Spring Data 的... -
如何基于zeppelin JDBC Interpreter进行jdbc数据源的可视化交互分析
2022-01-13 15:01:13Zeppelin 是一个基于Web的...通过zeppelin的JDBC Interpreter,可以针对所有jdbc数据源进行可视化交互分析,JDBC Interpreter目前除支持主流的RMDB数据库外,还支持基于spark、flink、hive计算框架进行SQL分析。 -
Java之JDBC安装、使用详解(2021最新!)
2021-04-10 14:17:32JDBC安装以及使用详解JDBC概念JDBC下载安装下载JDBC安装JDBC详细步骤常用数据库URL地址的写法:Connection对象三种执行对象:用于将 SQL 语句发送到数据库中StatementPreparedStatementCallableStatement执行SQL语句... -
Sharding-JDBC(三)Sharding-JDBC分片原理
2022-02-09 16:35:30Sharding-JDBC(三)Sharding-JDBC分片原理 -
Flink JDBCSink使用及源码解析
2021-02-28 19:44:50Flink JDBCSink的使用 flink提供了JDBCSink方便我们写入数据库,以下是使用案例: pom依赖 需要引入flink-connector-jdbc的依赖。另外,我这里是写入mysql,所以还引入了mysql的驱动包 <dependency> <... -
sqlite-jdbc-3.8.11.2.jar
2015-11-13 23:15:06sqlite-jdbc-3.8.11.2.jar -
sqlserver 2008R2的jdbcjar包
2015-09-29 09:05:35sqlserver 2008R2的工具jar包,在学习或者工作中jar包是连接sqlserver 2008R2的纽带,比如JAVA举例,在编码中如果不导入这个jar包,会爆出很多的错误, -
Sharding-JDBC(一)Sharding-JDBC实现分库分表简介
2022-02-09 15:27:37Sharding-JDBC(一)Sharding-JDBC实现分库分表简介 -
tomcat-jdbc数据源所需jar包tomcat-jdbc.jar+tomcat-juli.jar
2013-12-05 14:21:06使用tomcat-jdbc数据源所需要使用的两个jar包文件,只需要添加这两个jar包就可以了 -
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法
2022-03-20 20:00:50在使用MySQL驱动进行JDBC时候出现了以下异常 Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. at sun....