本教程是通过IEDA创建的maven项目,Java语言实现JDBC连接本地MySQL数据库。
开发工具:IDEA2021.1.3
JDK版本:1.8.0_152
MySQL连接驱动包版本:mysql-connector-java 5.1.47
粘贴复制到自己的pom.xml:
mysql
mysql-connector-java
5.1.47
IDEA自动配置到当前工程项目:
使用Class.forName获取com.mysql.jdbc.Driver.class。
获取方式例如:
Class.forName("com.mysql.jdbc.Driver");
先创建一个connection对象,再通过DriverManager.java类中的getConnection()方法获取连接数据的信息(url+数据库名称+用户名+密码),并把连接信息传给connection对象。
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbweb?
useSSL=false", "root", "root");
———"jdbc:mysql"是Sun公司与MySQL数据库公司定义的一个协议,好比http、https。
(sql server,Oracle在使用JDBC连接数据库时都有自己相应的协议方式)
———dbweb是我数据库名称
———localhost是我本机ip
———root是我安装MySQL设置的用户名
———root是我安装MySQL设置的密码
注意:是英文的冒号": "问号"? "以及双引号" "
使用Connection接口中createStatement()方法,创建用于向数据库发送SQL语句的对象。
statement = connection.createStatement();
使用java.sql库下Statement接口中的executeQuery(String sql)
,该方法返回的是一个
java.sql库下的
ResultSet结果集,所以结果集的接收方式如下:
ResultSet对象=Statement对象.executeQuery(sql);
//创建执行SQL语句的对象
Statement statement = null;
ResultSet resultSet = null;
//创建将要执行的sql语句
String sql ="select stu_id,stu_on,stu_name from student";
//statement.executeQuery(sql)执行DML语句(insert、delete、update),返回ResultSet类型
//resultSet创建结果集对象用于结束SQL执行后的结果
resultSet = statement.executeQuery(sql);
//statement.executeUpdate(String sql)执行DQL(select)语句
//返回int类型的结果(int值表示受影响的行数,查询n条数据,int = n;)
//resultSet = statement.executeUpdate(String sql);
由(4)可以知道,结果集为ResulSet对象(resultSet = statement.executeQuery(sql);)
这里需要使用ResulSet接口中next()方法,开发文档叙述如下:
返回结果是true或者false,这里表示当我们从结果集中取值之前,光标开始指向的位置是空行数据,如果想要光标继续向下获取第一行的数据,就必须调用next()一次,例如:
//next()一次表示指针指向下一行
// 1,2,3表示取当前行中每一列的数据
if (resultSet.next()) {
int intId = resultSet.getInt(1);
String strNo = resultSet.getString(2);
String strName = resultSet.getString(3);
System.out.println("id=" + intId + "学号=" + strNo + "姓名="+ strName);
}
运行结果:
再使用一次if循环取值第二行数据:
//查询第一行
if (resultSet.next()) {
int intId = resultSet.getInt(1);
String strNo = resultSet.getString(2);
String strName = resultSet.getString(3);
System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
}
//查询第二行
if (resultSet.next()) {
int intId = resultSet.getInt(1);
String strNo = resultSet.getString(2);
String strName = resultSet.getString(3);
System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
}
运行结果:
使用wihle(resultSet.next())循环对结果集全部查询——即遍历结果集resultSet
******JDBC中所有的下标从1开始,不是从0开始******
//while循环遍历结果集
//next()光标指向的行没有数据就跳出当前while()循环,然后继续执行while下面的语句(没return时)
while (resultSet.next()){
//getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//JDBC中所有的下标从1开始,不是从0开始
//getSting()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
String intId = resultSet.getString(1);
String strNo = resultSet.getString(2);
String strName = resultSet.getString(3);
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
}
运行结果:我的数据库有6行数据
还有一种情况是:getString("列名")方式使用wihle(resultSet.next())循环遍历结果集查询数据,而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名。
//while循环遍历结果集以getSting("列名")查询数据
while (resultSet.next()){
//getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//JDBC中所有的下标从1开始,不是从0开始
//getString()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
//而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名。"select stu_id as id form student";
String intId = resultSet.getString("stu_id");
String strNo = resultSet.getString("stu_no");
String strName = resultSet.getString("stu_name");
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}
运行结果:查询结果与索引的1,2,3完全一样,推荐使用根据sql列名查询
例:根据列名查询时,
String sql = "select stu_id as id,stu_no,stu_name from student";
while (resultSet.next()) {
String intId = resultSet.getString("stu_id");
String strNo = resultSet.getString("stu_no");
String strName = resultSet.getString("stu_name");
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}
上述代码中:
resultSet.getString("stu_id");
与
String sql = "select stu_id as id,stu_no,stu_name from student";
stu_id重命名为id
运行结果出错:java.sql.SQLException: Column 'stuid' not found。
因此,SQL语句中列表与getString(列表);保持一致性。
改成:getString("id");
while (resultSet.next()) {
String intId = resultSet.getString("id");
String strNo = resultSet.getString("stu_no");
String strName = resultSet.getString("stu_name");
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" +strName);
}
查询成功:
此外,不止getString(),还有很多取数据的类型,如:getInt()、getDouble()等。
关闭流的优先级顺序从左往右:1.resultSet>2.statement>3.connection
if (resultSet != null) {//关闭结果集
try {
resultSet.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
if (statement != null) {//关闭数据库操作对象
try {
statement.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
if (connection != null) {//关数据库连接
try {
connection.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
import java.sql.*;
/**
* created by ZSAndroid on 2021/7/6
* 描述:JDBC连接测试类
*
* @author
* @creat 2021-07-06-16:36:07
*/
public class JDBCTest {
private static String stringValueOne;
private static String stringValueTwo;
private static String stringValueThree;
private static String stringValueFour;
private static String stringValueFive;
private static String stringValueSix;
private static String stringValueSeven;
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//1.注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbweb?useSSL=false", "root", "root");
//3.获取数据库操作对象
statement = connection.createStatement();
//4.执行SQL
//String sql = "select * from student";
String sql = "select stu_id as id,stu_no,stu_name from student";
// int = statement.executeUpdate(sql);//数据的操作语言:insert delete update
// ResultSet = statement.executeQuery(sql);//专门执行DQL语句:select
resultSet = statement.executeQuery(sql);
//5.处理查询结果集
//查询第一行
// if (resultSet.next()) {
// int intId = resultSet.getInt(1);
// String strNo = resultSet.getString(2);
// String strName = resultSet.getString(3);
// System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
// }
// //查询第二行
// if (resultSet.next()) {
// int intId = resultSet.getInt(1);
// String strNo = resultSet.getString(2);
// String strName = resultSet.getString(3);
// System.out.println("id=" + intId + "学号=" + strNo + "姓名=" + strName);
// }
//while循环遍历结果集
//next()光标指向的行没有数据就跳出当前while()循环,然后继续执行while下面的语句(没return时)
// while (resultSet.next()) {
// //getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
// //JDBC中所有的下标从1开始,不是从0开始
// //getSting()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
// String intId = resultSet.getString(1);
// String strNo = resultSet.getString(2);
// String strName = resultSet.getString(3);
// System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
// }
//while循环遍历结果集以getSting("列名")查询数据
while (resultSet.next()) {
//getString()方法的特点 :不管数据库中数据的类型是什么,都以String类型取出
//JDBC中所有的下标从1开始,不是从0开始
//getString()中的1,2,3,4,5,6,7表示从当前行的几列取出数据 这种方式不健壮,不推荐使用
//而列名指的是将需要执行的sql语句中排列的列名,而不是数据库表中的字段名。"select stu_id as id form student";
String intId = resultSet.getString("id");
String strNo = resultSet.getString("stu_no");
String strName = resultSet.getString("stu_name");
System.out.println("学生ID==" + intId + ",学号==" + strNo + "," + "姓名==" + strName);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//6.关闭连接+释放资源
if (resultSet != null) {//关闭结果集
try {
resultSet.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
if (statement != null) {//关闭数据库操作对象
try {
statement.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
if (connection != null) {//关数据库连接
try {
connection.close();
} catch (SQLException sqlException) {
sqlException.printStackTrace();
}
}
}
}
}
仅自己学习记录,如有错误,敬请谅解~,谢谢~~~