Java中JDBC的使用教程详解

目录
  • 概念
  • 快速入门
    • 步骤
    • 代码实现
  • 详解各个对象
    • DriverManager:驱动管理对象
    • Connection:数据库连接对象
    • Statement:执行sql的对象
    • ResultSet:结果集对象,封装查询结果
    • PreparedStatement:执行sql的对象
  • 抽取JDBC工具类 : JDBCUtils
    • 分析
    • 代码实现
    • 练习
  • JDBC控制事务
    • 事务
    • 操作
    • 使用Connection对象来管理事务
    • 代码

概念

Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库 JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

快速入门

步骤

1.导入驱动jar包

<!--MySQL数据库驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.27</version>
</dependency>

2.注册驱动

3.获取数据库连接对象 Connection

4.定义sql

5.获取执行sql语句的对象 Statement

6.执行sql,接受返回结果

7.处理结果

8.释放资源

代码实现

//1. 导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//6.执行sql
int count = stmt.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
stmt.close();
conn.close();

详解各个对象

DriverManager:驱动管理对象

功能:

1.注册驱动:告诉程序该使用哪一个数据库驱动jar

static void registerDriver(Driver driver) :注册与给定的驱动程序 DriverManager 。 写代码使用:  Class.forName("com.mysql.jdbc.Driver"); 通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块

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

注意:mysql5之后的驱动jar包可以省略注册驱动的步骤。

2.获取数据库连接:

方法:static Connection getConnection(String url, String user, String password)

参数:

url:指定连接的路径

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 例子:jdbc:mysql://localhost:3306/db3 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称

  • user:用户名
  • password:密码

Connection:数据库连接对象

功能:

获取执行sql 的对象

Statement createStatement() PreparedStatement prepareStatement(String sql)

管理事务:

开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 提交事务:commit() 回滚事务:rollback()

Statement:执行sql的对象

1.执行sql

boolean execute(String sql) :可以执行任意的sql 了解 int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。 ResultSet executeQuery(String sql)  :执行DQL(select)语句

2.练习:

  • account表 添加一条记录
  • account表 修改记录
  • account表 删除一条记录

代码:

Statement stmt = null;
Connection conn = null;
try {
    //1. 注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    //2. 定义sql
    String sql = "insert into account values(null,'王五',3000)";
    //3.获取Connection对象conn = DriverManager.getConnection("jdbc:mysql:///db3", "root", "root");
    //4.获取执行sql的对象 Statement
    stmt = conn.createStatement();
    //5.执行sql
    int count = stmt.executeUpdate(sql);//影响的行数
    //6.处理结果
    System.out.println(count);
    if(count > 0){
        System.out.println("添加成功!");
    }else{
        System.out.println("添加失败!");
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (SQLException e) {
    e.printStackTrace();
}finally {
    //stmt.close();
    //7. 释放资源
    //避免空指针异常
    if(stmt != null){
        try {
            stmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

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

ResultSet:结果集对象,封装查询结果

boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true getXxx(参数):获取数据 Xxx:代表数据类型   如: int getInt() , String getString() 参数:

  • int:代表列的编号,从1开始   如: getString(1)
  • String:代表列名称。 如: getDouble("balance")

注意: 使用步骤:

  • 游标向下移动一行
  • 判断是否有数据
  • 获取数据
//循环判断游标是否是最后一行末尾。
while(rs.next()){
    //获取数据
    //6.2 获取数据
    int id = rs.getInt(1);
    String name = rs.getString("name");
    double balance = rs.getDouble(3);

    System.out.println(id + "---" + name + "---" + balance);
}

PreparedStatement:执行sql的对象

  • SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
  • 输入用户随便,输入密码:a' or 'a' = 'a
  • sql:select from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a'
  • 解决sql注入问题:使用PreparedStatement对象来解决
  • 预编译的SQL:参数使用?作为占位符
  • 步骤:
  • 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
  • 注册驱动
  • 获取数据库连接对象 Connection
  • 定义sql

注意:sql的参数使用?作为占位符。 如:select from user where username = ? and password = ?;

  • 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql)
  • 给?赋值:

方法: setXxx(参数1,参数2) 参数1:?的位置编号 从1 开始 参数2:?的值

  • 执行sql,接受返回结果,不需要传递sql语句
  • 处理结果
  • 释放资源
  • 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
  • 可以防止SQL注入
  • 效率更高

抽取JDBC工具类 : JDBCUtils

目的:简化书写

分析

1.注册驱动也抽取

2.抽取一个方法获取连接对象

需求:不想传递参数(麻烦),还得保证工具类的通用性。 解决:配置文件jdbc.properties

url=
user=
password=

3.抽取一个方法释放资源

代码实现

public class JDBCUtils {
	private static String url;
	private static String user;
	private static String password;
	private static String driver;
	/**
	 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
	 */
	static{
		//读取资源文件,获取值。

		try {
			//1. 创建Properties集合类。
			Properties pro = new Properties();

			//获取src路径下的文件的方式--->ClassLoader 类加载器
			ClassLoader classLoader = JDBCUtils.class.getClassLoader();
			URL res  = classLoader.getResource("jdbc.properties");
			String path = res.getPath();
			System.out.println(path);///D:/IdeaProjects/itcast/out/production/day04_jdbc/jdbc.properties
			//2. 加载文件
		   // pro.load(new FileReader("D:\\IdeaProjects\\itcast\\day04_jdbc\\src\\jdbc.properties"));
			pro.load(new FileReader(path));

			//3. 获取数据,赋值
			url = pro.getProperty("url");
			user = pro.getProperty("user");
			password = pro.getProperty("password");
			driver = pro.getProperty("driver");
			//4. 注册驱动
			Class.forName(driver);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 获取连接
	 @return 连接对象
	 */
	public static Connection getConnection() throws SQLException {

		return DriverManager.getConnection(url, user, password);
	}

	/**
	 释放资源
	 @param stmt
	 @param conn
	 */
	public static void close(Statement stmt,Connection conn){
		if( stmt != null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

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

	/**
	 释放资源
	 @param stmt
	 @param conn
	 */
	public static void close(ResultSet rs,Statement stmt, Connection conn){
		if( rs != null){
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

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

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

}

练习

需求

  • 通过键盘录入用户名和密码
  • 判断用户是否登录成功

select from user where username = "" and password = ""; 如果这个sql有查询结果,则成功,反之,则失败

步骤

1.创建数据库表 user

CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32),
	PASSWORD VARCHAR(32)

);

INSERT INTO USER VALUES(NULL,'zhangsan','123');
INSERT INTO USER VALUES(NULL,'lisi','234');

2.代码实现

public class JDBCDemo9 {

	public static void main(String[] args) {
		//1.键盘录入,接受用户名和密码
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入用户名:");
		String username = sc.nextLine();
		System.out.println("请输入密码:");
		String password = sc.nextLine();
		//2.调用方法
		boolean flag = new JDBCDemo9().login(username, password);
		//3.判断结果,输出不同语句
		if(flag){
			//登录成功
			System.out.println("登录成功!");
		}else{
			System.out.println("用户名或密码错误!");
		}

	}

	/**
	 登录方法
	 */
	public boolean login(String username ,String password){
		if(username == null || password == null){
			return false;
		}
		//连接数据库判断是否登录成功
		Connection conn = null;
		Statement stmt =  null;
		ResultSet rs = null;
		//1.获取连接
		try {
			conn =  JDBCUtils.getConnection();
			//2.定义sql
			String sql = "select from user where username = '"+username+"' and password = '"+password+"' ";
			//3.获取执行sql的对象
			stmt = conn.createStatement();
			//4.执行查询
			rs = stmt.executeQuery(sql);
			//5.判断
		   /if(rs.next()){//如果有下一行,则返回true
				return true;
			}else{
				return false;
			}*/
		   return rs.next();//如果有下一行,则返回true

		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtils.close(rs,stmt,conn);
		}

		return false;
	}
}

JDBC控制事务

事务

一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

操作

  • 开启事务
  • 提交事务
  • 回滚事务

使用Connection对象来管理事务

开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务 在执行sql之前开启事务 提交事务:commit() 当所有sql都执行完提交事务 回滚事务:rollback() 在catch中回滚事务

代码

public class JDBCDemo10 {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;

		try {
			//1.获取连接
			conn = JDBCUtils.getConnection();
			//开启事务
			conn.setAutoCommit(false);

			//2.定义sql
			//2.1 张三 - 500
			String sql1 = "update account set balance = balance - ? where id = ?";
			//2.2 李四 + 500
			String sql2 = "update account set balance = balance + ? where id = ?";
			//3.获取执行sql对象
			pstmt1 = conn.prepareStatement(sql1);
			pstmt2 = conn.prepareStatement(sql2);
			//4. 设置参数
			pstmt1.setDouble(1,500);
			pstmt1.setInt(2,1);

			pstmt2.setDouble(1,500);
			pstmt2.setInt(2,2);
			//5.执行sql
			pstmt1.executeUpdate();
			// 手动制造异常
			int i = 3/0;

			pstmt2.executeUpdate();
			//提交事务
			conn.commit();
		} catch (Exception e) {
			//事务回滚
			try {
				if(conn != null) {
					conn.rollback();
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally {
			JDBCUtils.close(pstmt1,conn);
			JDBCUtils.close(pstmt2,null);
		}

	}

}

以上就是Java中JDBC的使用教程详解的详细内容,更多关于Java JDBC的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java JDBC基本使用方法详解

    本文实例讲述了Java JDBC基本使用方法.分享给大家供大家参考,具体如下: 本文内容: 什么是JDBC JDBC的使用 事务 连接池 DbUtils 首发日期:2018-05-27 修改: 2018-07-19:增加了事务.连接池.DBUtils 2018-07-27:对特别情况下的事务进行了描述.对DBUtils增加了关闭资源.关闭流.连接池发现漏了释放连接. 什么是JDBC: JDBC全称Java Database Connectivity JDBC可以通过载入不同的数据库的"驱动程序&

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

    一.简介 JDBC全称又叫做Java DataBase Connectivity,也就是Java数据库连接,说白了就是用Java语言来操作数据 库,提供统一API访问数据库操作. 二.原理 JDBC主要是用于java连接数据库的,能连接什么数据库不固定,其实能连接很多种数据库,而且一般来说可以连接oracle和mysql,通常也是这两种.但是既然JDBC能连接这么多的数据库,开发起来太麻烦了,于是sun公司那些人想出了一个办法,我定义一套规范,大家都按照这个规范来,实现自己公司访问数据库的实现.

  • Java使用JDBC连接数据库

    目录 一.JDBC简介 二.JDBC中常用类和接口 1.驱动程序管理类(DriverManager) 2.声明类(Statement) 3.数据库连接类 (Connection) 4.结果集合类 (ResultSet) 5.JDBC编程步骤 三.常用操作(对于记录来说) 1.获取数据库连接 2.增加表中记录 3.删除数据库表格记录 4.更新数据库中表格记录信息 5.查询 (1)单个变量的查询 (2)多个变量查询 6.调用存储过程 (1)调用无参存储过程 (2)调用含有IN参数的存储过程 (3)调

  • 详细说明关于Java的数据库连接(JDBC)

    目录 Java的数据库连接(JDBC) 1.什么是JDBC 2.JDBC的原理 3.演示JDBC的使用 4.数据库连接方式 5.JDBC的查询 6.SQL注入 7.预处理查询 7.1 查询 已解决注入问题 7.2 插入,更新,删除 8.工具类开发 9.JDBC事务 10.批处理 11.数据库连接池 11.1 数据库连接池基本介绍 11.2 JDBC的数据库连接池使用 11.3 数据库连接池的种类 11.4 C3P0连接池 11.5 Druid连接池 12.Apache-DBUtils 12.1

  • Java使用JDBC连接数据库的详细步骤

    目录 一.JDBC是什么? 二.使用步骤 1.注册驱动 2.获取连接 3.获取数据库操作对象 4.执行sql语句 5.处理查询结果集 6.释放资源 上述六步连贯: 第一次优化:(比较两种注册驱动的方法) 第二次优化:(比较两种注册驱动的方法) 第三次优化:(最佳注册驱动获取连接) 第四次优化:(使用资源绑定器) 第五次优化:(对操作结果集的处理) 总结: 一.JDBC是什么? JDBC 指 Java 数据库连接(Java Database Connectivity),是一种标准Java应用编程接

  • Java 如何使用JDBC连接数据库

    一.使用JDBC连接数据库 1.使用JDBC-ODBC桥驱动程序连接数据库 基本步骤: (1)加载并注册数据库驱动 (2)通过DriverManager获取数据库连接 (3)通过Connection对象获取Statement对象 (4)使用Statement接口执行SQL语句 (5)操作ResultSet结果集 (6)关闭连接,释放资源 2.下面进行代码演示 1.注册数据库驱动程序的语法格式如下: DriverManager.registerDriver(Driver driver) 或者 Cl

  • Java中JDBC的使用教程详解

    目录 概念 快速入门 步骤 代码实现 详解各个对象 DriverManager:驱动管理对象 Connection:数据库连接对象 Statement:执行sql的对象 ResultSet:结果集对象,封装查询结果 PreparedStatement:执行sql的对象 抽取JDBC工具类 : JDBCUtils 分析 代码实现 练习 JDBC控制事务 事务 操作 使用Connection对象来管理事务 代码 概念 Java DataBase Connectivity  Java 数据库连接, J

  • Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别?    总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上编译成class文件,而javascript则直接在浏览器上加载运行. 2.由第一点可看出,java代码需要编译,而javascript不需要编译. 3.从语言性质来说,java是一种高级编程语言,对变量检查要求严格,javascript只是一个简单的解释性的脚本语言,对变量检查及要求很弱.

  • SpringBoot中使用 RabbitMQ的教程详解

    本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 一.Direct直接模式 通过routingKey和exchange决定的那个唯一的queue可以接收消息 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了方便测试,直接在父项目中建立两个子模块(生产者和消费者) 3.pom.xml文件的依赖如下: 父项目: <?xml version="1.0" encoding="U

  • Java中的反射机制示例详解

    目录 反射 什么是Class类 获取Class实例的三种方式 通过反射创建类对象 通过反射获取类属性.方法.构造器 更改访问权限和实例赋值 运用场景 反射 反射就是把Java类中的各个成分映射成一个个的Java对象.即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法:对于任意一个对象,都能调用它的任意一个方法和属性.这种动态获取信息及动态调用对象方法的功能叫Java的反射机制 每一个Java程序执行必须通过编译.加载.链接和初始化四个阶段 1.编译:将.java.文件编译成字节码.

  • Flutter中数据库的使用教程详解

    在Flutter开发过程中,我门有时候需要对一些数据进行本地的持久化存储,使用sp文件形式虽然也能解决问题,但是有时数据量较大的时候,显然我们文件形式就不太合适了,这时候我们就需要使用数据库进行存储,我们知道在原生中有系统提供的轻量级sqlite数据库,在Flutter强大的生态环境中,也有这样一个数据库插件sqflite: ^2.0.2可以同时在Androud.iOS中进行数据库操作. 1. 创建数据库:这里我以存储我的搜索历史记录为例. 首先导入: import 'package:sqfli

  • SpringCloud中Gateway的使用教程详解

    目录 1.基础教程 2.将配置放在配置文件里 3.放在springcloud里面 4.使用服务名而不是IP 1.基础教程 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent>

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • Java中正则表达式的使用和详解(下)

    在上篇给大家介绍了Java中正则表达式的使用和详解(上),具体内容如下所示: 1.常用正则表达式 规则 正则表达式语法   一个或多个汉字 ^[\u0391-\uFFE5]+$  邮政编码 ^[1-9]\d{5}$ QQ号码 ^[1-9]\d{4,10}$  邮箱 ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$  用户名(字母开头 + 数字/字母/下划线) ^[A-Za-z][A-Za-z1-9_-]+$ 手

  • java 中enum的使用方法详解

    java 中enum的使用方法详解 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结. 原始的接口定义常量 public interface IConstants { String MON = "Mon"; String TUE = "Tue"; String WED = "Wed"; String THU = "Thu

  • java 中自定义OutputFormat的实例详解

    java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa

随机推荐