当前位置:网站首页>【JDBC Part 1】概述、获取连接、CRUD
【JDBC Part 1】概述、获取连接、CRUD
2022-07-07 21:33:00 【Sivan_Xin】
文章目录
代码已上传: JDBC代码仓库
01:JDBC概述
笔记要求:通过看笔记可以写出程序即可。
在Java中,数据库存取技术可分为如下几类:
JDBC直接访问数据库
JDO (Java Data Object )技术
第三方O/R工具,如Hibernate, Mybatis 等
JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封装了JDBC。
JDBC接口(API)包括两个层次:
- 面向应用的API:Java API,抽象接口,供应用程序开发人员使用(连接数据库,执行SQL语句,获得结果)。
- 面向数据库的API:Java Driver API,供开发商开发数据库驱动程序用。
JDBC是sun公司提供一套用于数据库操作的接口,java程序员只需要面向这套接口编程即可。
不同的数据库厂商,需要针对这套接口,提供不同实现。不同的实现的集合,即为不同数据库的驱动。 ————面向接口编程
JDBC程序编写步骤
Java与SQL对应数据类型转换表
02:获取数据库连接
在实际操作中,会将数据库需要的4个基本信息加载到配置文件中。
说明:使用配置文件的方式保存配置信息,在代码中加载配置文件。使用配置文件的好处:
①实现了代码和数据的分离,如果需要修改配置信息,直接在配置文件中修改,不需要深入代码
②如果修改了配置信息,省去重新编译的过程。
要素一:Driver接口实现类
java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。
- 加载与注册JDBC驱动
MySQL的驱动:com.mysql.cj.jdbc.Driver
。
加载驱动:
需调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名 Class.forName(“com.mysql.cj.jdbc.Driver”);
注册驱动:
DriverManager 类是驱动程序管理器类,负责管理驱动程序使用DriverManager.registerDriver(com.mysql.jdbc.Driver)来注册驱动。
通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例,因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例。
下图是MySQL的Driver实现类的源码:
要素二:URL
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到 数据库的连接。
MySQL的连接URL方式:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc:mysql :协议
localhost:ip地址
3306:默认mysql的端口号
test:test数据库
要素三:用户名和密码
user,password可以用“属性名=属性值”方式告诉数据库 。
最后调用 DriverManager 类的 getConnection() 方法建立到数据库的连接。
03:使用PreparedStatement实现CRUD操作
C:create、R:Retrieve、U:Update、D:Delete。
PrepareStatement的介绍
- 可以通过调用 Connection 对象的 preparedStatement(String sql) 方法获取PreparedStatement 对象
- PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句 。
- PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用PreparedStatement 对象的 setXxx() 方法来设置这些参数.。
- setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。
PreparedStatement vs Statement
代码的可读性和可维护性。
PreparedStatement 能最大可能提高性能:
DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存。这样每执行一次都要对传入的语句编译一次。
(语法检查,语义检查,翻译成二进制命令,缓存)
PreparedStatement 可以防止 SQL 注入
使用PreparedStatement实现增删改操作的步骤
- 获取数据库连接。
- 预编译sql语句,返回PreparedStatement。
- 填充占位符。
- 执行execute()方法执行操作。
- 关闭资源。
使用PreparedStatement实现查找操作
- 获取数据库连接。
- 预编译sql语句,返回PrepareStatement。
- 填充占位符。
- 执行executeQuery()方法执行操作,并返回结果集。
- 返回结果集的元数据,以便获取列数、列名。
- 使用反射,给动态对象的columnName属性赋值为columnValue。以便返回查询结果。(第6条这里用到了ORM思想)
需要用到ResultSet与ResultSetMetaData:
Result:
- 查询需要调用PreparedStatement 的 executeQuery() 方法,查询结果是一个ResultSet 对象
- ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商提供实现 ResultSet 返回的实际上就是一张数据表。有一个指针指向数据表的第一条记录的前面。
- ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象 的 next() 方法移动到下一行。调用 next()方法检测下一行是否有效。若有效,该方法返回 true,且指针下移。 相当于Iterator对象的 hasNext() 和 next() 方法的结合体。
- 当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一列的值。
例如: getInt(1), getString(“name”)
注意:Java与数据库交互涉及到的相关Java API中的索引都从1开始。
ResultSetMetaData:
- 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
ResultSetMetaData meta = rs.getMetaData()
;getColumnName(int column)
:获取指定列的名称getColumnLabel(int column)
:获取指定列的别名getColumnCount()
:返回当前 ResultSet 对象中的列数。
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。 getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。 isNullable(int column):指示指定列中的值是否可以为 null。
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。
小结
- 两种思想
面向接口编程的思想
ORM思想(object relational mapping)
一个数据表对应一个java类
表中的一条记录对应java类的一个对象
表中的一个字段对应java类的一个属性
- 两种技术
JDBC结果集的元数据:ResultSetMetaData
获取列数:getColumnCount()
获取列的别名:getColumnLabel()
通过反射,创建指定类的对象,获取指定的属性并赋值
- 查找操作的流程示意图:
边栏推荐
- 浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
- The difference between NPM uninstall and RM direct deletion
- 恶魔奶爸 A0 英文零基础的自我提升路
- 恶魔奶爸 C
- Restore backup data on persistent volumes
- EasyUI date control emptying value
- 95年专注安全这一件事 沃尔沃未来聚焦智能驾驶与电气化领域安全
- Codesonar enhances software reliability through innovative static analysis
- The little money made by the program ape is a P!
- Codeforces 474 F. Ant colony
猜你喜欢
Demon daddy B3 read extensively in a small amount, and completed 20000 vocabulary+
Onespin | solve the problems of hardware Trojan horse and security trust in IC Design
Problems encountered in installing mysql8 for Ubuntu and the detailed installation process
95年专注安全这一件事 沃尔沃未来聚焦智能驾驶与电气化领域安全
Ubuntu安装mysql8遇到的问题以及详细安装过程
Goal: do not exclude yaml syntax. Try to get started quickly
Ten thousand word summary data storage, three knowledge points
Navicat connect 2002 - can't connect to local MySQL server through socket '/var/lib/mysql/mysql Sock 'solve
Redis - basic use (key, string, list, set, Zset, hash, geo, bitmap, hyperloglog, transaction)
程序猿赚的那点钱算个P啊!
随机推荐
特征生成
Demon daddy A1 speech listening initial challenge
Unity3d 4.3.4f1执行项目
恶魔奶爸 指南帖——简易版
SQL注入报错注入函数图文详解
AADL inspector fault tree safety analysis module
Use br to recover backup data on azure blob storage
Object-C programming tips timer "suggestions collection"
Hoj 2245 planktonic triangle cell (Mathematics)
Mahout-Pearson correlation的实现
部署、收回和删除解决方式—-STSADM和PowerShell「建议收藏」
单词反转实现「建议收藏」
Use camunda to do workflow design and reject operations
Codeforces Round #296 (Div. 2) A. Playing with Paper[通俗易懂]
[C language] advanced pointer --- do you really understand pointer?
Solve the problem of using uni app mediaerror mediaerror errorcode -5
Hdu4876zcc love cards (multi check questions)
POJ 3140 contents division "suggestions collection"
Codesonar Webinar
Codesonar enhances software reliability through innovative static analysis