jdbc 订阅
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。 展开全文
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
信息
简    称
JDBC
类    别
应用程序接口
中文名
Java数据库连接
外文名
Java Database Connectivity
Java数据库连接程序类型
JDBC驱动程序共分四种类型:JDBC-ODBC桥这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。本地API驱动这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。网络协议驱动这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。本地协议驱动这种类型的驱动使用Socket,直接在客户端和数据库间通信。
收起全文
精华内容
下载资源
问答
  • jdbc
    万次阅读 热门讨论
    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:服务器关闭非交互连接之前等待活动的秒数。

    解决方法如下:

    1. 修改数据库连接配置在数据库连接上,加“&autoReconnect=true&failOverReadOnly=false”配置,但是mysql4以下的版本有效,mysql5以上的无效。
    2. 修改数据库连接有效时间,在数据库配置上设置,把数据库连接有效时间设置长一点,比如设置12小时或者24小时。**方法:**在MySql的配置文件my.ini或者mysql.xml的配置文件里边加上interactive_timeout=388000wait_timeout=388000即可!

    本作者以上问题解决不了!!!!

    继续往下看!

    继续往下看还有几个原因:

    1. Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    2. Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
    3. 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’” ,就可以连接到数据库了。更高版本。

    到此本作者的问题就已经解决啦!!!

    暂时未发现其他的错误,发现错误的小伙伴,欢迎在下方的评论区留言,互相交流经验!!!

    更多相关内容
  • jdbc-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:27
    SQLSERVER数据库连接jar/jdbc包: sqljdbc4-4.0.jar
  • 亲测, 已破解Access_JDBC30.jar 无查询次数限制, 无最大1000行限制, 已经完全破解.
  • jdbc

    万次阅读 多人点赞 2020-06-02 13:08:52
    文章目录一,什么是JDBC二,JDBC的原理三,程序员,JDBCJDBC驱动的关系及说明四,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。

    展开全文
  • jdbc-odbc驱动包,提示找不到驱动,java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver,解决办法!因为jdk1.8环境不支持sun.jdbc.odbc.JdbcOdbcDriver驱动,所以这里为特别为您提供一个解决JDK1.8不...
  • sqlserver数据库连接驱动包 sqljdbc4-4.0.jar,摘要必须大于50个字节!
  • kettle 链接SQL server驱动,高版本的jdk建议使用 sqljdbc4,其他的建议使用 sqljdbc。 kettle 链接数据库必须的。
  • mysql-connector-java-5.1.34.jar,mysql 5.6 5.7可以用
  • mysql8.0版本jdbc驱动jar包,支持mysql8.0新版本驱动。。
  • SpringBoot+Sharding-JDBC分库分表实战

    千人学习 2018-12-19 10:19:04
  • hana jdbc 驱动

    2017-11-17 12:48:05
    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 驱动hana...
  • JDBC介绍

    万次阅读 多人点赞 2021-10-14 13:37:40
    1 JDBC简介 概念:JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。如图所示: 此前我们学习过SQL后,可以通过 ...

    1 JDBC简介

    • 概念:JDBC(Java DataBase Connectivity) :Java数据库连接技术:具体讲就是通过Java连接广泛的数据库,并对表中数据执行增、删、改、查等操作的技术。如图所示:在这里插入图片描述
      此前我们学习过SQL后,可以通过 NavicatSQLyog等图形化客户端发送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.05.6, 5.7, 8.0JDK 8.0 或更高
      5.15.6, 5.7, 8.0JDK 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. 加载驱动
      2. 获取链接
      3. 准备SQL以及发送SQL的工具
      4. 执行SQL
      5. 处理结果集
      6. 释放资源
      
      1.打开IDEA如图所示的界面,点击Create New Project。 在这里插入图片描述
      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
    • 步骤:
      1. 在需要数据的地方,使用变量名替换。
      2. 在变量名前添加"+,变量后添加+"。
      3. 注意:如果拼接的是字符串,那么需要在"+之前添加' 在+"后添加'。
      
      演示:根据用户输入的id进行查询。
    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. 定位问题(哪一行出错)
      1. 添加打印语句,检查程序执行流程。
      2. 根据异常信息定位(找到异常信息中关于自己写的代码部分)。
      
    2. 单元测试更容易定位问题
      以某个小功能为单位进行测试,例如将用户输入的数据插入到数据库。
      1. 完成用户输入的数据,测试运行。
      2. 完成数据库Connection对象的创建,测试运行。
      3. 准备执行SQL语句,测试运行。
      4. 为?占位符赋值并执行SQL,测试运行。
      
    3. 根据异常日志分析
      分析异常最高效的办法是阅读异常日志,根据异常日志的信息,可以快速定位问题的位置、问题的原因设置是问题的解决方案。
      演示:
      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包没有导入当前项目中。
      
      说明:阅读异常日志挑错是最有效的,但是对于初学者而言难度过高。刚开始不用急于求成,异常信息也非常有规范,在学习过程中慢慢提升异常阅读能力,最终掌握阅读异常信息的能力。
    4. 快速掌握JDBC中的常见异常处理方案
      JDBC的异常其实还是非常固定的,就那么几种:类加载问题、数据库用户名密码错误、sql语法错误、绑定数据错误、获取数据错误…
      有1个办法可以快速的掌握JDBC中的异常:
      站在上帝视角,人为的造错,观察记录异常信息,日后出现时可以快速调错。
    展开全文
  • Java JDBC连接Oracle 11g的jar包

    热门讨论 2016-09-18 17:19:29
    Java 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:04
    jdbc连接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:11
    sqljdbc.jar和sqljdbc4.jar,经过实践,非常好用!!
  • 使用JDBC连接MySQL数据库

    千次阅读 热门讨论 2021-12-13 11:23:20
    用五种方式使用JDBC连接MySQL数据库!!!

    目录

    1、JDBC概述

            1.1 JDBC介绍

            1.2 JDBC体系结构

            1.3 JDBC程序编写步骤

    2、连接要素

            2.1 Driver 接口实现类

            2.2 URL

            2.3 用户名和密码

    3、连接数据库方式

            3.1 连接方式一

            3.2 连接方式二

            3.3 连接方式三

            3.4 连接方式四

            3.5 连接方式五(推荐使用)


    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
                    附上下载地址:密码:1234

    idea导入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=123456

            2.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:02
    SpringBoot 使用JDBC 我超,又要开始了。太久不写,全忘完了,就当 Remake 了! 1. 使用JDBC SringBoot 对数据层进行访问,无论是 SQL(关系型数据库)还是 NoSQL(非关系型数据库),其底层都是采用 Spring Data 的...
  • Zeppelin 是一个基于Web的...通过zeppelin的JDBC Interpreter,可以针对所有jdbc数据源进行可视化交互分析,JDBC Interpreter目前除支持主流的RMDB数据库外,还支持基于spark、flink、hive计算框架进行SQL分析。
  • Java之JDBC安装、使用详解(2021最新!)

    万次阅读 多人点赞 2021-04-10 14:17:32
    JDBC安装以及使用详解JDBC概念JDBC下载安装下载JDBC安装JDBC详细步骤常用数据库URL地址的写法:Connection对象三种执行对象:用于将 SQL 语句发送到数据库中StatementPreparedStatementCallableStatement执行SQL语句...
  • Sharding-JDBC(三)Sharding-JDBC分片原理

    千次阅读 2022-02-09 16:35:30
    Sharding-JDBC(三)Sharding-JDBC分片原理
  • Flink JDBCSink使用及源码解析

    千次阅读 2021-02-28 19:44:50
    Flink JDBCSink的使用 flink提供了JDBCSink方便我们写入数据库,以下是使用案例: pom依赖 需要引入flink-connector-jdbc的依赖。另外,我这里是写入mysql,所以还引入了mysql的驱动包 <dependency> <...
  • sqlite-jdbc-3.8.11.2.jar

    热门讨论 2015-11-13 23:15:06
    sqlite-jdbc-3.8.11.2.jar
  • sqlserver 2008R2的jdbcjar包

    千次下载 热门讨论 2015-09-29 09:05:35
    sqlserver 2008R2的工具jar包,在学习或者工作中jar包是连接sqlserver 2008R2的纽带,比如JAVA举例,在编码中如果不导入这个jar包,会爆出很多的错误,
  • Sharding-JDBC(一)Sharding-JDBC实现分库分表简介
  • tomcat-jdbc数据源所需jar包tomcat-jdbc.jar+tomcat-juli.jar

    千次下载 热门讨论 2013-12-05 14:21:06
    使用tomcat-jdbc数据源所需要使用的两个jar包文件,只需要添加这两个jar包就可以了
  • 在使用MySQL驱动进行JDBC时候出现了以下异常 Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. at sun....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,260,163
精华内容 504,065
关键字:

jdbc