使用JDBC连接MySQL数据库

使用JDBC连接MySQL数据库

概述

JDBC,是Java Database Connecive,即数据库连接技术的简称,它提供了连接各种常用数据库的能力。

JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够非常方便地编写数据库应用程序。

JDBC组成

通常JDBC有两部分组成:JDBC API和JDBC Driver。

JDBC API:是提供给开发者的一组独立于数据库的API,对任何数据库的操作,都可以用这组API来进行开发,主要集成在java.sql和javax.sql包中。提供者是Sun。

JDBC Driver:是面向JDBC驱动程序开发商的编程接口,它会把我们通过JDBC API发给数据库的通用指令翻译给他们自己的数据库,然后实现功能。提供者是各数据库厂商。

这里写图片描述

实际开发中,我们主要使用JDBC API完成三件事情:与数据库建立连接、执行SQL语句、处理结果。

JDBC Driver

JDBC驱动主要由各数据库厂商提供,在使用中常见的有以下几类:

  1. JDBC-ODBC桥:是SUN在JDK的开发包中提供的最标准的一套JDBC操作类库,使用的时候中间要经过一个ODBC的连接,需要ODBC驱动,适合于企业网或三层结构应用程序(通过将JDBC调用委托给ODBC接口)。这样做的优点是可以访问所有ODBC可以访问的数据库,但缺点却是执行效率低、功能不够强大,所以在实际开发中很少用到。
  2. JDBC网络纯Java驱动程序:将JDBC转换为与DBMS无关的网络协议,又被某服务器转换为一种DBMS协议,以操作各种数据库(驱动程序由中间件服务器提供)。
  3. JDBC+本地驱动,需要驱动程序的二进制代码支持,这种方式的安全性比较差。
  4. 本地协议纯Java驱动程序:将JDBC调用直接转换成JDBC所使用的网络协议 ,全部由JAVA实现,直接和数据库访问。因为使用的是纯Java,所以实现快又可跨平台,但缺点是访问不同的数据库需要下载专用的JDBC驱动。

JDBC应用步骤

  1. 加载JDBC Driver
  2. 创建数据库连接(Connection)
  3. 创建一个Statement
  4. 执行sql语句(CRUD操作语句)
  5. 处理sql结果
  6. 关闭Statement
  7. 关闭连接Connection

加载JDBC Driver

先将JDBC驱动jar包添加到项目classpath中,由于驱动本质上还是class,将驱动加载到内存和加载普通的class原理是一样的,使用Class.forName(“driverName”)加载。

try {
    //加载MySQL JDBC驱动
    Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Class.forName()将对应的驱动类加载到内存中,然后执行内存中的static静态代码段,代码段中,会创建一个驱动Driver的实例,放入DriverManager中,供DriverManager使用。

创建数据库连接

创建Connection连接对象,可以使用DriverManager提供的getConnection(String url, String user, String password)方法。其中url为连接字符串,user为连接数据库的用户名,password为密码。

Connection connection = null;
String url = "jdbc:mysql://localhost:3306/jdbc"; // 连接字符串
String user = "root"; // 用户名
String pass = "123456"; // 密码
try {
    // 创建Connection对象
    connection = DriverManager.getConnection(url, user, pass);
} catch (SQLException e) {
    e.printStackTrace();
}

创建Statement对象,执行SQL语句

创建Statement对象:

// 创建Statement对象
Statement stmt = connection.createStatement();

发送INSERT语句(UPDATE,DELETE操作类似):

// 发送Insert语句
int count = stmt.executeUpdate("INSERT INTO users(username, password) VALUES ('lily', 'lily123')");

executeUpdate()方法返回受影响的行数。

发送SELECT语句:

// 发送查询SQL语句
ResultSet rs = stmt.executeQuery("SELECT id, username, password FROM users");

executeQuery()方法返回值类型为ResultSet结果集。

处理结果

处理INSERT、UPDATE、DELETE执行结果,对受影响行数判断是否符合业务逻辑要求,不演示。对SELECT查询结果集处理如下:

// 循环处理查询结果集
while (rs.next()){
    System.out.println("编号:" + rs.getInt(1) + ", 用户名:" + rs.getString("username") + ", 密码:" + rs.getString("password"));
}

通过调用ResultSet的next()方法获取结果集中下一条记录,如果获取不到,返回false。获取到记录后,通过getXxx()方法获取记录中列字段的值, Xxx通常为列字段的类型。可以根据列索引(从1开始计数)获取列字段值(如rs.getInt(1)),也可以通过列名获取列字段值(如rs.getString(“username”))。

释放资源

try {
    if (rs != null)
        rs.close();
    if (stmt != null)
        stmt.close();
    if (connection != null)
        connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

使用完数据库资源后一定要手动释放资源,因为这些资源是不会自动释放的,必须自己关闭。

关于PreparedStatement

当我们发送SELECT语句时,需要用到Statement对象。当然,除了使用Statement外,我们还可能会用到PreparedStatement对象。比如我们要在登录系统的时候验证用户名与密码,SQL语句中就得连接上从界面获取到的用户名与密码字符串,使用Statement与PreparedStatement如下:

String username = "admin";
String password = "admin";
// 创建Statement对象
Statement stmt = connection.createStatement();
// 发送SQL语句并执行
ResultSet rs = stmt.executeQuery("SELECT id, username, password FROM users WHERE username='" + username + "' AND password='" + password + "'");

// 创建PreparedStatement对象
PreparedStatement pstmt = connection.prepareStatement("SELECT id, username, password FROM users WHERE username=? AND password=?");
// 设置pstmt参数
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL语句
ResultSet rs2 = pstmt.executeQuery();

PreparedStatement可以使用“?”替代sql语句中的某些参数,他先将带参数的sql语句发送到数据库,进行预编译,然后PreparedStatement通过调用setXxx()方法将参数发送给数据库。因为PreparedStatement会对SQL语句进行预编译,所以下次执行相同的sql语句时,数据库端不会再进行预编译了,而直接用数据库的缓冲区,提高数据访问的效率(但尽量采用使用?号的方式传递参数)。

从代码易读性上来说,因为PreparedStatement使用“?”来代替参数,所以SQL语句较使用Statement更容易阅读。

从安全性上来说,PreparedStatement是通过“?”来传递参数的,避免了拼sql而出现sql注入的问题,所以安全性较好。在开发中,推荐使用PreparedStatement。

使用批处理提高SQL执行效率

传统方式是每执行一条SQL语句都要提交到数据库处理一次,在大量导入数据的情况下,如果添加一定量数据以后再提交,减少了提交次数,那么就能更充分地利用数据库资源,提高SQL的执行效率。

/* 添加批处理执行的SQL语句 */
stmt.addBatch("INSERT INTO users VALUES(5, 'test', '000000')");
stmt.addBatch("INSERT INTO users VALUES(6, 'tommy', 'tommymy')");
stmt.addBatch("INSERT INTO users VALUES(7, 'lucy', 'lucylucy')");
stmt.executeBatch(); // 执行批
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值