JDBC编程的基本流程

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开始)
第二种传的参数是列的名字(主要用这个)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值