JDBC基础

本文详细介绍了Java数据库连接(JDBC)的基本概念与使用方法,包括如何通过JDBC连接MySQL数据库,执行DML语句,以及使用Statement和PreparedStatement的区别。同时,提供了具体的代码示例,帮助读者理解并掌握JDBC的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. jdbc规范介绍

  是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
  JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题。
注意:
  1、在Java中,数据库存取技术只能通过JDBC访问数据库。JDBC是java访问数据库的基石,其他技术都是对jdbc的封装 ;
  2、JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成
  3、JDBC隶属于JavaSE的范畴,所以jdbc的版本是随着JavaSE的版本升级的。
  4、 java.sql包装的就是JDBC的API,在开发中(编写的Java代码),使用到的关于JDBC的类/接口全部引入的是java.sql包中的(主要不要错引入了com.mysql.)。

2.使用jdbc

 java使用jdbc连接MySQL和Oracle步骤大致一致,主要区别在于:
  1.需要导入的驱动包不一样,MySQL的jdbc驱动包可到官网下载,Oracle的驱动可在Oracle的安装目录中拷贝。
Oracle的jabc驱动在Oracle的安装目录中的位置
  2.驱动名不一样,MySQL需要加载的驱动名为:“com.mysql.jdbc.Driver”,二Oracle需要加载的驱动名为:“oracle.jdbc.driver.OracleDriver”
  3.数据路链接地址协议不一样,MySQL连接地址:jdbc:mysql://ip:端口/数据库名。例子:
   jdbc:mysql://localhost:3306/testdatabase
  Oracle连接地址:jdbc:oracle:thin:@ip:端口:实例名。例子:
   jdbc:oracle:thin:@127.0.0.1:1521:orcl
  4.执行的sql语句的语法有些不一样,本文不多做阐述,有时间。
下面的关于使用的介绍以MySQL为例。

 2.1获取数据库链接

  1.导包
 导入mysql的jar包(千万不要导入zip包)
导入成功后的mysql包
  1.获取数据库链接

public static Connection getJdbcConn() {
		// 协议(数据库地址),参数为设置编码格式,防止乱码
		String url = "jdbc:mysql://localhost:3306/driving_school?useUnide=true&characterEncoding=UTF-8" ;
		// 数据库用户名
		String user = "root" ;
		// 数据库密码
		String password = "123456" ;
		Connection conn = null ;
		try {
			// 加载和注册驱动程序 (从Java6(JDBC4.0)开始,此步骤可以省略)
			Class.forName("com.mysql.jdbc.Driver") ;
			// 通过DriverManager获取连接对象
			conn = DriverManager.getConnection(url, user, password) ;
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn ;
	}
 2.2 使用JDBC执行DML

执行sql语句的对象有两个,Statement和PreparedStatement,两者的联系和区别如下:
 关系:PreparedStatement继承自Statement,都是接口。
 区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高 ,还能放置sql注入。
 1、插入数据(增)
 插入数据时Statement和PreparedStatement两种都有示范,之后都使用PreparedStatement。
  Statement

public int saveData() {
		// 获取数据库连接
		Connection conn = this.getJdbcConn() ;
		// 向user表插入一条数据
		String sql = "insert into user (id,username,password,age) values('11','yxln','123456','22')" ;
		// 创建编译 SQL 语句的对象。
		Statement st = null ;
		int flag = 0 ;
		try {
			// 获取编译 SQL 语句的对象
			st = conn.createStatement() ;
			// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
			flag = st.executeUpdate(sql) ;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				} 
			}
		}
		return flag ;
	}

  PreparedStatement

public int saveData() {
		// 获取数据库连接
		Connection conn = this.getJdbcConn() ;
		// 向user表插入一条数据
		String sql = "insert into user (id,username,password,age) values(?,?,?,?)" ;
		// 创建预编译 SQL 语句的对象。
		PreparedStatement ps = null ;
		int flag = 0 ;
		try {
			// 获取预编译 SQL 语句的对象
			ps = conn.prepareStatement(sql) ;
			// 为对应的占位符赋值
			ps.setString(1, "123");
			ps.setString(2, "yxln");
			ps.setString(3, "123456");
			ps.setInt(4, 22);
			// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
			flag = ps.executeUpdate() ;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				} 
			}
		}
		return flag ;
	}

 2、删除数据(删)

public int deleteData() {
		// 获取数据库连接
		Connection conn = this.getJdbcConn() ;
		// 删除user中的一条数据
		String sql = "delete from user where id = ? " ;
		// 创建预编译 SQL 语句的对象。
		PreparedStatement ps = null ;
		int flag = 0 ;
		try {
			// 获取预编译 SQL 语句的对象
			ps = conn.prepareStatement(sql) ;
			// 为对应的占位符赋值
			ps.setString(1, "123");
			
			// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
			flag = ps.executeUpdate() ;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				} 
			}
		}
		return flag ;
	}

 3、修改数据(改)

public int updateData() {
		// 获取数据库连接
		Connection conn = this.getJdbcConn() ;
		// 修改user中的一条数据
		String sql = "update user set password=? where id = ? " ;
		// 创建预编译 SQL 语句的对象。
		PreparedStatement ps = null ;
		int flag = 0 ;
		try {
			// 获取预编译 SQL 语句的对象
			ps = conn.prepareStatement(sql) ;
			// 为对应的占位符赋值
			ps.setString(1, "456789");
			ps.setString(2, "11");
			// 执行sql语句(返回值为影响的行数,如果执行失败返回值为0)
			flag = ps.executeUpdate() ;
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				} 
			}
		}
		return flag ;
	}

 4、查询数据(查)

	public ResultSet selectData() {
		// 获取数据库连接
		Connection conn = this.getJdbcConn() ;
		// 查询user中的一条数据
		String sql = "select id, username,password,age from user where id = ? " ;
		// 创建预编译 SQL 语句的对象。
		PreparedStatement ps = null ;
		// 创建结果集对象,用于存储执行sql语句之后的结果集
		ResultSet rs = null ;
		try {
			
			// 获取预编译 SQL 语句的对象
			ps = conn.prepareStatement(sql) ;
			// 为对应的占位符赋值
			ps.setString(1, "11");
			// 执行sql语句,查询数据
			rs = ps.executeQuery() ;
			// 遍历结果集
			while(rs.next()) {
				System.out.println(rs.getString("id"));
				System.out.println(rs.getString("username"));
				System.out.println(rs.getString("password"));
				System.out.println(rs.getString("age"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}finally {
				try {
					ps.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}finally {
					try {
						conn.close();
					} catch (SQLException e) {
						e.printStackTrace();
					} 
				}
			}
		}
		return rs ;
	}

后面有时间在对jdbc做一些简单的封装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值