JDBC——基于Mysql的基本操作
一、JDBC连接数据库6个步骤:
1、加载并注册驱动程序
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),通过java.lang.Class类的静态方法forName(String className)实现。
例:
try{//加载MySql的驱动类
Class.forName("com.mysql.jdbc.Driver") ;
}catch(ClassNotFoundException e){
System.out.println("找不到驱动程序类 ,加载驱动失败!");
e.printStackTrace() ;
}
成功加载后,会将Driver类的实例注册到DriverManager类中。
2、创建数据库的连接
数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和密码来获得。
例:
//连接MySql数据库
String url = "jdbc:mysql://127.0.0.1:3306/student";
String user = "root";
String password = "";
try {
Connection con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("数据库连接失败!");
e.printStackTrace();
}
3、创建一个Statement
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
- 执行静态SQL语句。通常通过Statement实例实现。
- 执行动态SQL语句。通常通过PreparedStatement实例实现。
具体的实现方式:
Statement stmt = con.createStatement() ;
PreparedStatement pstmt = con.prepareStatement(sql) ;
4、执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
- (类型不定,一般会同时有很多种类型)executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
- (int型)executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
- (boolean型)execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
具体实现的代码:
ResultSet rs = stmt.executeQuery(sql) ;
int rows = stmt.executeUpdate(sql) ;
boolean flag = stmt.execute(sql) ;
5、遍历结果集
两种情况:
- 执行更新返回的是本次操作影响到的记录数。
- 执行查询返回的结果是一个ResultSet对象。
ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些 行中数据的访问。
使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString("name") ;
String pass = rs.getString(1) ; // 此方法比较高效
}
(列是从左到右编号的,并且从列1开始)
6、关闭JDBC对象资源
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声明顺序相反:
- 先关闭resultSet
- 再关闭preparedStatement
- 最后关闭连接对象connection
例:
if(rs !=null){ // 关闭结果集
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt !=null){ // 关闭声明
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null){ // 关闭连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
1、查询:
package jdbc1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.management.RuntimeErrorException;
import com.mysql.cj.jdbc.Driver;
public class JDBC1 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1、注册并加载驱动
//Driver driver = new Driver();
//DriverManager.registerDriver(driver);//这种注册方式会注册两次,推荐使用下面那种
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/student";
String user = "root";
String password = "";
con = DriverManager.getConnection(url, user, password);
// 3、获取操作数据库的对象
stmt = con.createStatement();
// 4、向数据库发送查询语句
String sql = "select * from student ";
rs = stmt.executeQuery(sql);
// 5、遍历结果集,获取查询对象
while (rs.next()) {// 遍历一行后,才会跳转到下一行
int sno = rs.getInt("sno");//
String sname = rs.getString(2);// 和上一行不同的写法
String sex = rs.getString(3);
System.out.println(sno + " " + "" + sname + " " + sex);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
// 6.关闭连接,释放资源
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
2、更新:
package jdbc1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBC1 {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// 2、获取连接对象
String url = "jdbc:mysql://127.0.0.1:3306/student";
String user = "root";
String password = "";
con = DriverManager.getConnection(url, user, password);
// 3、获取操作数据库的对象
stmt = con.createStatement();
// 3.创建SQL语句
String sql = "insert into student values(121530601,'张三','女',16,6)";
// 4. 执行SQL语句
int row = stmt.executeUpdate(sql);
System.out.println(row);
} catch (Exception e) {
} finally {
// 5. 释放资源
if (stmt != null) {
try {
stmt.close();
} catch (Exception e) {
e.printStackTrace(); // 打印异常
}
}
if (con != null) {
try {
con.close();
} catch (Exception e) {
e.printStackTrace(); // 打印异常
}
}
}
}
}
二、使用ResultSet更新数据:
ResultSet是否滚动
ResultSet是否可更新
查询学号为121530602的学生的基本信息输出后修改其姓名:
// 3、获取操作数据库的对象
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
// 4、向数据库发送查询语句
String sql = "select * from student where sno=121530602";
rs = stmt.executeQuery(sql);
// 5、遍历结果集,获取查询对象
System.out.println("学号"+"\t\t"+"姓名"+"\t\t"+"性别"+"\t\t"+"年龄"+"\t\t"+"班级");
while (rs.next()) {// 遍历一行后,才会跳转到下一行
int sno = rs.getInt("sno");//
String sname = rs.getString(2);// 和上一行不同的写法
String sex = rs.getString(3);
String age = rs.getString(4);
String Class = rs.getString(5);
System.out.println(sno + "" + "\t\t" + sname + "\t\t" + sex+"\t\t"+age+"\t\t"+Class);
}
rs.absolute(1);
rs.updateString("sname","赵四");
rs.updateRow(); //将当更新保存到数据库
输出所有学生的所有信息,然后添加一名新学生:
// 3、获取操作数据库的对象
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
// 4、向数据库发送查询语句
String sql = "select * from student";
rs = stmt.executeQuery(sql);
// 5、遍历结果集,获取查询对象
System.out.println("学 号"+"\t\t"+"姓名"+"\t\t"+"性别"+"\t\t"+"年龄"+"\t\t"+"班级");
while (rs.next()) {// 遍历一行后,才会跳转到下一行
int sno = rs.getInt("sno");//
String sname = rs.getString(2);// 和上一行不同的写法
String sex = rs.getString(3);
String age = rs.getString(4);
String Class = rs.getString(5);
System.out.println(sno + "" + "\t\t" + sname + "\t\t" + sex+"\t\t"+age+"\t\t"+Class);
}
rs.moveToInsertRow();
rs.updateString("sno","121530605");
rs.updateString("sname","老八");
rs.updateString("sex","男" );
rs.updateInt("age", 26);
rs.updateInt("Class",8);
rs.insertRow();
三、预编译语句实现数据更新:
添加数据:
PreparedStatement pStmt = con.prepareStatement("insert into student (name,pwd,email) values(?,?,?)");
pStmt.setString(1,"dream");
pStmt.setString(2,"111");
pStmt.setString(3, "dd@a.com");
int rtn= pStmt.executeUpdate();
修改数据:
PreparedStatement pStmt = con.prepareStatement("update student set pwd=?,email=? where name=?");
pStmt.setString(1,“222");
pStmt.setString(2,“a@a.c");
pStmt.setString(3,“dream");
int rtn= pStmt.executeUpdate();
删除数据:
PreparedStatement pStmt = con.prepareStatement("delete from student where name=?");
pStmt.setString(1,"dream");
int rtn= pStmt.executeUpdate();