真的勇士,那就是看清生活的真相之后,依然热爱生活。 —— 罗曼·罗兰
JDBC编程的基本工作
准备工作:
1.下载 mysql驱动包 ~~ maven 中央仓库
2.导入到项目中复制到项目目录下,标志为 library
编写代码:
1.创建数据源(描述数据库服务器所在的位置)
2.建立连接
3.构造SQL语句
4.执行SQL语句
5.释放资源
DataSource => Connection => PreparedStatement
DataSource ~~ 描述数据源
Connection ~~ 描述连接,连接是由数据源建立的
PreparedStatement ~~ 预编译语句
动态插入数据操作
代码如下:
public class JDBCInsert2 {
public static void main(String[] args) throws SQLException {
Scanner scanner = new Scanner(System.in);
//JDBC 需要通过一下步骤来完成开发
//1. 创建并初始化一个数据源
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/fly?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0213");
//2. 和数据库服务器建立连接
Connection connection = dataSource.getConnection();
//3. 从控制台读取用户的输入内容
System.out.println("请输入学生姓名: ");
String name = scanner.next();
System.out.println("请输入学号: ");
int id = scanner.nextInt();
//4. 构造SQL语句
//String sql = "insert into student value(" + id + ",'" + name + "' )";
// => 这样写容易被 sql注入 ~~ 网络安全中一种老牌的攻击方式
//更好的写法,借助这个PreparedStatement的拼装功能来实现~~
String sql = "insert into student value(?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
//把占位符替换成指定的值
statement.setInt(1, id);
statement.setString(2, name);
//这个打印需要加到数据之后
System.out.println(statement);
//4. 执行SQL语句
int ret = statement.executeUpdate();
System.out.println("ret = " + ret);
//5. 释放必要的资源
statement.close();
connection.close();
}
}
为什么要释放资源
数据库的客户端和服务器,之间进行通信的时候,是要消耗一定的系统资源的,包括不限于,CPU,内存,硬盘,带宽…
客户端也就罢了,拿服务器来说,同一时刻要处理很多个客户端 ~~ 给一个客户端提供服务,需要消耗一定的资源…给十个,给一百个呢???
如何能更好的利用这些资源? => 客户端得省着点用(不用的时候就赶紧释放)
释放资源的顺序
谁是后创建的,谁就先释放!!
在代码中,后创建的是语句 => 语句先释放
先创建的是连接 => 连接后释放
如何理解了???
有句古话叫,”大门不出,二门不迈” => 庭院布局如下
咱们当前使用的JDBC是使用 DataSource 这样的方式来编写的.
还有一种写法 DriverManager,通过反射的方式加载驱动包,中的类,进一步进行后续操作的~~
不推荐使用,原因:
-
反射是属于 java开发中的特殊手段!!
使用反射伤敌一千,自损八百 ~~ 不到万不得已,不要轻易使用!!!
反射的代码可读性非常差,编译器难以对代码的正确性进行检查
非常容易产生运行时异常 ~~ 类似于医生使用镇痛类药物杜冷丁 -
2.DataSource内置了数据库连接池.可以复用连接,提高连接服务器的效率
池(Pool)计算机非常重要非常广泛使用的术语
如何理解池这个概念
注:在此声明,下面这个例子,是博主为了你们理解才写的,与博主本人毫无关系
假设有一个妹子,长得好看,又有才华,所以有很多的人在追求她,
但是她同一时刻只能和一个追求者交往 ~~
这时,妹子和追求者A交往腻歪了,想换一个男朋友,一上来就和A说分手,不太现实
~~ 于是,她就得拿着放大镜顶着男朋友看,看他哪里做得不太对,做得不对的地方
就故意小题大做,上纲上线,帽子一扣,女权一顿打,这样一次不行,反复多来几次,
~~ 让男朋友对他失去耐心了,实在忍受不了,就和他提分手,就水到渠成了
于是,妹子和追求者A分手后,就开始和追求者B交往,和B开始培养感情,
先发发微信啊,发发QQ啥的,先聊一聊,相互之间熟悉了一点之后,再一起上上课啊,
一起吃个饭,一起出去玩….最终,俩人就走在一起了
但是了,从和追求者A分手到和最求者B走在一起就需要花费妹子很多时间和精力(成本),
甚至再和追求者B交往腻歪了,又想和最求者C交往,和追求者C交往腻歪了,又想和最求者D交往
………(以下省略三万字!!!)
问题来了,如何让妹子提高更换男朋友的效率了???
办法很简单,提前和追求者B,C,D…….培养感情
~~ 在和男朋友A交往的同时,不忘和追求者们搞暧昧
~~ 这样和A交往腻歪了,和A分手的第二天,B就可以上位了,毕竟感情已经提前培养好了,铺垫到位了,轻松实现无缝衔接…和B交往腻歪了,还可以换成C…和C交往腻歪了,还可以换成D… ~~ 妹子就可以做到随时分,随时换了
~~ 这时B,C,D……就都可以叫做妹子的备胎
~~ 他们就是妹子的备胎‘’池‘’
池本质上都是对"资源进行预申请"
虽然说现在还不用,但是先申请过来,后面随时用,随时就从池子里面拿,不用了再放回池里
~~ 随时想用就从池子里面取,比起想用的时候,还得从头去申请资源来得快得多
~~ 一个提高效率的表现
唉!”有人在讲段子,有人在照镜子”
实现查询操作
注:查询的返回结果不是单纯的int ,而是ResultSet 对象 ~~ 结果集合
代码如下:
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Created with IntelliJ IDEA.
* Description:
* User: fly(逐梦者)
* Date: 2023-09-12
* Time: 23:25
*/
public class JDBCSelect {
public static void main(String[] args) throws SQLException {
//1.创建并初始化数据库
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/fly?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("0213");
//2.建立连接
Connection connection = dataSource.getConnection();
//3.构造SQL
String sql = "select * from student";
PreparedStatement statement = connection.prepareStatement(sql);
//4.执行SQL
ResultSet resultSet = statement.executeQuery();
//5.遍历结果集合
while (resultSet.next()) {
//把 resultSet想象成一个表格.同时表格这里有个光标,初始情况下光标指向表最上面
//每次调用 next,光标往下走一行
//当光标指向某一行的时候,就可以通过 getXXX来获取到当前这行里的数据
/*getXXX是取出这一行的指定列的值
~~使用的方法要和列的类型匹配
~~参数可以是"第几列"下标也可以是列名~(推荐)*/
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("id = " + id + ", name = " + name);
//当光标已经把整个表都遍历完了,next就会返回false了
}
//6.释放资源
resultSet.close();
statement.close();
connection.close();
}
}
以后实际工作了,是啥样子??
绝对是比现在上学的情况苦很多
如果你觉得现在上学苦,不好意思,上班了之后,会比上学辛苦十倍
虽然读研也很苦,但是上班的苦远远超过读研的苦 ~~ 强烈建议你们考研!!!
原因:
(1)也很简单上学的时候,没啥压力,是非常轻松的~~
(2)上班的时候压力就会很大,工作中的压力,生活中的压力,各个方面的压力
(3)你的工作内容你完全没兴趣(常态) ~~ 90%的人工作都是没兴趣的
~~ 就算某个东西你非常感兴趣,要是让你当成工作来做,很快就没兴趣了
好比大部分人都爱玩游戏,但是如果有一天当年成为职业选手了,一天十几个小时一天就只能玩
这一个英雄,玩个几十遍,就算你再感兴趣,让你天天夜以继日的这样玩,你也会没兴趣的
以后上班就一个目标,钱,打工人没资格谈兴趣
一个程序猿,一天工作按照10个小时算 ~~ 写代码的时间,撑死就2-3个小时
主要的工作:
1.调试bug ~~ 主旋律
2.和各种人pk(包括不限于,和产品经理,和测试,和运维,和老板…….)
3.开发产品需求 ~~ 写代码了
4.系统优化(开发+测试+设计+其他方面) ~~ 一般是有经验的老程序猿才接触得到
千万不要对"上班”充满憧憬
成长过程中,周围的人 ~~ 很少告诉你真相.都是给你画大饼