⭐️前面的话⭐️
本篇文章将介绍JDBC编程,JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2022年7月4日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《高性能MySQL》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
📌导航小助手📌
1.JDBC前置工作
1.1准备好MySQL驱动包
MySQL的jdbc驱动包我们可以去官网下载,我们也可以maven中央仓库下载,这个maven中央仓库是什么呢?你可以理解为我们手机中的“应用商店”软件,它的作用和应用商店的作用是差不多的,只不过手机应用商店里面是手机软件,而maven中央仓库里面有许多的API以及依赖包。
现在MySQL已经被Oracle收购了,Oracle的“吃相”有点难看,从官网找可以找到,但是我感觉maven中央仓库更好找一点,所以我们到maven中央仓库下载jdbc驱动包。
网址:maven中央仓库
第一步,点进网址进入maven中央仓库。
第二步,搜索MySQL,选择如下图那一个。
第三步,点击进入,找到对应大版本的jdbc驱动包,如果你的MySQL是5版本那驱动包也选择5版本的,当然如果你的MySQL是8版本,那你的驱动包也选择8版本。
我的MySQL是5版本所以我选择大版本为5的驱动包。
第四步,点击进去,按下图操作,下载驱动包。
下载完成我们的驱动包就准备好了。
1.2创建项目
使用编译器创建一个项目,项目创建好后,按照下面的步骤操作:
第一步,创建一个目录,名字随便起,不妨叫做
lib
目录。
第二步,将下载好的驱动包拷贝到该目录。
第三步,设置选项,右键刚才创建并已经将驱动包拷贝的目录,找到As a Lib…
这样我们的驱动包就导进我们的项目中了,然后我们就能来写jdbc代码了。
2.JDBC编程步骤
2.1创建数据源DataSource
第一步,创建
DataSource
对象,来描述这个数据库在哪里。
DataSource dataSource =newMysqlDataSource();
其中
DataSource
为
java.sql
里面的一个jdbc接口,
MysqlDataSource
是来源与我们所下载驱动包中的一个实现
DataSource
接口的类。
第二步,设置数据库的“位置”(URL),登录数据库的账户名和密码。
//设置数据库所在地址((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest/characterEncoding=utf8&useSSL=false");//设置登录数据库的账户名((MysqlDataSource)dataSource).setUser("root");//设置登录数据库的密码((MysqlDataSource)dataSource).setPassword("123456");
jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false
就是一个URL,也叫唯一资源定位符。
jdbc:mysql
表示该
url
是用于jdbc mysql的URL,因为数据库有很多,不止jdbc一种,所以需要细分。
具体含义自主对照:
URL类型声明://数据库的地址/数据库名?字符集编码&是否加密
。
2.2连接数据库
第三步,和服务器建立连接,创建好数据源
DataSource
对象后,调用该对象的
getConnection()
方法,获取
java.sql.Connection
对象,这样就与数据库建立起来连接了。
Connection connection = dataSource.getConnection();
2.3构造并执行sql语句(插入操作为例)
第四步,构造
sql
语句字符串,并将该语句包装成
PreparedStatement
对象,即调用
Connection
对象的
prepareStatement
方法,参数是sql字符串,会返回一个
PreparedStatement
对象,然后我们再调用
PreparedStatement
对象中的
executeUpdate
方法或
executeQuery
方法执行
sql
语句。
我们先以插入操作为例。
//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="insert into student values(1, '张三')";//将sql字符串包装成一个语句对象,表示待执行的sql的对象PreparedStatement statement = connection.prepareStatement(sql);//执行sql//如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数//如果待执行的sql语句操作是select,则使用executeQuery方法执行int ret = statement.executeUpdate();
其中,如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数,如果待执行的sql语句操作是select,则使用executeQuery方法执行,返回值是一个
ResultSet
结果表对象。
2.4及时释放资源
第五步,释放资源,我们执行完毕sql语句后需要及时地将资源释放,在JDBC编程中,最常见需要释放的类或接口有三个,分别是
Connection
,
PreparedStatement
,
ResultSet
,其中前面两个在jdbc插入操作中已经使用过了,而最后一个,即
ResultSet
,它是在执行查询语句需要用到的,调用
executeQuery
方法执行查询语句之后,会返回一个“临时表”,该“临时表”上储存了查询的结果,我们可以通过遍历该结果表来获取查询数据库的结果。
//此时sql语句已经执行完毕了,需要释放资源
statement.close();
connection.close();
使用jdbc编程进行插入操作全部代码:
importcom.mysql.jdbc.jdbc2.optional.MysqlDataSource;importjavax.sql.DataSource;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importjava.util.Scanner;publicclassTestJdbc{publicstaticvoidmain(String[] args)throwsSQLException{DataSource dataSource =newMysqlDataSource();Scanner sc =newScanner(System.in);System.out.println("请输入学号:");int id = sc.nextInt();System.out.println("请输入姓名:");
sc.nextLine();String name = sc.nextLine();//设置数据库所在地址((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false");//设置登录数据库的账户名((MysqlDataSource)dataSource).setUser("root");//设置登录数据库的密码((MysqlDataSource)dataSource).setPassword("123456");//建立连接Connection connection = dataSource.getConnection();//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="insert into student values(1, '张三')";//将sql字符串包装成一个语句对象,表示待执行的sql的对象PreparedStatement statement = connection.prepareStatement(sql);//执行sql//如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数//如果待执行的sql语句操作是select,则使用executeQuery方法执行int ret = statement.executeUpdate();//此时sql语句已经执行完毕了,需要释放资源
statement.close();
connection.close();}}
运行结果,我们通过查询数据库的表的结果来进行观察:
mysql>createdatabase jdbctest;
Query OK,1row affected (0.01 sec)
mysql>use jdbctest;Database changed
mysql>createtable student(id int, name varchar(20));
Query OK,0rows affected (0.02 sec)
mysql>showtables;+--------------------+| Tables_in_jdbctest |+--------------------+| student |+--------------------+1rowinset(0.00 sec)-- 执行jdbc代码后查询
mysql>select*from student;+------+--------+| id | name |+------+--------+|1| 张三 |+------+--------+1rowinset(0.00 sec)
程序运行结果,表示1行受到了影响。
2.5不要写死的代码(以插入为例)
我们发现我们的sql语句是完完全全写死的,这一点不好,我们可以使用输入的操作让用户输入信息进行插入,那就需要使用到
Scanner
类了。
我们得到用户输入的信息后,我们需要对信息进行整合,最容易想到的方式就是字符串拼接,但是这么做有如下的缺点,一是容易写错,特别是单双引号比较多的情况下,二是不安全,黑客可以使用sql注入的方式来修改数据库。
所以更好的方法就是把sql字符串中待输入的信息使用
?
来代替或者叫做占位,然后通过
PreparedStatement
中的
setXXX
系列方法来逐个设置每个
?
的内容是什么。
这个系列的方法,第一个参数表示sql待执行对象中第多少个
?
,第二个参数表示将这个
?
设置的内容。比如:
//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="insert into student values(?, ?)";//将sql字符串包装成一个语句对象,表示待执行的sql的对象PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
statement.setString(2, name);
完整代码:jdbc插入操作源代码
运行结果:
数据库查询结果:
mysql>select*from student;+------+--------+| id | name |+------+--------+|1| 张三 ||2| 李四 |+------+--------+2rowsinset(0.00 sec)
2.6JDBC删除,更新操作
在jdbc编程中,删除操作和更新操作,它的步骤与插入操作是一模一样的,只不过就是构造的
sql
语句不一样,其他都一样。
删除操作关键代码:
//用户输入System.out.println("请输入需要删除的学号:");int id = sc.nextInt();//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="delete from student where id = ?";PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);System.out.println("statement"+ statement);
jdbc删除操作完整代码:源代码地址
程序运行结果:
数据库查询结果:
mysql>select*from student;+------+--------+| id | name |+------+--------+|1| 张三 |+------+--------+1rowinset(0.00 sec)
更新操作关键代码:
//用户输入 需要修改的id 与修改后的姓名System.out.println("请输入需要修改的学号:");int id = sc.nextInt();
sc.nextLine();System.out.println("请输入修改后的姓名:");String afterName = sc.nextLine();//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="update student set name = ? where id = ?";PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, afterName);
statement.setInt(2, id);System.out.println("statement"+ statement);
jdbc更新操作完整代码:源代码地址
程序运行结果:
数据库查询结果:
mysql>select*from student;+------+--------+| id | name |+------+--------+|1| 王五 |+------+--------+1rowinset(0.00 sec)
2.7JDBC查询操作
jdbc的查询操作与插入删除更新操作有一点点不同,执行查询sql语句的时候是调用
executeQuery
方法来执行语句的,并且会带回查询的结果,我们可以通过类似与迭代器的操作来获取查询的结果,这个结果集使用完后需要将它释放。
关键代码:
//操作数据库 关键在于构造sql语句//jdbc 构造的sql语句不需要带上;String sql ="select * from student";PreparedStatement statement = connection.prepareStatement(sql);//执行sql 查询操作返回的不是int 而是一个临时表 使用ResultSet对象表示这个临时表ResultSet ret = statement.executeQuery();//便利结果集合//预期结果格式// +------+--------+// | id | name |// +------+--------+// | 1 | 王五 |// +------+--------+while(ret.next()){int id = ret.getInt("id");String name = ret.getString("name");System.out.println("id:"+ id +", name:"+ name);}//关闭资源
ret.close();
statement.close();
connection.close();
jdbc查询操作完整代码:源代码地址
程序运行结果:
好了,JDBC的全部内容差不多就是这一些,所有的完整代码链接:地址。
下期预告:数据库事务
觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!
版权归原作者 未见花闻 所有, 如有侵权,请联系我们删除。