JavaWeb:用JDBC操作数据库

jdbc

JDBC系列阅读

  1. JavaWeb:用JDBC操作数据库
  2. JavaWeb:JDBC之事务
  3. JavaWeb:JDBC之数据库连接池
  4. 使用JDBC实现水果超市管理系统

1. 什么是JDBC

JDBC的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作。说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

2. JDBC原理

早期SUN公司的天才们想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了。后来SUN开始与数据库厂商们讨论,最终得出的结论是,由SUN提供一套访问数据库的规范(就是一组接口),并提供连接数据库的协议标准,然后各个数据库厂商会遵循SUN的规范提供一套访问自己公司的数据库服务器的API出现。SUN提供的规范命名为JDBC,而各个厂商提供的,遵循了JDBC规范的,可以访问自己数据库的API被称之为驱动!

jdbc

JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
当然还有第三方公司专门为某一数据库提供驱动,这样的驱动往往不是开源免费的!

2.1 JDBC的具体实现细节

jdbc实现细节-1

jdbc实现细节-2

3. JDBC核心类(接口)介绍

Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)。

JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!

DriverManager

DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的静态方法,如下所示。

jdbc

DriverManger(驱动管理器)的作用有两个:

  • 注册驱动:这可以让JDBC知道要使用的是哪个驱动
  • 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了

Connection

Connection接口代表Java程序和数据库的连接,只有获得该连接对象后,才能访问数据库,并操作数据表。在Connection接口中,定义了一系列方法,其常用方法如下所示。

jdbc

Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:

  • Connection最为重要的一个方法就是用来获取Statement对象;

Statement

Statement接口用于执行静态的SQL语句,并返回一个结果对象。Statement接口对象可以通过Connection实例的createStatement()方法获得,该对象会把静态的SQL语句发送到数据库中编译执行,然后返回数据库的处理结果。

在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如下所示。

jdbc

Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:

  • void executeUpdate(String sql):执行更新操作(insert、update、delete等)
  • ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet

PreparedStatement

PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。在PreparedStatement接口中,提供了一些常用方法,具体如下所示。

jdbc

需要注意的是,表中的setDate()方法可以设置日期内容,但参数Date的类型是java.sql.Date,而不是java.util.Date。

jdbc

ResultSet

ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第一行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为while循环的条件来迭代ResultSet结果集。ResultSet接口中的常用方法如下所示。

jdbc

ResultSet接口中定义了大量的getXxx()方法,而采用哪种getXxx()方法取决于字段的数据类型。程序既可以通过字段的名称来获取指定数据,也可以通过字段的索引来获取指定的数据,字段的索引是从1开始编号的。例如,数据表的第一列字段名为id,字段类型为int,那么即可以使用getInt(1)获取该列的值,也可以使用getInt(“id”)获取该列的值。

ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:

  • boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在
  • XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0

4. Hello JDBC

下面开始编写第一个JDBC程序,JDBC的使用步骤

通常,JDBC的使用可以按照以下几个步骤进行:

(1)加载并注册数据库驱动

(2)通过DriverManager获取数据库连接

(3)通过Connection对象获取Statement对象

(4)使用Statement执行SQL语句

(5)操作ResultSet结果集

(6)关闭连接,释放资源

4.1 mysql数据库的驱动jar包

mysql-connector-java-5.1.13-bin.jar

4.2 获取连接

获取连接需要两步,一是使用DriverManager来注册驱动,二是使用DriverManager来获取Connection对象。

4.2.1 注册驱动

看清楚了,注册驱动就只有一句话:

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”);

4.2.2 获取连接

获取连接的也只有一句代码:

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,要小心了

4.3 获取Statement

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

Statement stmt = con.createStatement();

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

4.4 发送SQL增、删、改语句

String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);

其中int类型的返回值表示执行这条SQL语句所影响的行数,我们知道,对insert来说,最后只能影响一行,而update和delete可能会影响0~n行。
如果SQL语句执行失败,那么executeUpdate()会抛出一个SQLException。

4.5 发送SQL查询语句

String sql = “select * from user”;
ResultSet rs = stmt.executeQuery(sql);

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

4.6 读取结果集中的数据

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)

4.7 关闭

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

rs.close();
stmt.close();
con.close();

4.8 代码

public static Connection getConnection() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mydb1";
        return DriverManager.getConnection(url, "root", "123");
    }
    @Test
    public 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(
  • 67
    点赞
  • 272
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值