目录

Jdbc

Jdbc编程步骤

1.JDBC驱动

a.导入相应的jar包(访问不同的数据库需要导入不同数据库厂家提供的jar包)

b.初始化驱动

2.建立JDBC和数据库之间的Connection连接

DriverManager类

在getConnection方法中的三个参数

3.创建Statement或者PreparedStatement接口,执行SQL语句

使用Statement接口

使用PreparedStatement接口(推荐)

4.接收sql语句执行后返回的结果

ResultSet

进行查询操作

进行删除操作

5.处理查询结果集

.next()方法

6.关闭资源

.close方法

代码演示:

1.数据查询

2.添加数据

Jdbc

JDBC(JavaDataBaseConnectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现sun公司将jdbc接口的规定写好之后,不同的数据库厂家将接口进行实现

JDBC接口包括两个层次:

JDBC API:即面向应用的API,是一个抽象的接口,供应用程序开发人员使用,提供了程序到JDBC管理器的连接

JDBC Driver API:即面向数据库驱动的API,需要开发商去实现这个接口,提供了JDBC管理器到数据库驱动程序的连接

Jdbc编程步骤

1.JDBC驱动

a.导入相应的jar包(访问不同的数据库需要导入不同数据库厂家提供的jar包)

这里导入的是MySQL数据库

mysql-connector-java-8.0.23.jar的下载链接:下载链接

服务器一年后过期,过期的话先用百度网盘下载吧

链接:https://pan.baidu.com/s/187wdM_EU_Nc8adLdMnwUoQ” />

b.初始化驱动

通过初始化驱动类com.mysql.jdbc.Driver,该类就在 mysql-connector-java-5.0.8-bin.jar中。如果你使用的是oracle数据库那么该驱动类将不同

在8.0.27版本的jar包加载类“com.mysql.jdbc.Driver”。这是不推荐的。新的驱动程序类是“com.mysql.cj.jdbc.driver”。驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类

注意:Class.forName需要捕获ClassNotFoundException.

try {Class.forName("com.mysql.jdbc.Driver");} catch (ClassNotFoundException e) { e.printStackTrace();}

Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。

2.建立JDBC和数据库之间的Connection连接

DriverManager类

管理一组 JDBC 驱动程序的基本服务;作为初始化的一部分,DriverManager类会尝试加载在 “jdbc.drivers” 系统属性中引用的驱动程序类。这允许用户定制由他们的应用程序使用的 JDBC Driver

.DriverManager类有getConnection方法可以对数据库进行连接

在getConnection方法中的三个参数

  • URL:jdbc:mysql://127.0.0.1:3306/school

通信协议:jdbc:mysql:// 通信协议有很多:http、https等(通信协议就是一个规范,是一个提前规定好的数据传输格式)

数据库服务端的IP地址: 127.0.0.1 (这是本机,如果连接其他电脑上的数据库,需填写相应的IP地址)本机地址也可以写成127.0.0.0或者是localhost

PORT(数据库)的端口号: 3306 (mysql专用端口号)

数据库名称 school(根据你自己数据库中的名称填写)

  • 账号: root
  • 密码 : root ( 你在创建数据库的时候没有使用默认的账号和密码,请填写自己设置的账号和密码)

getConnection方法中返回值是一个Connection类型的数据

Connection是与特定数据库连接回话的接口,使用的时候需要导包,而且必须在程序结束的时候将其关闭。getConnection方法也需要捕获SQLException异常(可以在函数上直接写throws Exception将异常抛出)

public static void select() throws Exception {//加载jdbc驱动包Class.forName("com.mysql.jdbc.Driver");//与数据库进行连接Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","root");}

3.创建Statement或者PreparedStatement接口,执行SQL语句

在传递sql语句的时候可以将一些数据写成?的形式

delete from user where id = ” />使用Statement接口

用于执行静态 SQL 语句并返回它所生成结果的对象

在默认情况下,同一时间每个 Statement对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它

Statement s = conn.createStatement();// 准备sql语句// 注意: 字符串要用单引号'String sql = "insert into t_courses values(null,"+"'数学')";//在statement中使用字符串拼接的方式,这种方式存在诸多问题s.execute(sql);System.out.println("执行插入语句成功");
  • 使用PreparedStatement接口(推荐)

PreparedStatement表示预编译的 SQL 语句的对象

SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句

//准备sql语句String sql = "select * from user";PreparedStatement st = con.prepareStatement(sql);

4.接收sql语句执行后返回的结果

ResultSet

如果是进行修改,添加,删除操作则不使用ResultSet

使用PreparedStatement中的executeQuery方法和executeUpdate方法

1.executeQuery方法

执行给定的 SQL 语句,该语句返回单个 ResultSet 对象(用于对数据库的查询操作)

2.executeUpdate方法

执行给定 SQL 语句 ,返回值为int类型,该语句可能为 INSERT(添加)UPDATE(改) DELETE(删除) 语句,或者不返回任何内容的 SQL 语句

进行查询操作

String sql = "select * from user";PreparedStatement st = con.prepareStatement(sql);ResultSet rt = st.executeQuery();

进行删除操作

//加载jdbc驱动 Class.forName("com.mysql.jdbc.Driver");//对数据库进行连接Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","root");//准备sql语句String sql = "delete from user where id = " />0){System.out.println("成功了");}else{System.out.println("失败了");}

在进行查询操作的时候需要将数据从返回的ResultSet对象中单个取出,在项目中也可以写一个于数据库中数据相同的一个类,在需要将数据传输给前端的时候使用;

例如:

public class Student {private int id;private String name;private int age;private String sex;}

在这个类中还需要实现构造函数,可以使用快捷键来完成构造函数

在代码页面点击alt+insert键

第一个就是构造函数,Ctrl + A全选,点击OK是所有的有参的构造函数,点击select_None创建无参数的构造函数

在使用alt+insert键 添加get和set属性和toString.

例:

public class Student {private int id;private String name;private int age;private String sex;public Student() {}public Student(int id, String name, int age, String sex) {this.id = id;this.name = name;this.age = age;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return//可以根据自己需要的输出方式进行输出更改"id=" + id +", name='" + name + '\'' +", age=" + age +", sex='" + sex + '\'' ;}}

5.处理查询结果集

通过不同的方式将收集到的数据进行加工处理输出

.next()方法

将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。

当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。如果结果集的类型是 TYPE_FORWARD_ONLY,则其 JDBC 驱动程序实现对后续 next 调用是返回 false 还是抛出 SQLException 将由供应商指定。

通过.next()方法可以将获取到的内容进行循环获取到

如下是用创建的类进行处理

List list = new ArrayList();while(rt.next()){Student stu = new Student();stu.setId( rt.getInt(1));stu.setName( rt.getString(2));stu.setAge( rt.getInt(3));stu.setSex(rt.getString(4));list.add(stu);}for(Student a : list){System.out.println(a.toString());}

直接输出型

//获取的结果集ResultSet rt = st.executeQuery();//进行循环 while(rt.next()){System.out.println(rt.getInt(1) +"/t"+rt.getString(2)+"/t"+ rt.getInt(3)+"/t"+rt.getString(4));}

6.关闭资源

.close方法

立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。

关闭 ResultSet 对象不会关闭 ResultSet 创建的 BlobClobNClob 对象。BlobClobNClob 对象至少在创建它们的事务期间持续有效,除非调用了其 free 方法。

当关闭 ResultSet 时,所有通过调用 getMetaData 方法创建的 ResultSetMetaData 实例都可以访问

虽然代码在main方法中运行后会关闭,但是在运用到实际的开发中是不会自动关闭的,所以需要进行资源的关闭

 rt.close();st.close();con.close();

代码演示:

1.数据查询

import org.junit.Test;import javax.xml.transform.Result;import java.sql.*;import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Jdbc {@Testpublic void conal() throws Exception {select();delete();insert();}public static void select() throws Exception {//加载jdbc驱动包Class.forName("com.mysql.jdbc.Driver");//与数据库进行连接Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","root");//准备sql语句String sql = "select * from user";//执行sql语句PreparedStatement st = con.prepareStatement(sql);//接收执行后的结果ResultSet rt = st.executeQuery();List list = new ArrayList();while(rt.next()){ Student stu = new Student(); stu.setId( rt.getInt(1)); stu.setName( rt.getString(2)); stu.setAge( rt.getInt(3)); stu.setSex(rt.getString(4)); list.add(stu);}for(Student a : list){ System.out.println(a.toString());}//关闭资源rt.close();st.close();con.close();}}

2.添加数据

数据的删除和修改和添加数据是相同的,只有sql语句是不同的

public static void insert() throws Exception { //加载jdbc驱动包Class.forName("com.mysql.jdbc.Driver");//与数据库进行连接Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/school","root","root");String sql = "insert into user (name,age,sex)values (" />0){System.out.println("成功了");}else{System.out.println("失败了");}st.close();con.close();}