Java面试手册:JDBC

什么是JDBC

Java数据库连接,简称JDBC(java Database Connectivity),是一种用于执行SQL语句的java API,它由一组java编写的类和接口组成。JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据的开发人员能够用纯java API编写数据库应用程序。

  • 有了JDBC 向各种关系型数据库发送SQL语句就是一件很容易的事。是一个独立于数据库的管理系统,提供了通用的SQL数据库存取操作的接口(CRUD:Create Read Update Delete),定义了一组同一标准,为访问不同数据库提供同一途径。它是由sum公司开发的一套系统组件,供开发者直接调用。
程序是如何同数据库进行沟通的

  • 数据库本身就是一个独立运行的应用程序,编写应用程序就是利用网络通信协议与数据库进行命令交换,来进行命令的增删查找。双层架构

  • 问题的重点在于,你的应用程序如何调用这组程序库?
    • 因为每个数据库的通常有不同的通信协议,用于连接不同数据库在API上也会有所不同
    • JDBC 基本上就是用来解决这些问题,当应用程序需要练级数据库就调用这组标准的API,而标准的API中的接口由数据库厂商实现,通常称为JDBC驱动程序(Driver)。
    • 三层架构
JDBC分为两部分
  • JDBC 应用程序开发者接口((ApplicationDeveloper Interface)
  • JDBC 驱动程序开发者接口 (Driver Developer Interface)),驱动程序接口是数据库厂商要实现驱动程序时的规范,一般开发者并不用了解。

使用JDBC代码进行数据库连接处理:

开发应用程序过程中,如果要操作数据库,我们是通过JDBC所提供的接口来实现设计程序的,理论上必须更换数据库的时候,应用程序不用修改,直接更换数据库驱动程序实现数据库的更换。

Connection conn = DriverManager.getConnection(....);  //驱动
Statement st = conn.createStatement();  //声明
ResultSet rs = st.executeQuery("select * from T_user"); //executeQuery 执行命令

假设这段代码是连接MySQL数据库,你会需要在Classpath中设置MySQL;对应JDBC的驱动程序。
具体来说,就是在Classpath 中设置一个JAR文件此时应用程序、JDBC 与数据库的关系如下图所示。

  • 连接MySQL 数据库
  • 连接Oracle 数据库
JDBC体系结构:java访问各种关系型数据库的一系列API,功能包括

1、建立数据库连接

2、创建SQL语句

3、执行SQL语句

4、查看或修改结果

具体的方法:

代码实例:Connection  conn =  DriverManager.getConnection("URL",“user”,"password")url:数据库地址,jdbc:mysql://localhost:/database(数据库名字)?useUnicode=true&characterEncoding=UTF-8 //在数据库名字后面最好加入utf—8

user:数据库用户名

password:数据库密码

oracle:连接驱动://Connection  conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:dabase",“user”,“password”)
  • executeQuery():运行select 语句,返回ResultSet 结果集。
  • executeUpdate():运行 insert、delete、update的操作,返回更新的行数。
  • true:表示 SQL执行返回的结果是resultSet类型(select)
  • 表示 SQL执行返回的结果不是是resultSet类型 (insert,delete,update)
  • Statement :执行SQL语句:并且返回他所生成的结果对象:Statement,由createStatement创建,用于发送简单的sql语句(不带参数):不使用,而使用它的子类PreparedStatement
  • PreparedStatement接口:用于发送一个或者多个输入参数的sql语句,它的父类是Statement,但是其效率更高, 并且可以防止SQL注入,因此我们一般都用prepareStatement.
  • CallableStatement,继承prepareStatement,由preParCall创建, 用于调用存储过程。
  • execute():运行语句返回是否有结果集:true/false, 不过该方法很少用来返回结果集,因为容易发生SQL注入
  • 我们常用的是:
  • DriverManager:驱动管理
  • Connection:连接与特定数据库的连接(会话),在连接上下文中执行SQL语句并且返回结果
  • DriverManager 的 getConnection()方法是建立JDBC URL中定义的数据库在Connection 连接的(连接对象内部其实包含了Socket对象,是一个远程连接,比较耗时,这是Connection对象管理的一个要点, 在实际开发中,为了提高效率,我们使用连接池来管理连接对象)
使用JDBC的步骤

  • 导入jar包 :MySQL-connector-java-5.1.33-bin.jar
  • 编写代码:
    • name="root";
    • password= "1121"
    • url = "jdbc:mysql://localhost:/database(数据库名字)?useUnicode=true&characterEncoding=UTF-8"
    • driveClassName = "com.mysql.jdbc.Driver"
    • 编写连接MySQL的四大参数
  • 加载MySQL的驱动类
    • class.forName(driveClassName)
  • 获取MySQL数据库的连接对象
    • Connection conn = DriveManger.getConnection(url,name,password);
  • 向MySQL数据库发送SQL语句
    • String sql = "insert into dept values(65,"tt","oo")";
    • Statement stmt = conn.createStatement();
    • int result = stmt.executeUpdate(sql);
  • 查询语句的话,读取结果集中的数据
  • 关闭MySQL数据库相关的连接
    • stmt.close();
    • conn.close();
  • 用到的对象:
    • Result executeQuery(String sql) :返回结果集
    • int stmt.executeUpdate(sql) : 返回返回更新数据
    • DriverManager (管理JDBC驱动程序):getConnection(String url,name,password)
    • Connection(管理连接):conn.createStatement()
    • Statement (执行静态SQL语句):
  • ResultSet(查询数据库得到的结果集):将结果集封装成类
    • next()
    • first()
    • last()
    • previous()
    • relative(int rows)
    • absolute(int row)
    • 移动光标:
    • 获取字段: getxxx();
JDBC 连接池:相当于容器

  • Connection 连接的弊端,每次连接都要验证密码和用户名,用完后由被关闭,当下次执行的时候又再次连接,这样既耗时又浪费资源(可以比较为一次性手机和公共电话),为了提高程序效率我们使用连接池。
  • 数据库连接池基本思想:为数据库建立缓冲池(连接的集合),预先在里面方一定数量的的连接对象,当Java application(应用程序)需要获取数据库连接时,直接从连接池中取一个出来,用完后不关闭,再放到池中,重复利用,做到资源共享。
  • JDBC 提供了DataSource接口来使用数据库连接池,但是JDBC没用对该接口进行实现,但是在实际开发中我们不需要自己实现,直接利用第三方工c3p0 就可以完成。
  • c3p0是在JDBC的第二步使用,替换连接步骤。
    • c3p0产生的类和原生的类不一样,前者是代理连接数据库,后者是直接连接数据库
    • 关闭释放资源的方式不同,c3p0这个时候调用的close()方法不是扔掉,而是还回连接池.
  • c3p0 使用步骤:
    • 导入c3p0jar 包
    • 创建C3P0数据源
    • 设置数据库属性(url , user. password)
    • 加载驱动(不用class.forName())
    • 设置初始化的连接数(连接池大小):最大连接数(虽然连接池的初始化连接是10,但是当链接不够时还可以重新申请,直到上限,如果超过上限,则等待),和最小连接(2)
  • C3P0—config.xml 文件名不能修改,放置在src路径下
    • name—config.xml 标签的name属性不可以自定义
    • property 标签的name属性不能修改
    • Property 标签内部的值不能加双引号
  • DBUtils工具:简化JDBC代码,查询数据,可以完成自动封装,但是只能单表查询封装,多表关联无法封装,多表关联封装以后MyBatis 框架或者Hibernate 框架来完成。
    • 自动封装的原理:通过反射机制创建目标对象,必须调用无参构造,实体类必须有一个无参构造,属性必须有stter方法
注意

  • 提供SQL占位符:用?代替参数。
    • String sql = "update card set name = ? ,classs= ? where cno= ?";
  • 关于SQL注入:
    • 原理:利用系统没有对用户输入的数据进行充分验证,在用户输入的信息中注入非法SQL语句,从而利用系统的sql引擎完成恶意行为的做法。
    • 解决方案:占位符替换,也不用拼接sql语句。定义子类。
  • 在数据库中保存图片(音频 视频):(图片音视频都是以二进制的形式保存在数据库中(选择适合的类型,注意资源大小),二进制保存类型有(只是大小不同)tinyblob:255kb 、blob:65kb 、mediublob: 16M )
  • JDBC 事务:(一般框架里面都有,具体写代码的时候不用自己去写)
    • 关闭自动提交 //setAutoCommit(false);
    • 手动提交 //conn.commit();
    • 回滚 //conn.rollback();
  • 硬编码:是将数据库信息写死在程序中,每次修改信息,都需要重新编译java程序;一般会将数据库的连接信息提取出来放在配置文件里面,java程序只需要读取配置文件就、就可以了。
  • 写底层框架的条件:(学会看源码)1.xml解析 2.反射 3. 接口---->实现类
  • 框架:就是工具,提高编写效率(类似于洗衣机) 按照正确的步骤操作。
  • 异常处理:1,自己处理(try catch 自己处理)。 2,抛出给上级 。类似于公司出问题自己处理或者上级处理,但是最高是JVM。
  • 关于封装:当一个代码多次重复执行,那么我们可以将它封装成一个类,一个方法多次被调用,那么将他放到静态代码块中。
  • java 中对数据库的操作时,一般是建立一个模型类,将数据库的表映射到模型类,然后以面向对象的操作方法来处理。

原文发布于微信公众号 - Java大联盟(javaunion)

原文发表时间:2018-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏个人分享

HBase体系结构

HBase的服务器体系结构遵从简单的主从服务器架构,它由HRegion服务器(HRegion Service)群和HBase Master服务器(HBase M...

1363
来自专栏好好学java的技术栈

java工程师必备linux常用命令,这篇文章就够了

bash 是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell — 这是关于Bourne shell(sh)...

2351
来自专栏Laoqi's Linux运维专列

KVM虚拟主机管理篇

5053
来自专栏程序员互动联盟

【专业技术】8大你不得不知的Android调试工具

1. 查看当前堆栈 1) 功能:在程序中加入代码,使可以在logcat中看到打印出的当前函数调用关系 2) 方法: new Exception(“print ...

58513
来自专栏陈满iOS

iOS下载报错:App Transport Security has blocked a cleartext HTTP

以上方法虽然解决了HTTP不能正常使用的问题,但是苹果提供的安全保障也被关闭了,对于不支持HTTPS协议的网站,可以考虑白名单:

3664
来自专栏云计算教程系列

如何在Ubuntu 16.04上的三节点集群上部署CockroachDB

CockroachDB是一个开源的分布式SQL数据库,提供一致性、可伸缩性和生存性。

1372
来自专栏有趣的Python

最新Django2.0.1在线教育零基础到上线教程(五)1-3

演示地址: http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGe...

5966
来自专栏你不就像风一样

深入理解跨域SSO原理与技术

​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登...

1601
来自专栏安恒网络空间安全讲武堂

IAT Hook 技术分析

来源:https://pentest.blog/offensive-iat-hooking/

1572
来自专栏Java编程技术

MySQL 中基于 XA 实现的分布式事务

Xa主要规定了RM与TM之间的交互,下面来看下XA规范中定义的RM 和 TM交互的接口:

1063

扫码关注云+社区