1.Connection接口常用方法
用来与数据库连接的对象,只有获得了特定的数据库对象才能对数据库进行操作
方法 | 描述 |
createStatement() | 创建一个 Statement 对象,用于执行 SQL 语句。 |
createStatement(int resultSetType,int resultSetConcurrency) | 根据给定的结果集类型和并发性创建一个 Statement 对象,用于执行 SQL 语句。 |
prepareStatement() | 创建一个 PreparedStatement 对象,用于执行带有参数的 SQL 语句。 |
isReadOnly() | 返回一个布尔值,指示数据库连接是否为只读模式。 |
setReadOnly() | 设置数据库连接的只读模式,以指示是否允许修改数据库。 |
commit() | 提交当前事务中所有挂起的更改。 |
rollback() | 回滚当前事务中的所有挂起的更改。 |
close() | 关闭数据库连接。 |
2.DriverMange类
这个类主要包含和数据库的交互方法
方法 |
描述 |
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(); } } }
3.Statement接口
该接口是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);
4.实现表的数据更新(增、改、删)
案例实现:实现插入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(); } }
5.实现数据查找(ResultSet接口)
数据查询返回的值需要用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(); } }
6.PreparedStatement 数据更新
问题引入:如果要正常插入数据并且使用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(); } }