JDBC
的概念和工作原理java
中的JDBC
编程Java,C、C++、Python
等Oracle,MySQL,SQL Server
等MySQL
提供了Java
的驱动包mysql-connector-java
,需要基于Java
操作MySQL
即需要该驱动包。同样的,要基于Java
操作Oracle数据库则需要Oracle
的数据库驱动包ojdbc
。java
,数据库 MySQL
,此时我们只需要一个数据库驱动包即可完成数据库编程了啥是数据库驱动包呢?
其实就是每个数据库提供给编程语言的一个API
(函数,接口),让该语言可以通过该驱动包实现对该数据库的基本操作!!!
但是每个不同得到数据库都有自己的驱动包!!!
就好比你买不同的打印机,需要不同的驱动程序!!!
但是我们知道java
一向比较牛批!! 他的诞生就是为了解决跨平台!!!
他一听就不乐意了,咋地,你们这么多数据库,都是不同的驱动包! 这不是违背了嘛
所以java
想到了一个大一统的方案! 咱出一个JDBC
应对不同数据库的驱动包都可以对接!!!
JDBC
下载! 我们可以官网下载!!
但是我们java
社区有自己单独的下载工具,就相当于手机的应用商店!!
只需要搜索即可下载!!!
maven中央仓库
如何使用JDBC
在java
中编程呢?
我们在IDEA
中进行操作!
JDBC
jar包导入项目中!!!
创建lib
文件夹,将jar
包复制过去
Add as Library
当我们可以看到这么多文件夹 ,那么我们便导入成功了!!!
JDBC
的基本流程!
创建DataSource
对象,这个对象就是描述了数据库服务器在哪!
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
public class jdbc {
public static void main(String[] args) {
//创建DAtaSource对象
//导入 javax.sql包
DataSource dataSource = new MysqlDataSource();
//描述数据库服务器在哪里
// 设置数据库所在地址
//jdbc:mysql://127.0.0.1:3306/java_2022?characterEncoding=utf8&useSSL=false
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_2022?characterEncoding=utf8&useSSL=false");
//设置登入数据库用户名
((MysqlDataSource)dataSource).setUser("root");
//设置数据库登入密码
((MysqlDataSource)dataSource).setPassword("123456");
}
}
为啥我们的dataSource
对象需要使用强制类型转换呢?
因为如果我们直接创建一个MysqlDataSource
对象的话,如果我们换一个数据库那么代码的兼容性就较低,需要该的地方较多!而采用类型强制转换,只需要改动部分代码即可!
setUrl
url 指的是 uniform/universal resource locator
唯一资源定位地址,就是我们平常说的网站!
jdbc:mysql://127.0.0.1:3306/java_2022?characterEncoding=utf8&useSSL=false
那这串字符代表什么意思?
jdbc:mysql
表示mysql jdbc的网址
//127.0.0.1
mysql 服务器的主机所在的IP
地址 ip地址就描述了网络上一个主机的位置,我们也可以用localhost
代替,因为当前我们的数据库服务器和客户端的主机都是同一台
3306
端口号 访问你的主机上的哪一个程序,3306表示mysql服务器的默认端口号!
java_2022
你需要访问的数据库名称
characterEncoding=utf8
指定字符集编码! 或者是utf8b
&useSSL=false
是否需要传输过程中加密,一般不加密
setUser
设置用户名
setUser("root");
root
是管理员用户,我们也可以有其他用户
setPassword
setPasssword("123456");
这就是输入Mysql
服务器的密码!
写完上述代码,我们就已经创建好了一个对象!
就相当于我们已经分配了一个任务!!!
但是此时我们没有去执行这个任务
我们需要连接数据库才能访问该数据库!!
如何连接数据库服务器呢?
dataSource
对象下有一个方法,可以连接mysql
数据库服务器!
Connection connection = dataSource.getConnection();
注意这里的Connection
类是java.sql.Connection
包下的类!!!
我们已经连上了数据库那么我们就可以对数据库里的内容进行操作了!!!
String sql = "insert into student values('吕布',101)";
我们将sql
语句写成字符串!!!
PreparedStatement statement = connection.prepareStatement(sql);
利用connection
对象创建一个语句对象!
PreparedStatement statement = connection.prepareStatement(sql);
我们将sql
传入statement
语句对象!!!但是并没有执行操作
int ret = statement.executeUpdate();
执行操作语句!!!
此条语句执行后,那么我们的数据库便执行了sql
语句!!!
而我们的返回值ret
表示几行数据受到影响,就如同我们在命令行执行成功后的提示!!!
我们可以打印ret
值从而知道多少列受到影响!或者打印statement
值可以看到具体的sql
操作!!!
我们将sql
执行完毕,还需要将数据库连接断开和PrepareStatement
资源释放!!!
关闭资源
statement.close();
connection.close();
因为我们是先连接数据库,在创建了statement
对象!
所以我们要先close
statement,再close
connection!!!
就比如我们打开洗衣机,再放衣服!!!
洗完后要先拿完衣服再关洗衣机!!!
我们附上完整代码!!!
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class jdbc {
public static void main(String[] args) throws SQLException{
//创建DataSource对象
//相当于分配了一个任务
//导入 javax.sql包
DataSource dataSource = new MysqlDataSource();
//描述数据库服务器在哪里
// 设置数据库所在地址
//jdbc:mysql://127.0.0.1:3306/java_2022?characterEncoding=utf8&useSSL=false
((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java_2022?characterEncoding=utf8&useSSL=false");
//((MysqlDataSource)dataSource).setUrl();
//设置登入数据库用户名
((MysqlDataSource)dataSource).setUser("root");
//设置数据库登入密码
((MysqlDataSource)dataSource).setPassword("123456");
//连接数据库! 相当于去执行这个任务
//可能数据库连接失败,所以要处理异常!!!
//这里的Connection类是选择java.sql包下的!!!!
Connection connection = dataSource.getConnection();
//这里就可以写我们的数据库sql代码了
//我们在student 表中插入吕布的成绩
//我们先写好sql字符串
String sql = "insert into student values('吕布',101)";
//然后将sql执行
//这里的PreparedStatement 也是java.sql包下!!!
PreparedStatement statement = connection.prepareStatement(sql);
int ret = statement.executeUpdate(); //数据库增删改操作!!!
//statement.executeQuery(); 数据库查询操作!!!
System.out.println(ret);
System.out.println("statement:"+statement);
//关闭资源
statement.close();
connection.close();
}
}
PreparedStatement
类
我们知道我们可以直接写好sql
然后传入到PreparedStatement
对象执行!
但是当我们需要执行多条sql
比如我们需要插入多个学生的成绩信息时!
显然一条一条写好传入不够科学!!!
因为每条语句都是只有名字和班级不同!!!
如何改进呢
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine(); //输入姓名
int class_ = scanner.nextInt(); //输入班级
String sql = "insert into student values(?,?)"; //姓名和班级用通配符 ? 代替
//然后将sql执行
//这里的PreparedStatement 也是java.sql包下!!!
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,name); //传入第一列的姓名
statement.setInt(2,class_); //传入第二列的班级
int ret = statement.executeUpdate(); //数据库增删改操作!!!
ResultSet ret = statement.executeQuery();
//数据库查询操作!!!
利用executeQuery();
我们可以返回一个表结构!!!
我们对这个表结构进行遍历即可!!!
String sql = "select * from student";
//然后将sql执行
//这里的PreparedStatement 也是java.sql包下!!!
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet ret = statement.executeQuery(); //数据库查询操作!!!
//我们需要将查询后的数据保存在ResultSet表中!!!
System.out.println("statement:"+statement);
while (ret.next()){ //移动指针光标!!
String name = ret.getString(1); //获取第一列的数据
int class_ = ret.getInt(2);//获取第二列的数据
System.out.println("name:"+name+" class:"+class_);
}