JDBC驱动访问MySQL数据库
本人用的是8.0版本的MySQL,因此在连接的时候,需要使用jdbc驱动,首先写一个Connec类:
public class Connect {
//JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String MY_URL = "jdbc:mysql://localhost:3306/world?useSSL=false&serverTimezone=UTC";
// 数据库的用户名与密码
static final String USER = "root";
static final String PASSWORD = "*******";
static public Connection link = null;
static public PreparedStatement statement = null;
public Connect(){
try{
Class.forName(JDBC_DRIVER);
link = DriverManager.getConnection(MY_URL,USER,PASSWORD);
}catch (Exception e)
{
e.printStackTrace();
}
}
其中对URL分析,jdbc是驱动,“mysql://localhost:3306”是数据库地址,world是该地址下具体的Schemas名字,剩下部分的是jdbc标志格式后缀。
涉及的相关函数
在连接MySQL之后,我们当然会想在Java中对数据库进行相关操作,这时候,有些方法就必须了解。
- ResultSet executeQuery(String sql);
执行SQL查询,并返回ResultSet 对象。 - int executeUpdate(String sql);
可执行增,删,改,返回执行受到影响的行数。 - boolean execute(String sql);
可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet。
这三个方法都来自PreparedStatement接口
executeUpdate() 是 PreparedStatement 接口中的方法
executeUpdate(String sql) 是 PreparedStatement 的父类接口 Statement 中继承过来的方法
executeUpdate() 中执行 SQL 语句需要在创建 PerparedStatement 时通过 Connection 的 prepareStatement(String sql) 方法中写出。
因为 PerparedStatement 中的 SQL 语句数据库需要进行预编译和缓存,所以要在创建 PerparedStatement 对象时给出 SQL 语句。
executeUpdate(String sql) 是 Statement 中的方法,参数中的 SQL 语句直接提交给数据库去执行,不需要预编译。
如果 SQL 语句中有 ? 占位符,那么在设置好占位符中的值后,必须使用 executeUpdate() 执行。
executeUpdate(String sql) 只是提交一个 SQL 语句,且这个语句中不能带有 ? 占位符。
ResultSet结果集
查询数据库时,返回的是一个二维的结果集,我们需要用到ResultSet来遍历结果集,获取每一行的数据。
boolean next() 将光标从当前位置向前移一行。
String getString(int columnIndex) 以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值
String getString(String columnLabel) 以java编程语言中String的形式获取此ResultSet对象的当前行中指定列的值
应用举例:
ResultSet rs = psta.executeQuery();//返回结果集ResultSet
while(rs.next()){
int id = rs.getInt(1);// 获取第一个列的值 编号id
String bookName = rs.getString(2);// 获取第二个列的值 图书名称 bookName
String author = rs.getString(3);// 获取第三列的值 图书作者 author
float price = rs.getFloat(4);// 获取第四列的值 图书价格 price
}
MySQL数据库准备
首先连接的world数据库里创建一个Marks表,并初始化四个同学的成绩:
添加函数
在Connect类中添加查询函数:
//查询函数
public static ResultSet search(String sql){
ResultSet resultSet = null;
try{
//将对sql预处理之后的结果放入statement
statement = link.prepareStatement(sql);
//将预处理后的statement传到MySQL,并返回结果
resultSet = statement.executeQuery();
}catch (Exception e){
e.printStackTrace();
}
return resultSet;
}
在Connect类中添加关闭数据库函数
//关闭数据库函数
public static void close(){
try{
link.close();
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
在Connect类中添加插入、删除和更新函数
//使用update函数进行表的插入、更新和删除
public static boolean Update(String sql){
int success=0;
try{
statement = link.prepareStatement(sql);
success = statement.executeUpdate(sql);
}catch (Exception e){
e.printStackTrace();
}
return success != 0; //如果修改失败,受影响的行数为0
}
}
Connect类完整代码
package Connect;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Connect {
//JDBC 驱动名及数据库 URL
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String MY_URL = "jdbc:mysql://localhost:3306/world?useSSL=false&serverTimezone=UTC";
// 数据库的用户名与密码
static final String USER = "root";
static final String PASSWORD = "********";
static public Connection link = null;
static public PreparedStatement statement = null;
public Connect(){
try{
Class.forName(JDBC_DRIVER);
link = DriverManager.getConnection(MY_URL,USER,PASSWORD);
}catch (Exception e)
{
e.printStackTrace();
}
}
//关闭数据库函数
public static void close(){
try{
link.close();
statement.close();
}catch (SQLException e){
e.printStackTrace();
}
}
//查询函数
public static ResultSet search(String sql){
ResultSet resultSet = null;
try{
//将对sql预处理之后的结果放入statement
statement = link.prepareStatement(sql);
//将预处理后的statement传到MySQL,并返回结果
resultSet = statement.executeQuery();
}catch (Exception e){
e.printStackTrace();
}
return resultSet;
}
//使用update函数进行表的插入、更新和删除
public static boolean Update(String sql){
int success=0;
try{
statement = link.prepareStatement(sql);
success = statement.executeUpdate(sql);
}catch (Exception e){
e.printStackTrace();
}
return success != 0; //如果修改失败,受影响的行数为0
}
}
实例调用
另开一个main文件,在里面进行对Connect的调用访问,使用Scanner方法来实现在Java中输入MySQL的命令行操控数据库。再利用ResultSet方法将数据库可视化。后续的插入、更新和删除操作就直接使用预处理语句。
package Connect;
import java.sql.*;
import java.util.Scanner;
public class main {
static Connect linker = null; //创建Connect对象
public static void main(String[] args){
linker = new Connect();
String sql;
ResultSet resultSet = null;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入SQL查询指令:");
try {
sql = scanner.nextLine();
resultSet = linker.search(sql);
while(resultSet.next()){
String id = resultSet.getString(1);
String the_name = resultSet.getString(2);
String mark = resultSet.getString(3);
String grade = resultSet.getString(4);
System.out.println(id + '\t' + the_name + '\t' + mark + '\t' + grade);
}
resultSet.close();
}catch (SQLException e){
e.printStackTrace();;
}
try {
sql = "insert into world.marks VALUE (18340005, 'JAck', 77, 29);";
if(!linker.Update(sql)){
System.out.println("语句错误!");
}
sql = "update world.marks set mark = 79 where id = 18340005;";
if(!linker.Update(sql)){
System.out.println("语句错误!");
}
sql = "delete from world.marks where id = 18340005;";
if(!linker.Update(sql)){
System.out.println("语句错误!");
}
linker.close(); //最后关闭数据库
}catch (Exception e){
e.printStackTrace();
}
}
}
最后的运行结果如下: