jdbc的基本操作(API的使用与操作详解)
jdbc的基本操作(API的使用与操作详解)
2024-06-27 05:41:17  作者:情歌男亽  网址:https://m.xinb2b.cn/sport/puv396269.html
1、引入jdbc驱动程序

1.1如何获取JDBC驱动程序

驱动程序由数据库提供商提供下载。

MySQL的驱动下载地址:http://dev.mysql.com/downloads/

1.2如何在Java Project项目应用中添加数据库驱动jar

(1)把mysql-connector-java-5.1.36-bin.jar拷贝到项目中一个目录中。

jdbc的基本操作(API的使用与操作详解)(1)

(2)添加到项目的类路径下在驱动jar上右键-->Build Path-->Add to Build Path。

jdbc的基本操作(API的使用与操作详解)(2)

注意:如果是Dynamic Web Project(动态的web项目)话,则是把驱动jar放到WebContent(有的开发工具叫Webroot)目录中的WEB-INF目录中的lib目录下即可。

jdbc的基本操作(API的使用与操作详解)(3)

2、加载并注册驱动

加载并注册驱动:

加载驱动,把驱动类加载到内存

注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。

2.1 Driver接口

Java.SQL.Driver 接口是所有 JDBC 驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。

MySQL:com.mysql.jdbc.Driver

SQLServer:com.microsoft.sqlserver.jdbc.SQLServerDriver

oracle:oracle.jdbc.driver.OracleDriver

2.2编写加载与注册驱动的代码

1)直接创建Driver接口的实现类对象

例如:

Driver driver = new com.mysql.jdbc.Driver();

//因为与mysql驱动包中的类发生直接依赖,所以这样可移植性不够好

2)DriverManager 类的 registerDriver()

在实际开发中,程序中不直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。

DriverManager 类是驱动程序管理器类,负责管理驱动程序。

通常不用显式调用 DriverManager 类的 registerDriver() 方法来注册驱动程序类的实例。

//DriverManager.registerDriver()方式注册驱动,还是依赖 DriverManager.registerDriver(new com.mysql.jdbc.Driver());

3)Class.forName()或ClassLoader对象.loadClass()

因为 Driver 接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用 DriverManager.registerDriver() 方法来注册自身的一个实例,所以可以换一种方式来加载驱动。(即只要想办法让驱动类的这段静态代码块执行即可注册驱动类,而要让这段静态代码块执行,只要让该类被类加载器加载即可)。

jdbc的基本操作(API的使用与操作详解)(4)

调用 Class 类的静态方法 forName(),向其传递要加载的 JDBC 驱动的类名

//1、通过反射,加载与注册驱动类,解耦合(不直接依赖) Class.forName("com.mysql.jdbc.Driver");

//2、通过类加载器加载驱动类,解耦合(不直接依赖) ClassLoader.getSystemClassLoader().loadClass("com.mysql.jdbc.Driver");

4)服务提供者框架(例如:JDBC的驱动程序)自动注册(有版本要求)

符合JDBC 4.0规范的驱动程序包含了一个文件META-INF/services/java.sql.Driver,在这个文件中提供了JDBC驱动实现的类名。例如:mysql-connector-java-5.1.40-bin.jar文件中就可以找到java.sql.Driver文件,用文本编辑器打开文件就可以看到:com.mysql.jdbc.Driver类。

jdbc的基本操作(API的使用与操作详解)(5)

JVM的服务提供者框架在启动应用时就会注册服务,例如:MySQL的JDBC驱动就会被注册,而原代码中的Class.forName("com.mysql.jdbc.Driver")仍然可以存在,但是不会起作用。

jdbc的基本操作(API的使用与操作详解)(6)

但是注意mysql-connector-java-5.0.8-bin.jar版本的jar中没有,如下

3、获取数据库链接

可以通过 DriverManager 类建立到数据库的连接Connection:

DriverManager 试图从已注册的 JDBC 驱动程序集中选择一个适当的驱动程序。

public static Connection getConnection(String url)

public static Connection getConnection(String url,String user, String password)

public static Connection getConnection(String url,Properties info)[I1]

3.1 JDBC URL

JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的驱动程序,从而建立到数据库的连接。

JDBC URL的标准由三部分组成,各部分间用冒号分隔。

jdbc:<子协议>:<子名称>

协议:JDBC URL中的协议总是jdbc

子协议:子协议用于标识一个数据库驱动程序

子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息

例如:

jdbc的基本操作(API的使用与操作详解)(7)

MySQL的连接URL编写方式:

jdbc:mysql://主机名称:mysql服务端口号/数据库名称?参数=值&参数=值

jdbc:mysql://localhost:3306/testdb

jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8[I2]

jdbc:mysql://localhost:3306/testdb?user=root&password=123456

Oracle9i:

jdbc:oracle:thin:@主机名称:oracle服务端口号:数据库名称

jdbc:oracle:thin:@localhost:1521:testdb

SQLServer

jdbc:sqlserver://主机名称:sqlserver服务端口号:DatabaseName=数据库名称

jdbc:sqlserver://localhost:1433:DatabaseName=testdb

//1、加载与注册驱动 Class.forName("com.mysql.jdbc.Driver");

//2、获取数据库连接 String url = "jdbc:mysql://localhost:3306/test"; Connection conn = DriverManager.getConnection(url, "root", "root");

//硬编码

3.2 jdbc.properties

src下建立文件jdbc.properties,当然也可以是其他名字,只不过这里为了见名知意取这个名

通常至少应该包括 "user" 和 "password" 属性

#key=valuedriver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testuser=rootpassword=root

public static void main(String[] args) throws Exception {//预先加载配置文件jdbc.properties,把配置信息封装到Properties对象中Properties pro = new Properties();//ClassLoader只能加载类路径下的资源文件//如果不是类路径下,只能使用FileInputStreampro.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));//1、加载与注册驱动Class.forName(pro.getProperty("driver"));//2、获取数据库连接// Connection conn = DriverManager.getConnection(pro.getProperty("url"), pro);Connection conn = DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("user"),pro.getProperty("password"));System.out.println(conn);}//解决了硬编码的问题

4、操作或访问数据库

数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果。

其实一个数据库连接就是一个Socket连接。

在 java.sql 包中有 3 个接口分别定义了对数据库的调用的不同方式:

Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。

PrepatedStatement:SQL 语句被预编译并存储在此对象中,然后可以使用此对象多次高效地执行该语句。

CallableStatement:用于执行 SQL 存储过程

4.1 Statement

通过调用 Connection 对象的 createStatement() 方法创建该对象

该对象用于执行静态的 SQL 语句,并且返回执行结果

Statement 接口中定义了下列方法用于执行 SQL 语句:

int excuteUpdate(String sql):执行更新操作INSERT、UPDATE、DELETE

ResultSet excuteQuery(String sql):执行查询操作SELECT

4.2 ResultSet

通过调用 Statement 对象的 excuteQuery() 方法创建该对象

ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现

ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行

ResultSet 接口的常用方法:

boolean next()

getXxx(String columnLabel):columnLabel使用 SQL AS 子句指定的列标签。如果未指定 SQL AS 子句,则标签是列名称

getXxx(int index) :索引从1开始

java类型与SQL类型的对应关系

jdbc的基本操作(API的使用与操作详解)(8)

5、释放资源

Connection、Statement、ResultSet都是应用程序和数据库服务器的连接资源,使用后一定要关闭,可以在finally中关闭

未关闭后果:

@Testpublic void testConnection4()throws Exception{Properties pro = new Properties();pro.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));String url = pro.getProperty("url");//my.ini中max_connections=10for (int i = 0; i < 15; i ) {Connection conn = DriverManager.getConnection(url,pro);System.out.println(conn);//没有关闭,资源一直没有释放}}

6、增、删、改、查示例代码

package com.atguigu.statement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import org.junit.Test;public class TestStatement {@Testpublic void testAdd()throws Exception{String sql = "INSERT INTO dept(dname,description) VALUES('财务部','负责发钱工作')";String url = "jdbc:mysql://localhost:3306/1221db";String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();int len = st.executeUpdate(sql);//把insert,update,delete都用这个方法if(len>0){System.out.println("添加成功");}else{System.out.println("添加失败");}st.close();conn.close();}@Testpublic void testUpdate()throws Exception{String sql = "UPDATE dept SET description = '负责发工资、社保、公积金工作' WHERe dname ='财务部'";String url = "jdbc:mysql://localhost:3306/1221db";String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();int len = st.executeUpdate(sql);//把insert,update,delete都用这个方法if(len>0){System.out.println("修改成功");}else{System.out.println("修改失败");}st.close();conn.close();}@Testpublic void testDelete()throws Exception{String sql = "DELETE FROM dept WHERe did =2";String url = "jdbc:mysql://localhost:3306/1221db";String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();int len = st.executeUpdate(sql);//把insert,update,delete都用这个方法if(len>0){System.out.println("删除成功");}else{System.out.println("删除失败");}st.close();conn.close();}@Testpublic void testSelect()throws Exception{String sql = "SELECT * FROM dept";String url = "jdbc:mysql://localhost:3306/1221db";String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);//select语句用query方法while(rs.next()){//是否有下一行//取这一行的单元格int id = rs.getInt(1);String name = rs.getString(2);String desc = rs.getString(3);System.out.println(id "\t" name "\t" desc);}rs.close();st.close();conn.close();}@Testpublic void testSelect2()throws Exception{String sql = "SELECT did,dname FROM dept";String url = "jdbc:mysql://localhost:3306/1221db";String user = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, user, password);Statement st = conn.createStatement();ResultSet rs = st.executeQuery(sql);//select语句用query方法while(rs.next()){//是否有下一行//取这一行的单元格int id = rs.getInt("did");String name = rs.getString("dname");System.out.println(id "\t" name);}rs.close();st.close();conn.close();}}

Properties info通常至少应该包括 "user" 和 "password" 属性

如果JDBC程序与服务器端的字符集不一致,会导致乱码,那么可以通过参数指定服务器端的字符集

相关阅读:

java编程技术JDBC

如何使用JDBC API操作数据库

数据库连接池之DBCP数据源

java技术教程IOC和DI

java技术Docker容器

  • 故技重施意思(故技重施的含义)
  • 2024-06-27故技重施的含义故技重施释义:同样的手段再次使用重新施用过去的伎俩(手法、欺骗、诡计、卑鄙狡猾的计策或计谋)近义词:故伎重演,老花招或老手法又重新施展同“故技重演”含贬义作谓语、宾语【出处】:艾煊《大江风雷》第二部:。
  • 星座是靠什么划分的(星座是怎样命名的你知道吗)
  • 2024-06-27星座是怎样命名的你知道吗虽然古人划分星座的方法不科学,但这些星座的名称仍沿用至今现在,国际上统一把整个天空划分为88个星座,许多星座采用天文学仪器或其他科学仪器的名称命名,如六分仪座、望远镜座、时钟座、雕具座、显微镜座、绘架。
  • 关车门用力大会影响天窗嘛(关车门太用力会带来哪种危害呢)
  • 2024-06-27关车门太用力会带来哪种危害呢关车门用力大会影响天窗,甚至会震碎了首先对车主这是一种心理伤害一般人都很爱惜自己的车,刮一下都非常心疼虽然说车门的构造非常的结实,但也经受不住频繁用力的关车门车主听到朋友关车门的声音,心都碎一地了如果。
  • 钟楚曦张云龙官宣了吗 张云龙新甜宠剧开机
  • 2024-06-27钟楚曦张云龙官宣了吗 张云龙新甜宠剧开机近日,又有一部新甜宠剧官宣开机,此消息一出,瞬间在网上引发了无数人的关注,这部新剧就是《最遥远的距离》该剧根据张小娴的同名小说改编而来,由企鹅影视、金禾影视联合出品,讲述的是天才女设计师苏盈与急诊科医。
  • 安顺2月份小众景点(安顺这里有依水赏景的最佳点)
  • 2024-06-27安顺这里有依水赏景的最佳点蒙蒙细雨滋万物青青草色探头来山清水秀雨中赏胜似闲游天堂景安顺连着下雨的这几天渣男会向你发誓而我,会带你欣赏这场雨季美景ANSHUN雨水季·赏景点这里是依水赏景最佳地……虹山湖,作为安顺城区最大的一块。
  • 认识车辆转弯的方法(了解车辆转弯)
  • 2024-06-27了解车辆转弯你知道汽车是怎样转弯的吗?汽车是依靠前轮来转向前的随着前轮的转动,汽车车身也逐渐改变方向但是前后两只轮子不走在同一条弧线上,而是有一定距离差别的,这个差距称“内轮差”因此,我们碰到要转弯的汽车,不能靠。
  • 染发剂纯植物遮白发自己染(植物染发放心方便)
  • 2024-06-27植物染发放心方便发可乐植物泡泡染少白头是一个月到一个半月染一回,要不白头发再长出来就忒多了要是用一般的染发剂,我是真不敢染那么勤,我一直用的就是发可乐的泡泡染,这都是植物提取的,由油甘蓝提取物、人参提取物、山核桃提取。
  • 珍惜自己励志的句子(珍惜自己励志的句子分享)
  • 2024-06-27珍惜自己励志的句子分享就让我们扬起奋斗的风帆,吹响奋斗的号角,奏响奋斗的乐章,向前吧!去改写自己的命运,去创造自己的奇迹吧!因为,人生需要不停地奋斗奋斗能够创造奇迹法国音乐家贝多芬热衷于音乐创作,然而命运在他早年时期残酷地。
  • 索尼xperia10ii机身规格 索尼Xperia10II参数大全
  • 2024-06-27索尼xperia10ii机身规格 索尼Xperia10II参数大全请关注我们,为您每天更新手机比选、价格、评测信息,谢谢!请点击右上角的关注索尼Xperia10II价格:暂无价格上市时间:2020年02月屏幕尺寸:6.0英寸屏幕尺寸范围:5.6英寸及以上屏幕材质:O。
  • 乐嘉个人资料简介(乐嘉个人简介)
  • 2024-06-27乐嘉个人简介乐嘉,1975年5月16日出生于上海,祖籍浙江省宁波市,中国大陆主持人,作家,中国性格色彩研究中心创办人,“FPA性格色彩”创始人,演讲家和培训导师,上海大学悉尼工商学院、西北大学管理学院、以及河海大。
  • 胃不好的人经常吃什么对胃有帮助(这几个简单的动作做起来)
  • 2024-06-27这几个简单的动作做起来老话讲“民以食为天,胃为先”,胃是人体的消化器官,如果胃消化不好,身体对营养的吸收就会不好,人的精神状态就会大大下降,所以养胃非常的重要但是在现在这个社会中,不健康的饮食习惯和生活方式给人们的胃部带去。
  • 梦幻西游所有装备鉴定(神秘老板17万鉴定42件男衣)
  • 2024-06-27神秘老板17万鉴定42件男衣大家好!我是胖虎,「胖虎看西游」每天为你带来不一样的梦幻西游故事在前天,史一法山哥的完全体展示,让人见识到了什么是真正的第一虽然已经是毫无悬念的第一了,但是山哥依旧没有停下更新的脚步,他在继续打造攻谛。