JDBC编程基础

JDBC编程基础

JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。
可以用JAVA来写不同类型的可执行文件:JAVA应用程序、JAVA Applets、Java Servlet、JSP等,不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。简单说它就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。

JDBC概述

JDBC(Java DataBase Connectivity)
为Java语言定义的一个SQL调用级的统一界面
为访问关系数据库提供了一个标准的界面
从JDK1.2开始已包括了JDBC2.0的内容
JDBC(Java Database Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一的访问接口。
JDBC由一组用Java语言编写的类与接口组成,通过调用这些类和接口所提供的方法,用户能够以一致的方式连接多种不同的数据库系统,进而使用标准的SQL语言来存取数据库中的数据

使用JDBC访问MySQL

建立连接
每个JDBC应用程序至少要有一个JDBC驱动程序版本,JDBC驱动程序是Driver接口类的实现
需要将数据库生产厂商提供的驱动jar包添加到classpath中。驱动jar包可以从官网上下载或者从maven之类的仓库中下载
1、在java项目中新建文件夹Folder,名称为libs
2、将下载的jar包拷贝到libs文件夹下
3、将jar包添加到classpath上

Driver类是驱动程序厂家实现的接口,Driver使DriverManager和JDBC应用程序层可以独立于具体的数据库系统

java自身提供了对各类主流数据库系统的支持
通过java.sql 库,提供了统一的接口,使得可以在java环境下不必对程序作大规模的修改,只要更改相应的驱动程序,即可实现对各类数据库的操作,提高软件的生存周期和降低软件的开发成本和维护费用
编程获取数据库连接:
1、加载驱动程序
2、通过驱动管理器获取和数据库的连接

localhost是数据库服务器的IP地址,3306是数据库服务器的端口号[3306\1521\1433],test是连接的数据库名,?是额外参数,这里的serverTimezone用于设置使用的时区配置

1、加载JDBC驱动程序

在和某一特定数据库建立连接之前,必须首先加载一种可用的JDBC驱动程序。这需要使用java.sql包中的方法来加载JDBC驱动程序:Class.forName(“DriverName”);
DriverName是要加载的JDBC驱动程序名称
实际上还有一种简化写法 new 驱动类名称();
采用的是Access数据库,所以加载Access数据库驱动程序的方法为:

Class.forName("sun.jdbc.odbc. JdbcOdbcDriver");

JDBC的Driver可分为以下4中类型:JDBC-ODBC Bridge和ODBC Driver、Native-API partly-Java Driver、JDBC-Net All-Java Driver、Native-protocol All-Java Driver

2、创建数据库连接

创建和指定数据库的连接需要使用DriverManager类的getConnection()方法
一般的使用格式:

Connectionconn = DriverManager.getConnection(URL,username,password);

该方法返回的是一个Connection对象。这里的URL是一个字符串,代表了将要连接的数据源,即具体的数据库位置。不同的JDBC驱动程序其URL是不同的。

Class.forName("sun.jdbc.ordc.JdbcOdbcDriver");
Connection Conn =DriverManager.getConnection("jdbc:odbc:yy”);

注意:数据库连接属于稀有资源,所以必须保证及时关闭。采用try/finally接口或者try(resource){}自动关闭

3、执行SQL语句

在与某个特定数据库建立连接之后,连接会话就可以用于发送SQL语句。在发送SQL语句前,必须创建一个类的对象,该对象负责将SQL语句发送给数据库
创建Statement对象:

Statement smt =conn.create Statement();

PreparedStatement是Statement的子接口

执行修改操作 insert /update /delete

修改操作的返回值是一个int类型的值,表示所执行的sql语句操作了多少行数据

Statement对象的executeQuery()方法来执行数据库查询语句,executeQuery()方法返回一个ResultSet类的对象,它包含了SQL查询语句执行的结果

ResultSet rs = smt.executeQuery("SELECT * FROM student");

注意:获取数据时不建议通过列的索引号来获取对应列的数据

4、接收并处理SQL的返回结果

JDBC接收结果是通过ResultSet类的对象来实现的
一个ResultSet对象包含了执行某个SQL语句后满足条件的所有的行,它还提供了对这些行的访问,用户可以通过一组get方法来访问当前行的不同列
通常结果集的形式是一张带有表头和相应数值的表

5、关闭创建的各个对象

一个Statement对象在同一时间只能打开一个结果集,所以如果在同一个Statement对象中运行下一条SQL语句时,第一条SQL语句生成的ResultSet对象就被自动关闭了
当然也可以通过调用ResultSet接口的close()方法来手工关闭
关闭Statement对象和Connection对象可以分别使用各自的close()方法。

修改操作的完整代码:

在这里插入图片描述
注意:针对connection对象必须保证及时关闭,所以一定应该使用try/finally结构。正确的编程

public class Test1 {
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		int len=0;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");// 加载字符串对应的类
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "123456");
			stmt = conn.createStatement();
			String sql = "insert into student1(name,sex,age,score) values('wangwu',1,19,83.5)";
			len = stmt.executeUpdate(sql);// 提交并执行sql语句
		} catch (Exception e) {
			//基本上java.sql包中的操作都会引发一个受检型异常SQLException,但是一般针对这种异常没有什么好的处理方案
			e.printStackTrace();
		} finally {
			try {
				if (stmt != null)
					stmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			} finally {
				try {
					if (conn != null)
						conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		// 需要执行的sql语句
		if (len > 0)
			System.out.println("插入成功!");
		else
			System.out.println("插入失败!");
	}
}

public class Test1 {
	public static void main(String[] args)throws Exception {
		int len=0;
		new Driver();
		try(
				Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC", "root", "123456");
				Statement stmt = conn.createStatement();
			){
			String sql = "insert into student1(name,sex,age,score) values('wangwu',1,19,83.5)";
			len = stmt.executeUpdate(sql);// 提交并执行sql语句
		} 
		if (len > 0)
			System.out.println("插入成功!");
		else
			System.out.println("插入失败!");
	}
}

PreparedStatement

在这里插入图片描述
基本用法
在这里插入图片描述
PreparedStatement提供的功能:
1、允许sql语句中使用?占位符,表示参数
2、支持预编译功能
3、在一定程序上可以避免sql注入漏洞
查询所有的姓yan,年龄18岁以上男学生
在这里插入图片描述
注意:

Connection接口

Statement createStatement() 创建用于执行SQL语句的Statement对象

  • PreparedStatement prepareStatement(String
    sql)创建PrepareStatement对象,用于实现数据库的动态访问 ,参数:sql —— 是SQL的INSERT,UPDATE和DELETE语句,或是无返回结果的语句

  • prepareCall(sql):创建执行存储过程的callableStatement对象 void close()
    结束Connection对象对数据库的连接。强调:数据库连接属于稀有资源,必须保证及时关闭

  • boolean isClose() 测试是否已经关闭Connection对象对数据库的连接

  • setAutoCommit(boolean autoCommit):设置事务是否自动提交

  • commit() :在链接上提交事务

  • rollback() :在此链接上回滚事务

Statement接口

Statement接口用于执行静态的SQL语句,并将SQL语句的执行结果返回

  • ResultSet executeQuery(String sql)
    :执行SQL查询语句,返回满足条件的结果集。注意:ResultSet中并不是存储数据,而是存储一个行指针。所以必须在关闭之前操作ResultSet。如果连接关闭在访问ResultSet则异常

参数:sql —— 是SQL的SELECT语句

  • int executeUpdate(String sql) :执行SQL数据更新语句,返回值为结果集中的记录数

参数:sql —— 是SQL的INSERT,UPDATE和DELETE语句,或是无返回结果的语句

  • boolean execute(String sql)
    :执行任意SQL语句。如果第一个结果是ResultSet,则返回true;否则如果是整数型,则返回false。

参数:sql —— 可以是任何SQL语句

  • void close() :关闭当前的Statement对象

通过Connection接口建立Statement对象,可以使用executeQuery()方法对数据库表中存储的数据进行查询以及使用executeUpdate()方法进行插入、修改和删除记录的操作。必须保证关闭Connection,一般建议关闭Statement

  • addBatch(String sql) :把多条sql语句放到一个批处理中
  • executeBatch():向数据库发送一批sql语句执行。

三种Statement类

Statement:由createStatement创建,用于发送简单的静态SQL语句(不带参数)

PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象支持预编译,反复执行一个只是参数不同的sql语句时,比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement

CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

Statement和PreparedStatement的区别

Statement只能处理静态SQL;
PreparedStatement既能处理静态sql也能处理动态sql,它继承了Statement的特点
站在预处理角度: PreparedStatement适合做连续多次结构相同的sql语句,有优势.
Statement适合做连续多次不同结构的sql语句,有优势.
Sql注入漏洞,最终的解决方案还是需要通过编码实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。 首先,你需要了解Java GUI和JDBC基础知识,以便更好地理解下面的代码。 学生信息查询系统的基本功能是查询学生的信息,因此我们需要设计一个界面,包括输入查询条件和显示查询结果的区域。 以下是一个简单的Java GUI界面的代码示例: ``` import javax.swing.*; import java.awt.*; public class StudentManagementSystem extends JFrame { private JPanel panel; private JLabel nameLabel; private JTextField nameTextField; private JButton queryButton; private JTextArea resultTextArea; public StudentManagementSystem() { super("学生信息查询系统"); setSize(500, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new JPanel(); panel.setLayout(new GridLayout(2, 2)); nameLabel = new JLabel("姓名:"); nameTextField = new JTextField(20); queryButton = new JButton("查询"); resultTextArea = new JTextArea(); panel.add(nameLabel); panel.add(nameTextField); panel.add(queryButton); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(panel, BorderLayout.NORTH); contentPane.add(resultTextArea, BorderLayout.CENTER); setVisible(true); } public static void main(String[] args) { new StudentManagementSystem(); } } ``` 接下来,我们需要使用JDBC连接数据库并执行查询操作。以下是一个简单的JDBC代码示例: ``` import java.sql.*; public class JdbcTest { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "username", "password"); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("select * from student where name='" + name + "'"); while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println("id=" + id + ", name=" + name + ", age=" + age); } resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 将以上两个代码示例结合起来,你可以实现一个基本的学生信息查询系统。当用户在GUI界面中输入姓名并点击查询按钮时,程序会连接到数据库并执行查询操作,最终将查询结果显示在GUI界面中。 当然,这只是一个简单的示例,你可以根据自己的需求进行扩展和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值