Java原生操作JDBC连接以及原理详解

网友投稿 354 2022-11-07


Java原生操作JDBC连接以及原理详解

一、简介

JDBC全称又叫做java DataBase Connectivity,也就是Java数据库连接,说白了就是用Java语言来操作数据 库,提供统一API访问数据库操作。

二、原理

JDBC主要是用于java连接数据库的,能连接什么数据库不固定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种。但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那些人想出了一个办法,我定义一套规范,大家都按照这个规范来,实现自己公司访问数据库的实现。这套规范就是JDBC,遵循了JDBC规范的,可以访问自己数据库的API被称之为数据库驱动。

三、数据库操作

数据库操作分为6个步骤(增、删、改可跳过第5步,移步看第6步):

1、首先,项目中检查是否已导入mysql连接jar包,如:mysql-connector-java-5.1.6-bin.jar

2、使用反射注册数据库驱动,Class.forName(name);

3、通过DriverManager.getConnection(url, username, password)构造器获取数据库连接

4、通过Connection连接对象获取数据库操作对象PrepareStatement或者Statement

5、通过获取的Statement对象执行executeQuery()操作返回ResultSet结果集,需判断是否为空

6、通过获取的Statement对象执行executeUpdate()操作返回受影响的行数,判断是否成功标识

7、释放连接资源,关闭顺序为:ResultSet -> PrepareStatement / Statement -> Connection

解释说明关键类:

(1)DriverManager:该类管理数据库驱动程序。

(2)Connection:管理数据库建立的连接。

(3)Statement:负责将要执行的sql体提交到数据库。

(4)ResultSet:执行sql查询语句返回的结果集。

(5)PreparedStatement: 可以使用预编译的SQL,防止SQL注入,而Statment只能使用静态的SQL。

PreparedStatement 与 Statment 区别:

语法不同: PreparedStatement可以使用预编译的sql,而Statment只能使用静态的sql。

效率不同: PreparedStatement可以使用sql缓存区,效率比Statment高。

安全性不同: PreparedStatement可以有效防止sql注入,而Statment不能防止sql注入。

四、数据库增、删、改、查示例

工具类(可做相对应灵活替换):

package com.bnd.util;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Objects;

/**

* @version 创建时间:2021年1月10日 下午5:14:16

* 类说明 JDBC操作数据库工具类

*/

public class JdbcUtils {

private static final String driverName = "com.mysql.jdbc.Driver"; // 数据库驱动名称

private static final String url = "jdbc:mysql://39.108.146.20:3307/jsp?useUnicode=true&characterEncoding=utf-8"; // 数据库url

private static final String userName = "root"; // 用户名

private static final String password = "123456"; // 用户密码

private static Connection conn = null; // 数据库连接对象

private static PreparedStatement preparedStatement = null; // 执行操作对象

static {

try {

Class.forName(driverName); // 2、注册数据库驱动

conn = Drhttp://iverManager.getConnection(url, userName, password); // 3、获取数据库连接

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 查询数据

* @return 返回查询到结果

*/

public static ResultSet queryData() {

ResultSet result = null;

String sql = "select id, name, pwd from user"; // 定义预编译SQL

try {

preparedStatement = conn.prepareStatement(sql); // 4、执行预编译SQL操作

result = preparedStatement.executeQuery(); // 5、执行查询操作

while (result.next()) {

int id = result.getInt(1);

String name = result.getString(2);

String pwd = result.getString(3);

System.out.println("id:" + id + "--> name:" + name + "--> pwd:" + pwd);

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

// 7、释放资源

close(conn, preparedStatement, result);

}

return result;

}

/**

* 添加数据

* @return 返回受影响行数

*/

public static int addData() {

String sql = "insert into user(name,pwd) values(?, ?)";

try {

preparedStatement = conn.prepareStatement(sql); // 4、执行预编译SQL操作

preparedStatement.setString(1, "tom");

preparedStatement.setString(2, "abc123");

int count = preparedStatement.executeUpdate(); // 6、执行添加操作

if (count > 0) {

return count;

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

// 7、释放资源

close(conn, preparedStatement, null);

}

return -1;

}

/**

* 更新数据

* @return 返回受影响行数

*/

public static int updateData() {

String sql = "update user set name = ?, pwd = ? where id = ?";

try {

preparedStatement = conn.prepareStatement(sql); // 4、执行预编译SQL操作

preparedStatement.setString(1, "sueno");

preparedStatement.setString(2, "qwe123");

preparedStatement.setInt(3, 10);

int count = preparedStatement.executeUpdate(); // 6、执行添加操作

if (count > 0) {

return count;

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

// 7、释放资源

close(conn, preparedStatement, null);

}

return -1;

}

/**

* 删除数据

* @return 返回受影响行数

*/

public static int deleteData() {

String sql = "delete from user where id = ?";

try {

preparedStatement = conn.prepareStatement(sql); // 4、执行预编译SQL操作

preparedStatement.setInt(1, 11);

int count = preparedStatement.executeUpdate(); // 6、执行添加操作

if (count > 0) {

return count;

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally {

// 7、释放资源

close(conn, preparedStatement, null);

}

return -1;

}

/**

* 释放资源

* @param conn 关闭数据库连接

* @param statement 关闭数据库操作对象

* @param rs 关闭结果集操作对象

*/

public static void close(Connection conn, Statement statement, ResultSet rs) {

if (Objects.nonNull(rs)) {

try {

rs.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (Objects.nonNull(statement)) {

try {

statement.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (Objects.nonNull(conn)) {

try {

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

测试类:

package com.bnd.util;

import java.sql.ResultSet;

/**

* @version 创建时间:2021年1月10日 下午6:00:30

* 类说明

*/

public class TestJdbc {

public static void main(String[] args) {

// 获取用户数据

// ResultSet rs = JdbcUtils.queryData();

// System.out.println(rs);

// 添加用户数据

// int count = JdbcUtils.addData();

// if (count > 0) {

// System.out.println("添加成功!");

// }

// 更新用户数据

// int count = JdbcUtils.updateData();

// if (count > 0) {

// System.out.println("更新成功!");

// }

// 删除用户数据

// int count = JdbcUtils.deleteData();

// if (count > 0) {

// System.out.println("删除成功!");

// }

}

}

五、总结

1、通过简单Jdbc连接数据库,巧妙的实现了CRUD;其实实现并不难,记一下数据库连接步骤就行。

2、数据库操作本身就是一套数据库规范,根据不同驱动能够达到连接不同的数据库,实现可实行操作。

3、剧上述连接可知,数据库连接是非常耗性能的,频繁的数据库操作,不及时释放资源,会导致IO阻塞。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot里使用Servlet进行请求的实现示例
下一篇:Java中短路运算符与逻辑运算符示例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~