JDBC

JDBC是什么?

jdbc是一个由sun公司(Oracle)提出的规范(一套接口),jdbc指的就是java语言连接数据库

jdbc就是一套面向所有数据库厂家的接口

 

每一个数据库厂家都希望可以通过java语言连接到自己开发的数据库,

这个时候,厂家肯定要写一套程序,java语言连接数据库的具体实现,这个实现类必须要实现JDBC接口

 

 

例如:java语言连接 Mysql

mysql的厂家就必须要实现jdbc这个接口

 

JDBC的驱动类型

 

JDBC的用途

  1. 加载对应数据库驱动(Load Driver)
  2. 与数据库建立连接(connection)
  3. 发送操作数据库的语句(createStatement)
  4. 执行并处理返回结果(executeQuery)

 

Java链接数据库

保证mysql服务是开启的

将java包导入到工程lib下,并且添加到类路径下(保证版本对应)

注册驱动,使用Class类下的一个静态方法forName,使得类加载

获取数据库连接 DriverManager类提供了getConnection方法 (需要传入数据源信息)

获取数据库操作对象 createStatement方法

编写sql语句

按照sql语句的类别调用不同方法,获取到返回的结果

关闭数据库资源(放在finally语句块中)

注意:在为字符集添加中文数据时,在url后面用&拼接characterEncoding=utf-8来设置字符集

并且数据库校对中每个字段的字符集也要设置为utf-8

//模拟用户登入

数据库中创建的每一张表 在java中都有一个实体与之对应

table中的字段对应的是实体beans中的属性

tb_user User

uid uid

username username

password password

 

通过jdbc来读取数据,这些数据也是以对象的形式被封装在结果集容器中ResultSet

 

resultSet !=null && resultSet.next()

第一个条件保证容器对象不为空,判断容器中是否有元素

 

我们会将读取的数据封装成对象,然后将对象装进集合中(ArrayList/HashMap)

 

后面学习了前端之后,我们会将集合对象传到前端,在前端取出集合中的数据,渲染数据!

 

 

事务处理

java事务

实际上,一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到java程序代码中。因此,数据库操作的事务习惯上就称为Java事务。

 

通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简单的说就是:要么全部执行成功,要么撤销不执行。

 

 

事务的原子性:表示事务执行过程中的任何失败都将导致事务所作的任何修改失败

事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态

事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见

事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确

 

案例:

银行存钱

银行取钱

转账方法 A B

假设有一个转账的场景:A账户转账给B账户,这个时候我们需要在A账户上扣钱,在B账户上加钱

所以我们需要去写两条sql来完成这样的需求,但是我们要开启事务的支持,因为这两条sql是在一条事务线上的,所以要么同时执行成功,要么同时失败,要满足事务的原子性和一致性。

 

 

事务设置setAuntoCommit()

事务案例代码:

jdbc默认状态下是自动提交的

 

预编译PreparedStatement

sql注入:指的就是通过在sql中加入数据库的关键字,导致最终sql执行的结果是错误的

PreparedStatement 这个对象可以防止sql注入 因为这个对象在执行sql的时候

是分为两个步骤: 1.先预编译sql,先把sql的架子给搭建出来,但是没有赋值,2.给sql中注入具体的数据,执行sql

 

Statement对象没有预编译的过程,直接就是执行sql

考虑到安全性我们以后不会直接使用Statement而是使用PreparedStatement

 

关于数据库的悲观锁和乐观锁(都是跟事务有关的):

乐观锁:假设在多线程场景下,多个线程同时对数据库中的一个表进行操作

如果多个线程会去修改同一条数据,乐观锁的思想就是觉得这种情况不可能发生

乐观锁:乐观锁可以不用去开启事务的支持(采用的是自动提交的策略)

悲观锁:针对于以上描述的情况,悲观锁思想就会觉得这种情况一定会发生,然后要提前去解决这个问题

悲观锁一定要去开启对事务的支持,采用手动提交的策略来解决问题,行级锁,在sql后面加上 for update

当一个线程在对某一条记录进行查询的时候,那么别的线程只能等待

 

封装工具类

工具类不能实例化对象,构造函数被private修饰

所有的方法都要被static修饰

利用工具类来执行sql