JDCB
一、介绍
Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
在JDK1.x版本中,JDBC只是一个可选部件,到了JDK1.1公布时,SQL类包(也就是JDBCAPI)就成为 Java语言的标准部件。
二、使用步骤
2.1 引入jar文件
2.1.1 使用jar包
以Mysql为例
8.0和5.0不兼容,需要根据数据库版本下载
2.1.2 Maven
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
2.2 加载驱动
JavaSE项目中可以省略 , JavaWeb项目必须编写此步骤
Class.forName("com.mysql.cj.jdbc.Driver");
- 驱动名称:
- oracle:
oracle.jdbc.driver.OracleDriver
- mysql 5.0:
com.mysql.jdbc.Driver
- mysql 8.0:
com.mysql.cj.jdbc.Driver
- Sql Server2000:
com.microsoft.jdbc.sqlserver.SQLServerDriver
- oracle:
2.3 获取JDBC连接对象
Connection conn = DriverManager.getConnection(url,account,password);
2.3.1 数据库连接地址
- 格式: 主协议:子协议://ip地址:端口号/数据库名称
- mysql的连接地址:
jdbc:mysql://localhost:3306/java35
- oracle的连接地址:
jdbc:oracle:thin:@localhost:1521:ORCL
- Sql Server2000:
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname
- mysql的连接地址:
2.4 创建SQL执行对象
通过连接对象, 创建SQL执行对象 (SQL执行环境)
Statement state = conn.createStatement();
2.5 执行SQL语句
通过SQL执行对象 ,执行SQL语句
state.execute(String sqlstr);
2.6 释放资源
state.close();
conn.close();
re.close();
2.7 操作结果集
//1. 控制游标移动的常用方法:
boolean next()
//作用: 控制游标向下一行移动.
//返回值: 移动成功返回true , 下一行不存在移动失败, 返回false
boolean privious()
//作用: 控制游标向上一行移动.
//返回值: 移动成功返回true , 上一行不存在移动失败, 返回false
boolean absolute(int 行号)
//作用: 控制游标向指定行移动
//返回值: 移动成功返回true , 行不存在移动失败, 返回false
boolean beforeFirst()
//作用: 控制游标移动到第一行
//返回值: 移动成功返回true, 没有第一行数据返回false
boolean afterLast()
//作用: 控制游标移动到最后一行
//返回值: 移动成功返回true, 没有最后一行数据返回false
//2. 获取游标指向行的字段值的常用方法:
XXX getXXX(String 列名)
//根据字段名, 得到此字段的值
XXX getXXX(int 字段的索引)
//根据字段的索引, 得到字段的值 , 索引从1开始
三、DAO
DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务 逻辑与数据库资源中间。
DAO模式是标准的JavaEE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分 开.一个典型的DAO实现有下列几个组件:
- 一个DAO工厂类;
- 一个DAO接口;
- 至少一个实现DAO接口的具体类;
- 数据传递对象(有些时候叫做Bean对象)。
四、SQL注入
4.1 SQL注入类型
4.1.1 数字型注入 1 and 1 = 1
SELECT * FROM table WHERE id=1 and 1 = 1;
4.1.2 字符型注入 admin' and 1 = 1 --
SELECT * FROM table WHERE username = 'admin' and 1 = 1 -- ;
4.2 防止SQL注入
将SQL语句与参数分离,将参数作为SQL的特殊部分进行预处理
使用 PreparedStatement
预编译的SQL执行环境,只是对象不同,操作简单,几乎与Statement一样
五、事件
在Java中的操作方式
//JDBC事务通过连接对象开启, 回滚 ,提交. 只针对当前连接对象生效
//开启事务
conn.setAutoCommit(false);
//回滚事务
conn.rollback();
//提交事务
conn.commit();
六、批处理
将多条语句,放到一起批量处理
批1处理的原理:将多条SQL语句转换为一个SQL指令,显著的提高大量SQL语句执行时的数据库性能
6.1 Statement对象使用
//1. 得到Statement对象
Statement state = conn.createStatement();
//2. 将一条SQL语句, 加入到批处理中.
state.addBatch(String sql);
//3. 执行批处理
state.executeBatch();
//4. 清空批处理
state.clearBatch();
6.2 PreparedStatement对象使用
//1. 得到PreparedStatement对象
PreparedStatement state = conn.prepareStatement("预编译的SQL");
//2. 填充预编译的参数
state.setXXX(1,填充参数);
//3. 将一条填充完毕参数的SQL, 加入到批处理中.
state.addBatch();
//4. 执行批处理
state.executeBatch();
//5. 清空批处理
state.clearBatch();
七、数据库连接池
7.1 概念
连接池其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问之后,会将连接对象归还给容器
7.2 实例Druid
- 导入 jar 包
- 定义配置文件
- 手动加载配置文件
- 通过工厂获取 DruidDataSourceFactory 数据连接池对象
- 获取连接
- 归还连接
配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 延迟时间
maxWait=3000
实例
public class DruidDemo1 {
public static void main(String[] args) throws Exception {
//1.导入jar包
//2.定义配置文件
//3.加载配置文件
Properties prop = new Properties();
InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
prop.load(is);
//4.获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(prop);
//5.获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
// 6.归还连接
conn.close();
}
}