阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

第一个JDBC程序

104次阅读
没有评论

共计 4702 个字符,预计需要花费 12 分钟才能阅读完成。

一、准备驱动

准备 mysql 数据库的驱动 jar 包:mysql-connector-java-5.1.13-bin.jar;

二、获取连接

​ 获取连接需要两步:

​ 一是使用 DriverManager 来 注册驱动

​ 二是使用 DriverManager 来 获取 Connection 对象 连接对象)。

注册驱动

看清楚了,注册驱动就只有一句话:Class.forName(“com.mysql.jdbc.Driver”),下面的内容都是对这句代码的解释。今后我们的代码中,与注册驱动相关的代码只有这一句。

DriverManager 类的 registerDriver()方法的参数是 java.sql.Driver,但 java.sql.Driver 是一个接口,实现类由 mysql 驱动来提供,mysql 驱动中的 java.sql.Driver 接口的实现类为 com.mysql.jdbc.Driver!那么注册驱动的代码如下:

​ DriverManager.registerDriver(new com.mysql.jdbc.Driver());

上面代码虽然可以注册驱动,但是出现硬编码(代码依赖 mysql 驱动 jar 包),如果将来想连接 Oracle 数据库,那么必须要修改代码的。并且其实这种注册驱动的方式是注册了两次驱动!

JDBC 中规定,驱动类在被加载时,需要自己“主动”把自己注册到 DriverManger 中,下面我们来看看 com.mysql.jdbc.Driver 类的源代码:

com.mysql.jdbc.Driver.java

public class Driver extends NonRegisteringDriver implements java.sql.Driver {static {try {java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) {throw new RuntimeException("Can't register driver!"); } } …… }

com.mysql.jdbc.Driver 类中的 static 块会创建本类对象,并注册到 DriverManager 中。这说明只要去加载 com.mysql.jdbc.Driver 类,那么就会执行这个 static 块,从而也就会把 com.mysql.jdbc.Driver 注册到 DriverManager 中,所以可以把 注册驱动类 的代码修改为 加载驱动类

Class.forName(“com.mysql.jdbc.Driver”);

获取连接

获取连接的也只有一句代码:DriverManager.getConnection(url,username,password),其中 username 和 password 是登录数据库的用户名和密码,如果我没说错的话,你的 mysql 数据库的用户名和密码分别是:root、123。

url相对复杂一点,它是用来找到要连接数据库“网址”,就好比你要浏览器中查找百度时,也需要提供一个 url。下面是 mysql 的 url:

jdbc:mysql://localhost:3306/mydb1

JDBC 规定url 的格式由三部分组成,每个部分中间使用逗号分隔。

​ 第一部分是 jdbc,这是固定的;

​ 第二部分是数据库名称,那么连接 mysql 数据库,第二部分当然是 mysql 了;

​ 第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql 的第三部分分别由 数据库服务器的 IP 地址 (localhost)、 端口号(3306),以及 **DATABASE 名称(mydb1)** 组成。

下面是获取连接的语句:

Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);

还可以在 url 中提供参数:

jdbc:mysql://localhost:3306/mydb1**?useUnicode=true&characterEncoding=UTF8**

useUnicode 参数指定这个连接数据库的过程中,使用的字节集是 Unicode 字节集;

characherEncoding 参数指定连接数据库的过程中,使用的字节集编码为 UTF- 8 编码。请注意,mysql 中指定 UTF- 8 编码是给出的是 UTF8,而不是 UTF-8。要小心了!

三、获取 Statement

在得到 Connectoin 之后,说明已经与数据库连接上了,下面是通过 Connection 获取 Statement 对象的代码:

Statement stmt = con.createStatement();

Statement 是用来向数据库发送要执行的 SQL 语句的!

四、发送 SQL 增、删、改语句

定义 sql 语句

String sql =“insert into user value(’zhangSan’,’123’)”;

执行增删改的方法:executeUpdate(String sql)

int m = stmt.executeUpdate(sql);

其中 int 类型的返回值表示执行这条 SQL 语句所影响的行数,我们知道,对 insert 来说,最后只能影响一行,而 update 和 delete 可能会影响 0~n 行。

如果 SQL 语句执行失败,那么 executeUpdate()会抛出一个 SQLException。

五、发送 SQL 查询语句

定义 sql 语句

String sql =“select * from user”;

执行查询语句

ResultSet rs = stmt.executeQuery(sql);

请注册,执行查询使用的不是 executeUpdate()方法,而是 executeQuery()方法。executeQuery()方法返回的是 ResultSet,ResultSet 封装了查询结果,我们称之为结果集。

六、读取结果集中的数据

ResultSet 就是一张二维的表格,它内部有一个“行光标”,光标默认的位置在“第一行上方”,我们可以调用 rs 对象的 next()方法把“行光标”向下移动一行,当第一次调用 next()方法时,“行光标”就到了第一行记录的位置,这时就可以使用 ResultSet 提供的 getXXX(int col)方法来获取指定列的数据了:

rs.next();// 光标移动到第一行

rs.getInt(1);// 获取第一行第一列的数据

当你使用 rs.getInt(1)方法时,你必须可以肯定第 1 列的数据类型就是 int 类型,如果你不能肯定,那么最好使用 rs.getObject(1)。在 ResultSet 类中提供了一系列的 getXXX()方法,比较常用的方法有:

Object getObject(int col)

String getString(int col)

int getInt(int col)

double getDouble(int col)

七、关闭

与 IO 流一样,使用后的东西都需要关闭!关闭的顺序是先得到的后关闭,后得到的先关闭。

rs.close();

stmt.close();

con.close();

八、代码实现

获取连接的方法

public static Connection getConnection() throws Exception {Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb1"; return DriverManager.getConnection(url, "root", "poi"); }

执行插入的方法

@Test public static void insert() throws Exception {Connection con = getConnection(); Statement stmt = con.createStatement(); String sql = "insert into user values('zhangSan','123')"; stmt.executeUpdate(sql); System.out.println("插入成功!"); }

执行更新的方法

@Test public static void update() throws Exception {Connection con = getConnection(); Statement stmt = con.createStatement(); String sql = "update user set password='456'where username='zhangSan'"; stmt.executeUpdate(sql); System.out.println("修改成功!"); }

执行删除的方法

@Test public static void delete() throws Exception {Connection con = getConnection(); Statement stmt = con.createStatement(); String sql = "delete from user where username='zhangSan'"; stmt.executeUpdate(sql); System.out.println("删除成功!"); }

执行查询的方法

@Test public static void query() throws Exception {Connection con = getConnection(); Statement stmt = con.createStatement(); String sql = "select * from user"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()) {String username = rs.getString(1); String password = rs.getString(2); System.out.println(username + "," + password); } }

九、规范化代码

所谓规范化代码就是无论是否出现异常,都要关闭 ResultSet、Statement,以及 Connection,如果你还记得 IO 流的规范化代码,那么下面的代码你就明白什么意思了。

@Test public void query() {Connection con = null; Statement stmt = null; ResultSet rs = null; try {con = getConnection(); stmt = con.createStatement(); String sql = "select * from user"; rs = stmt.executeQuery(sql); while(rs.next()) {String username = rs.getString(1); String password = rs.getString(2); System.out.println(username + "," + password); } } catch(Exception e) {throw new RuntimeException(e); } finally {try {if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(con != null) con.close();} catch(SQLException e) {//throw new RuntimeException(e); e.printStackTrace();} } }

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-06-06发表,共计4702字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中