JDBC原理

目录:

day01-JDBC原理

day02-PreparedStatement对象


DAY01

  1.      数据库的回顾

  1.1在jt_db中创建account表,有id,name,money字段

 create database jt_db;
 use jt_db;
mysql> create table account(id int primary key auto_increment,name varchar(50),m
oney double);
show tables;

 1.2 往account表中插入2条记录

insert into account values(null,'tony',1000);
insert into account values(null,'tom',1000);
select * from account;

  1.3在jt_db中创建user表,有id,username,password字段

 1.4 在user表中插入2条记录

  1.5创建dept表,有id,name字段

create table dept(id int primary key auto_increment,name varchar(50));
show tables;

  1.6在dept表中插入2条记录

insert into dept(name) values('dept1');
insert into dept(name) values('dept2');

select * from dept;

   2.  JDBC原理

方便了java程序员对数据库的开发

3. JDBC概述

3.1  什么是JDBC

JDBC是一个缩写,全称叫做java database connectivity,java数据库连接,通过java代码来操作数据库的一门技术。

 3.2 为什么要学习JDBC

 3.3 如何使用JDBC --入门案例

 3.3.1 需求:

查询jt_db数据库中account表的所有数据

  3.3.2开发步骤:

  3.3.2.1创建一个工程jdbcday01

  3.3.2.2导入jar包

 3.3.2.3 创建HelloJDBC类,实现数据库的操作

3.3.2.4  测试

4. JDBC API的详解

4.1注册驱动

4.1.1  作用

将驱动和数据库产生关系

 4.1.2 缺点

  1. 导致注册了两次驱动
  1. 将数据库驱动和程序产生了紧耦合
com. mysql . jdbc . Driver .Driver()

4.1.3 解决方案

1、Class.forName(“com.mysql.jdbc.Driver”);

//将来参数提取到配置文件中,实现程序的松耦合

4.2  获取数据库连接的URL

  4.2.1作用

指定我们要访问哪个数据库服务器的哪个数据
jdbc:mysql://localhost:3306/jt_db
----------   ==============  ~~~~
协议名      域名:端口号  数据库名字

 4.2.2 简写的形式(不提倡)

jdbc:mysql:///jt_db
前提:必须访问本地服务器localhost  + 必须使用默认端口3306

  4.3数据库连接对象Connection

4.3.1  作用

通过DriverManager对象提供的方法并且传入三个参数
来获取到程序和数据库的连接

4.3.2  提供常用方法

createStatement  ---  返回一个普通的传输器对象
prepareStatement  --- 返回带有预编译效果的传输器

  4.4传输器对象Statement

4.4.1 作用

执行sql,返回结果集对象

 4.4.2 提供的常用方法

executeQuery  -- 用来执行 查询 的SQL
executeUpdate  -- 用来执行 增删改 的SQL

4.5结果集对象ResultSet

4.5.1  作用

用来保存SQL的执行结果,
并且把结果 封装 给ResultSet

4.5.2提供的常用方法

Rs.next()     ---  指向结果集的下一行,有数据就返回true
Rs.getString(int index)    ---   根据结果集的 索引来获取数据
Rs.getString(String columnname)  - -  根据结果集中的 字段名来获取数据
Rs.getInt(int index)   ....
Rs.getInt(int columnname)  ...
Rs.getLong(int index)
Rs.getLong(int columnname)

4.6  关闭资源

  4.6.1作用

JDBC的资源非常稀缺,在我们使用完之后必须及时释放。
数据库连接资源、传输器资源、结果集资源

4.6.2 现状

4.6.3 改造

5.JDBC的增删改查

5.1新增

5.1.1需求

向account中插入一条记录,name为lilei,money为1000

5.1.2开发步骤

  5.1.3测试

5.2修改

5.2.1需求

修改account表中id为3的money为2000

5.2.2开发步骤

5.2.3测试

5.3删除

5.3.1需求

删除account表中id为3 的记录

5.3.2开发步骤

5.3.3 测试

6.JDBCUtils工具类的实现

6.1 需求

为了使程序可读性更强,代码的复用性更好。

6.2开发步骤

 6.2.1 创建JDBCUtils类

6.2.2私有化无参构造,避免外界直接创建实例

6.2.3创建静态方法getConnection,用来获取数据库的连接

6.2.4 创建静态方法close,用来释放资源

6.2.5 测试

6.3配置文件形式

6.3.1需求

为了程序的灵活性,我们将工具类代码中会发生变动的参数配置信息提取出来写在配置文件中,这样的话如果发生修改操作时,我们不需要去改源码而是直接去修改配置文件的数据即可。

6.3.2  开发步骤

6.3.2.1  创建jdbc.properties文件

选中【项目名】->【new】->【properties】->jdbc.properties
用来存储数据,以Key Value的形式存在,需要获取值时可以调用get(K)来获取。

6.3.2.2读取jdbc.properties文件信息

6.3.2.3  测试

查询account表中id为1的记录

6.4究极进化

6.4.1  需求

将读取配置文件的代码放置在静态代码块中,可以减少读取次数提高读写效率,如需修改,重启服务就可以加载新的内容了。

6.4.2 改造


day02

1.    PreparedStatement对象

    1.   需求:

模拟用户登录,从解决问题的过程中,会发现Statement对象是存在问题的,需要Preparedstatement对象来解决

1.2开发步骤

1.2.1  创建jdbcday02工程

 1.2.2 导入jar包

  1.2.3创建Login类,用来实现需求

1.2.4 Main方法,提示用户登录

1.2.5Login方法,利用jdbc技术去验证用户是否存在

  1.2.6测试

1.3SQL注入攻击问题

  1.3.1概述

当用户名的值为  jerry’#   /  jerry’ or ‘1=1 时,会发生SQL注入攻击问题。
本质上是因为SQL语句中出现了SQL关键字( #   /  or 1=1)引起SQL语义的变化,会发生严重后果,引起数据泄露篡改丢失。

  1.3.2现象:

jerry'#
jerry' or '1=1

 1.3.3 执行SQL的情况:

select * from user where username='jerry'#' and password=''
select * from user where username='jerry' or '1=1' and password=''
SQL 语义发生改变(#  or 1=1)

1.4解决方案

1.4.1  需求:

模拟用户登录,利用Preparedstatement对象代替Statement对象

1.4.2开发步骤

改造login方法

1.4.3测试

1.5 Preparedstatement对象的优势

1.5.1防止SQL注入

利用了?作为SQL的占位符,在给数据库服务器发送SQL时,先把骨架发给服务器。直到服务器接收到参数的值时,才去自动拼接。
本质上是将SQL语句中出现的关键字  ,整体,作为一个字符串来处理的。
Jerry ’#  当发现SQL中出现了关键字会统一和其他内容拼成一个大的字符串来处理。
经过PrepareStatement处理的SQL:
select * from user where username=' jerry'# ' and password=''

1.5.2省略掉了参数拼接的麻烦

Ps.setString(index,value);利用?省略参数拼接

  1.5.3提高程序的效率

将sql骨缓存在内存中,如果下次要查询骨架相同的SQL时直接去缓存中获取,减少了程序和数据库的交互,大大提升程序的效率。

2.批处理

通过视频可以看出,数据量越大的情况下,时间呈线性增长的。

2.1什么是批处理

当我们需要向mysql数据库服务器发送大量SQL时,如果还是一条一条的执行SQL的话,需要不断的打开数据库连接关闭数据库连接,数据库的连接资源是最耗费时间的,造成资源浪费程序效率低下。
批处理的过程:将一批SQL打成一个批次,统一发送给服务器,服务器接收到之后打开批,依次执行批中的SQL。减少数据库的开销。挺高程序的效率。

   2.2如何实现批处理

  2.2.1利用Statement对象来实现批处理

  2.2.1.1需求:

向account表中插入100条记录

 2.2.1.2 开发步骤

创建StatementBatch类
效果:

  2.2.2利用Preparedstatement对象来实现批处理

 2.2.2.1 需求:

向dept表中插入100条记录,利用Preparedstatement对象

2.2.2.2开发步骤

测试

2.2.3 事务优化

 2.2.4 总结

  1. 在我们没有利用批处理之前,100条SQL需要执行100次数据库连接的打开和关闭和网络传输
  2. 并不是说使用了批处理就会立即生效,这个和驱动版本、数据库版本、网络传输、硬件设备有关系
  3. JDBC默认是配置了事务管理的,并且默认是开启状态,我们需要手动管理事务(关闭autoCommit)
  4. 在executebatch()方法后面,进行手动提交事务
  5. 注意的是:千万不要随意向批次中加入大量SQL,避免OutOfMemory

2.2.5 Statement和Preparedstatement实现批处理的区别

2.2.5.1 Statement

  • 优点:在同一个批处理中,SQL形式更丰富
  • 缺点:产生SQL注入、效率较低、骨架相同的SQL也会被执行多次

2.2.5.2 Preparedstatement

  • 优点:可以防止SQL注入、提高效率、带有预编译效果(先把SQL骨架发送给服务器,并且把骨架放在缓存中,当下次来进行相同骨架SQL查询时直接去 缓存中取)
  • 缺点:在一次批处理中,只能处理SQL骨架相同的内容

3. 连接池

3.1 什么是连接池

用来存放数据库连接的一个容器,作用在整个程序中,提高连接的复用,减少了与数据库单的交互,提高程序效率。

   3.2为什么学习连接池

  3.3 自定义一个连接池

3.3.1需求:

利用连接池技术,查询account表中id为1的记录
3.3.2.  开发步骤:
3.3.2.1.  创建 MyPool
3.3.2.2.  准备连接池容器,用来存放连接
3.3.2.3.  在静态代码块中,初始化一批连接
3.3.2.4.  提供 getConnection 方法,用来获取数据库连接
3.3.2.5.  提供 returnConn 方法,用来把连接还回池中
3.3.2.6.  测试 

作者:Darren

QQ:603026148

以上内容归Darren所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从码农到码到成功

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值