Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的内容感兴趣,记得关注我👀👀以便不错过每一篇精彩。 当然,如果在阅读中发现任何问题或疑问,我非常欢迎你在评论区留言指正🗨️🗨️。让我们共同努力,一起进步! 加油,一起CHIN UP!💪💪
JDBC(Java Database Connectivity) 是Java提供的一套用于执行SQL语句的API,它定义了操作关系型数据库的标准接口。通过JDBC,开发者可以用统一的代码访问多种数据库(如MySQL、Oracle等),无需关心底层数据库的差异。
JDBC的核心组件:
mysql-connector-java
)。
java.sql.*
和javax.sql.*
,包含Connection
、Statement
、ResultSet
等接口。
优势:
mysql-connector-java.jar
)。一般都是去maven仓库中下载找到相对应的版本。lib
目录引入)。DataSource dataSource = new MysqlDataSource(); //向上转型
//设置数据库所在的地址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
//设置登录数据库的用户名
((MysqlDataSource) dataSource).setUser("root");
//设置登录数据库的密码
((MysqlDataSource) dataSource).setPassword("12345678");
//向下转型
DataSource 是一个接口。不能直接实例化,必须通过 它的实现类 MysqlDataSource 来实例化对象。
解析上面的代码。
(1) setURL 方法中的 URL 是什么?
URL:Uniform Resource Locator URL 是网络服务程序上用于指定信息位置的表示方法,简单地说,就是网址。
ip地址:127.0.0.1, 这很特殊,叫做环回ip .因为当前数据库客户端(也就是现在写的jdbc代码), 数据库服务器(存储数据的服务器)都是在一个主机上,所以可以用环回ip (这ip针对于任何人都是固定一样的),如果它们装在不同主机上就不能用环回ip了.
(2) setUser 方法中的 root 是什么?
root 是 MySQL 管理员默认自带的管理员用户。
(3) setPassword 方法中,填的就是我们安装 MySQL 时设置的密码。
Connection connection = dataSource.getConnection();
选择 Connection 接口时,注意选择的是 java.sql 下的包
这里记得抛出异常,否则会编译错误(之所以要这样 请看作者写的java异常文章,它有解释)
String sql = "insert into student values(18,'张三');";
PreparedStatement statement = connection.prepareStatement(sql);
这个sql只是一个字符串的sql, 还不能被真正的执行. 所以还要进行预处理一下, 也就是下面的statement, 对我们的sql语句进行一个预编译:
PrepareStatement - > 提前预编译
这里的sql字符换服务器是可以处理的, 服务器首先需要对SQL进行解析, 理解这里的含义并执行, 但是如果客户端这里有几千万个sql字符串请求, 那么对于服务器来说压力就比较大.
上面的语句由于是固定的,没有变量,我们可不可以在语句里面加变量?
可以的,我们可以通过占位符的方式添加变量。
Scanner scanner = new Scanner(System.in);
System.out.println("输入学号: ");
int id = scanner.nextInt();
System.out.println("输入姓名: ");
String name = scanner.next();
String sql = " insert into student values(?,?) " ;
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1,id);
statement.setString(2,name);
这里分为两种: 如果是 insert,update,delete 都是用 executeUpdate 方法 如果是 select,使用 executeQuery 方法
int ret = statement.executeUpdate();
System.out.println(ret);
上面接收的返回值就表示当前这个操作,影响到了几行
对于查询来说, 返回的结果就不是int这么简单了, 而是一个ResultSet对象 .
ResultSet对象被称为结果集, 它象征着数据库中的一个临时表的身份, 代表着符合SQL查询语句的所有行, 并且提供一套完整的get方法来对这些记录进行访问. ResultSet里面的数据是一行一行排列的, 每行有多个属性(字段), 并且有一个记录指针, 指向行首数据.
String sql = "select * from student;";
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()) {
int age = resultSet.getInt("age");
String name = resultSet.getString("name");
System.out.println("age = " + age + ", name = " + name);
}
分析 while 循环,这是一种固定写法。 针对结果集,我们依次获取到表中的每一行,再通过这一行来获取此行对应的列。
第一次执行 resultSet.next(),表示获取到了第一行( id = 1 ) 第二次执行 resultSet.next(),表示获取到了第二行( id = 2 ) 第三次执行 resultSet.next(),由于表到达了末尾,next 方法返回了 false,循环结束。
这里的资源既然产出来了,那么肯定要释放回去。这里我们遵循 先创建的,后释放;后创建的,先释放。
statement.close();
connection.close();
如果是选择语句的话要多加一个 resultSet.close()
以下为executeupdate的代码
public class test1 {
public static void main(String[] args) throws SQLException {
DataSource dataSource= new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/max?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123");
Connection connection=dataSource.getConnection();
Scanner scanner=new Scanner(System.in);
int age=scanner.nextInt();
String sql="insert into student value(null,'王五',?)";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setInt(1,age);
int ret=statement.executeUpdate();
System.out.println("ret: " + ret);
statement.close();
connection.close();
}
}
以下为executeQuery的代码
public class test2 {
public static void main(String[] args) throws SQLException {
DataSource dataSource= new MysqlDataSource();
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/max?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("123");
Connection connection=dataSource.getConnection();
String sql="select * from student";
PreparedStatement statement=connection.prepareStatement(sql);
ResultSet resultSet =statement.executeQuery();
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println( "id= " +id + ", name= " +name+",age="+age);
}
resultSet.close();
statement.close();
connection.close();
}
}
工作中一般不会直接使用jdibc.面试一般也不考 jdbc. 因为jdbc 这套 api 使用起来是比较繁琐的 因此有一些 大佬 把 jdbc 的 api 又进一步封装,成了一些操作数据库的框架(比如MyBatis, jpA),我们一般用这些框架去操作(后续框架会在javaEE中讲到) 虽然不会用到它,但对于jdbc我们还是要了解的,它是这些框架的基础,只有了解基础才能更加熟悉掌握进阶知识。