本章目标
掌握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数据库编程:JDBC
但是我们知道java一向比较牛批!! 他的诞生就是为了解决跨平台!!!
他一听就不乐意了,咋地,你们这么多数据库,都是不同的驱动包! 这不是违背了嘛
所以java想到了一个大一统的方案! 咱出一个JDBC应对不同数据库的驱动包都可以对接!!!
JDBC使用
JDBC下载! 我们可以官网下载!!
但是我们java社区有自己单独的下载工具,就相当于手机的应用商店!!
只需要搜索即可下载!!!
maven中央仓库
使用案例
如何使用JDBC在java中编程呢?
我们在IDEA中进行操作!
首先我们需要创建一个项目!
在项目中添加一个文件夹,然后将刚刚下载好的JDBCjar包导入项目中!!!
创建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对象!
所以我们要先closestatement,再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_); }