目录
1.Connection接口常用方法
2.DriverMange类
3.Statement接口
4.实现表的数据更新(增、改、删)
5.实现数据查找(ResultSet接口)
6.PreparedStatement 数据更新
用来与数据库连接的对象,只有获得了特定的数据库对象才能对数据库进行操作
方法 | 描述 |
---|---|
createStatement() | 创建一个 Statement 对象,用于执行 SQL 语句。 |
createStatement(int resultSetType,int resultSetConcurrency) | 根据给定的结果集类型和并发性创建一个 Statement 对象,用于执行 SQL 语句。 |
prepareStatement() | 创建一个 PreparedStatement 对象,用于执行带有参数的 SQL 语句。 |
isReadOnly() | 返回一个布尔值,指示数据库连接是否为只读模式。 |
setReadOnly() | 设置数据库连接的只读模式,以指示是否允许修改数据库。 |
commit() | 提交当前事务中所有挂起的更改。 |
rollback() | 回滚当前事务中的所有挂起的更改。 |
close() | 关闭数据库连接。 |
这个类主要包含和数据库的交互方法
方法 | 描述 |
---|---|
getConnection(String url, String user, String password) | 获取与指定数据库的连接。传入数据库的URL、用户名和密码作为参数。 |
setLogonTimeout() | 设置在尝试连接到数据库时等待的最长时间,超过该时间将引发异常。 |
println(String message) | 打印消息到控制台或日志文件中。用于调试和记录信息。 |
案例代码:数据库的连接(基于MySQL)
数据库的连接与关闭
package com.company;
import java.sql.Connection;
import java.sql.DriverManager;
public class Main {
public static void main(String[] args){
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxx";
Connection conn = null;
try {
// 通过反射加载mysql驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 输出连接对象信息
System.out.println(conn);
// 关闭连接
conn.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
该接口是java执行数据库的重要操作,在建立完成数据库连接的基础上,向数据库发送需要执行的SQL的语句
方法 | 描述 |
---|---|
execute(String sql) | 执行给定的 SQL 语句,返回一个布尔值表示是否执行成功。 |
executeQuery(String sql) | 执行给定的查询 SQL 语句,返回一个结果集 ResultSet 对象。 |
clearBatch() | 清除该 Statement 对象当前设置的批处理命令。 |
addBatch(String sql) | 将 SQL 语句添加到当前的批处理中。 |
close() | 关闭 Statement 对象。任何打开的结果集也将关闭。 |
1.在案例操作前先确保建立好一个列表
这里通过Datadrip工具也可以用其他的工具比如DBeaver、Navica可以t快速根据需求自动生成sql脚本,也可以通过sql语句自行创建。
创建一个Person表,定义了姓名,年龄,身份证,名族。并且设置了身份证为唯一的主码并且是唯一的。
具体sql语句如下:
create table Person
(
name varchar(4) not null comment '姓名',
age int null comment '年龄',
ID int null comment '身份证',
nation varchar(4) null comment '民族'
);
create unique index Person_ID_uindex
on Person (ID);
alter table Person
add constraint Person_pk
primary key (ID);
案例实现:实现插入sql信息
插入信息
姓名:王二 年龄:18 身份id:001 民族:汉族
SQL代码案例:
insert into person(name, age, ID, nation) VALUE ('王二',18 ,001 ,'汉族');
那么搭配JDBC实现数据库中表的插入代码如下:
package JavaWeb02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class javaDemo {
public static void main(String[] args)throws Exception {
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxx";
String sql = "insert into person(name, age, ID, nation) VALUE ('王二',18 ,001 ,'汉族')";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据库操作对象
Statement statement = conn.createStatement();
int count = statement.executeUpdate(sql);
System.out.println("更新行数"+count);
// 关闭数据库连接
conn.close();
}
}
已经会了插入就可以尝试其他操作,比如数据删除,数据修改等等只需要把sql内容改一下就行了
案例:数据修改
package JavaWeb03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class javaDemo {
public static void main(String[] args) throws Exception{
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxx";
String sql = "update person set name='黄小龙',age=99 where name='王二'";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
Connection coon = null;
coon = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据库操作对象
Statement statement = coon.createStatement();
System.out.println("更新的行数"+statement.executeUpdate(sql));
coon.close();
}
}
案例:数据删除
package JavaWeb04;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class javaDemo {
public static void main(String[] args) throws Exception{
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxxx";
// 想要执行的sql语句
String sql ="delete from person where name='王二'";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 连接数据库
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据库操作对象
Statement statement = conn.createStatement();
statement.executeUpdate(sql);
// 关闭连接
conn.close();
}
}
数据查询返回的值需要用ResultSet接口进行封装
以下是接口ResultSet接口的常用方法:
方法名 | 描述 |
---|---|
next() | 将游标移动到结果集中的下一行,并返回是否还有更多行可用的布尔值。在循环中逐行处理结果集时使用。 |
getXxx(int columnIndex) | 根据列的索引获取当前行指定列的数据。columnIndex是从1开始计数的列索引。getXxx代表具体的数据类型,如getInt、getString等。返回指定列的数据,可以进行类型转换。 |
getXxx(String columnLabel) | 根据列的名称获取当前行指定列的数据。columnLabel是列的字符串形式名称。类似于getXxx(int columnIndex)方法,返回指定列的数据。 |
close() | 关闭结果集,释放与结果集相关的资源。在不再需要访问结果集时,应该调用此方法来关闭结果集,以便及时释放资源。 |
数据查询案例:
数据库内容:
案例代码:
package JavaWeb05;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class javaDemo {
public static void main(String[] args)throws Exception {
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxxx";
String sql = "select name, age, ID, nation from person";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建操作对象,并且对象使用的是执行查找语句的方法
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
// 需要按照定义的类型进行接收
while (rs.next()){
String name = rs.getString("name");
int age = rs.getInt("age");
int id = rs.getInt("id");
String nation = rs.getString("nation");
System.out.println("name="+name+" age="+age+" id="+id+" nation="+nation);
}
// 退出连接
conn.close();
rs.close();
}
}
问题引入:如果要正常插入数据并且使用statement接口则代码会如下:
package JavaWeb06;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
public class javaDemo {
public static void main(String[] args)throws Exception {
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxx";
String name ="汪心";
int id = 100;
String nation = "汉族";
int age = 32;
String sql = "insert into person(name, age, ID, nation)VALUE("+name+","+age+","+id+","+nation+")";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 连接
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据操作对象
Statement statement = conn.createStatement();
statement.executeUpdate(sql);
// 关闭对象
conn.close();
}
}
可以看到,如果用statement接口,那么会需要一个完整的sql语句,而sql语句需要通过拼接起来,非常麻烦,所以引入了PreparedStatement
Preparedstatement的常用方法如下:
方法 | 描述 |
---|---|
executeUpdate() |
执行 INSERT、UPDATE 和 DELETE 等更新操作,并返回更新的行数。 |
executeQuery() |
执行 SELECT 查询操作,并返回结果集。 |
setXxx(index, value) |
通过索引设置参数值,其中 Xxx 表示数据类型,如 setInt 、setString 等。 |
setXxx(parameterName, value) |
通过参数名设置参数值,其中 Xxx 表示数据类型,如 setInt 、setString 等。 |
setNull(index, dataType) |
设置参数为空值。 |
getGeneratedKeys() |
获取生成的键。 |
Preparedstatement与Statement相比在编写sql语句的时候可以用"?"进行占位符的设计,在通过conn.prepareStatement(sql语句)创建对象时候,将sql作为参数传入进去,对于每一位的?占位符都可以通过对象.set类型(第几个占位符,类型值)
以下案例代码实现通过Preparedstatement向数据库插入一条数据
插入案例代码:
package JavaWeb07;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class javaDemo {
public static void main(String[] args)throws Exception {
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxx";
String name ="汪心";
int id = 100;
String nation = "汉族";
int age = 32;
String sql ="insert into person(name, age, ID, nation)VALUES"+"(?,?,?,?)";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据操作对象
PreparedStatement preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1,name);
preparedStatement.setInt(2,age);
preparedStatement.setInt(3,id);
preparedStatement.setString(4,nation);
int count = preparedStatement.executeUpdate();
System.out.println("本次更新的行数"+count);
// 关闭连接
conn.close();
}
}
案例 数据查询:
package JavaWeb08;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class javaDemo {
public static void main(String[] args)throws Exception {
final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
final String DATABASE_URL="jdbc:mysql://localhost:3306/mysqltest";
final String DATABASE_USER ="mysql";
final String DATABASE_PASSWORD ="xxxxxxx";
String sql ="select name, age, ID, nation from person";
// 加载驱动
Class.forName(DATABASE_DRIVER);
// 建立连接
Connection conn = null;
conn = DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
// 创建数据操作对象
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()){
// ResultSet通过占位符的位置获取信息
String name = rs.getString(1);
int age = rs.getInt(2);
int id = rs.getInt(3);
String nation = rs.getString(4);
System.out.println("name="+name+" age="+age+" id="+id+" nation="+nation);
}
// 关闭连接
conn.close();
rs.close();
}
}