JDBC编程的基本流程
创始人
2024-01-21 01:03:49

文章目录

  • 1、创建数据源
  • 2、让代码和数据源建立连接
  • 3、操作数据库
    • 3.1 插入操作
    • 3.2 删除操作
    • 3.3 修改操作
    • 3.4 查找操作

1、创建数据源

  1. 创建DataSource对象,这个对象描述了数据库服务器在哪,需要导入包javax.sql.DataSource
DataSource databases = new MysqlDataSource();
  1. 设置数据库所在的地址
((MysqlDataSource) databases).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");

jdbc:mysql 表示这个url是用于jdbc mysql的url
127.0.0.1 表示mysql服务器所在的主机的ip值,这里意为本机
3306 表示端口号,mysql的默认端口号就是3306
mydb_one 表示我的数据库名
characterEncoding=utf8 服务器的字符集,如果你的服务器字符集是utf8mb4也写成utf8
useSSL=false 表示传输过程中,不需要加密

  1. 设置登录数据库的用户名
((MysqlDataSource) databases).setUser("root");
  1. 设置登录数据的密码
((MysqlDataSource) databases).setPassword("fl12345.0");

以上写法还能换成另一种写法

MysqlDataSource database = new MysqlDataSource();
database.setURL();
database.setUser("root");
database.setPassword("fl12345.0");

但是第一种写法是更常见的习惯写法,因为代码中持有的实例是DataSource类型,后面一些其他代码如果需要用到DataSource,相关的参数也是DataSource,未来如果数据库进行切换,代码几乎不用改动——低耦合

第二种写法就会导致代码中导出散播着MysqlDataSource这条的类型,如果要进行数据库切换,代码中很多地方都需要修改——高耦合

2、让代码和数据源建立连接

前面创建好数据源,只是描述了一下这个数据源在哪,但我们并没有实际的去访问这个数据源

例如快递小哥给我打电话,让我去取快递,但实际上我可以选择不去,或者稍后再去取。真正去取快递这个操作,就相当于和数据库建立连接

Connection connection = dataSource.getConnection();

当我们去使用getConnection()方法时,会返回一个Connection对象,idea会给我们提示有很多的Connection,一定要认准,使用的是JDBC的Connection,不是MySQL驱动包里面的Connection,更不是其它的Connection

在这里插入图片描述

创建数据源的哪一个步骤出现差错,在建立连接的时候都会抛出SQLException,因此我们需要显示处理SQLException

3、操作数据库

操作数据库的关键就是构造一个SQL语句

3.1 插入操作

String sql = "insert into student values(1, 'fl')";//数据库中的student表
//+-------+-------------+------+-----+---------+-------+
//| Field | Type        | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id    | int(11)     | YES  |     | NULL    |       |
//| name  | varchar(20) | YES  |     | NULL    |       |
//+-------+-------------+------+-----+---------+-------+

在JDBC中构造SQL,不必带上分号, 分号只是在命令行中用来区分不同的语句,现在是直接在代码上操作

此处光是一个String类型的sql还不行,需要把这个Sring包装成一个“语句对象”

PreparedStatement statement = connection.prepareStatement(sql);

通过connection里面的prepareStatement这个方法来构造语句对象,这操作就是把字符串风格的sql转成了一个JDBC里面的对象

执行sql

int ret = statement.executeUpdate();

返回值就表示影响了几行

SQL中如果是insert, update, delete, 都使用executeUpdate 方法
如果是select, 则使用executeQuery 方法

sql执行完毕后,还需要释放资源

statement.close();
connection.close();

先释放statement,再释放connection 先创建的后释放,后创建的先释放

整个插入数据已经执行完毕,但是插入的数据都是直接给定的,但实际上大概率我们是需要灵活的处理要插入的数据,例如让用户通过控制台,输入想要插入的数据

Scanner scanner = new Scanner(System.in);//让用户通过控制台输入一下待插入的数据
System.out.print("请输入id:");
int id = scanner.nextInt();
System.out.print("请输入名字:");
String name = scanner.next();

此时就需要把id和name替换到insert语句中的对应位置上,此处就有两种方式
第一种: 通过字符串拼接这个操作来构造sql,虽然可以,但是不推荐,因为这么写非常麻烦,容易写错,其次就是容易引起“SQL注入”

第二种: 使用代替写法,避免直接拼接字符串

String sql = "insert into student values(?, ?);
PreparedStatement statement = connection.prepareStatement(sql);//插入多条记录
//String sql = "insert into student values(?, ?), (?, ?)";//下标1,2,3,4  并非1,2,1,2

?相当于告诉java程序,这两个字段的值,还不确定,先占个位置,再使用PreparedStatement的setXXX系列的方法进行替换
setXXX方法有很多,需要让这里的方法和数据库的列的类型匹配
进行替换操作

statement.setInt(1, id); //把第一个?替换成id
statement.setString(2,name); //把第二个?替换成name

这里就是在执行具体的替换操作,从下标1还是计算。

最后还需要执行sql

3.2 删除操作

让用户输入一个id,根据id来删除

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");//2.建立链接
Connection connection = (Connection) dataSource.getConnection();//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要删除的id:");
int id = scanner.nextInt();//4.拼接SQL
String sql = "delete from student where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);//5.执行SQL
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);//6.释放资源
statement.close();
connection.close();

删除操作和插入操作几乎是一模一样

3.3 修改操作

根据id修改学生姓名

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");//2.建立链接
Connection connection = (Connection) dataSource.getConnection();//3.输入id
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要修改的学生id:");
int id = scanner.nextInt();
System.out.print("请输入要修改的学生姓名:");
String name = scanner.next();//4.拼接SQL
String sql = "update student set name = ? where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, name);
statement.setInt(2, id);//5.执行sql
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
System.out.println(statement);//6.关闭资源
statement.close();
connection.close();

修改操作和插入操作几乎是一模一样

3.4 查找操作

查找操作和前面的三个操作相比,要复杂一些,查找操作需要对结果进行访问

//1.创建数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/mydb_one?characterEncoding=utf8&useSSL=false");
((MysqlDataSource)dataSource).setUser("root");
((MysqlDataSource)dataSource).setPassword("fl12345.0");//2.建立链接
Connection connection = (Connection) dataSource.getConnection();//3.拼接SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);//4.执行SQL,对于查询操作,就需要使用executeQuery
//  查询操作的返回结果不是一个int,而是一张"临时表"
//使用ResultSet表示这张临时表ResultSet resultSet = statement.executeQuery();//5.遍历结果集合(返回临时表),先获取到这一行,再获取到这一行中的若干行
//  如果遍历到表的结束位置,此处的next也就返回false
//+-------+-------------+------+-----+---------+-------+
//| Field | Type        | Null | Key | Default | Extra |
//+-------+-------------+------+-----+---------+-------+
//| id    | int(11)     | YES  |     | NULL    |       |
//| name  | varchar(20) | YES  |     | NULL    |       |
//+-------+-------------+------+-----+---------+-------+
//  next方法表示获取到一行记录,同时把光标往后移动一行
while (resultSet.next()){//针对这一行获取到其中的列int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("id = "+ id +", name = " + name);
}//6.释放资源
resultSet.close();//resultSet也需要释放
statement.close();
connection.close();

在获取每一列的数据时,需要用对应的类型去接受,不可混用

在使用get系列方法时,会有两种
在这里插入图片描述
第一种传的参数是第几列(从1开始)
第二种传的参数是列的名字(主要用这个)

上一篇:数据结构【队列】

下一篇:Python小总结

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
进口奶粉的排名 荷兰奶粉十大排... 越来越乱的国内奶粉市场让很多宝妈宝爸都不知道该如何选择奶粉品牌,宝宝的安全是第一位,奶粉的质量以及口...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
不用扬鞭自奋蹄 乘势而上千帆竞... 思明区正全力向“两个进位”目标发起冲刺,努力为建设高素质高颜值现代化国际化的厦门作出“思明贡献”。(...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...