目录
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
创建的Blob
、Clob
或NClob
对象。Blob
、Clob
或NClob
对象至少在创建它们的事务期间持续有效,除非调用了其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();}