JDBC【Java DataBase Connectivity】java数据库连接接口;
-
面向接口编程:
- 注册驱动
- 获取连接
- 定义sql语句;
- 获取执行sql对象;
- 执行sql
- 处理返回结果;
- 释放资源;
-
JDBC API【面向接口编程】:
-
DriverManager:
- 注册驱动【registerDriver】;
- 获取数据库连接【getConnection】;
- 语法:jdbc:mysql://ip【本机:localhost,127.0.0.1】:端口/数据库?键值对
- 获取返回对象Connection对象;
-
Connection
- 获取执行SQL的对象Statement:
- creatStatement():普通执行sql对象;
- prepareStatemen():预编译sql的执行sql对象,防止sql注入;
- prepareCall():执行存储过程的对象;
- 管理事务;
- setAutoCommit():开启事务;
- commit():
- rollback():
- 获取执行SQL的对象Statement:
-
Statement
- 执行SQL语句:
- int executeUpdate(sql);
- ResultSet executeQuery(slq);
- 执行SQL语句:
-
ResultSet:
- 执行查询语句的返回结果;
- boolean next();
- getXxx();
-
PrepareStatement
-
extends statement,为了预编译sql的执行sql对象,防止sql注入;
-
sql注入:通过操作输入修改事先定义好的SQL语句,以达到执行代码来对服务器进行攻击;
-
如何防止:以前是字符串的拼接,现在在字符串拼接的基础上,在敏感字符上加斜杠转义字符,防止歧义
-- and 关键词比 or先执行,false or true, 任然是true,所以会返回所有数据; SELECT * FROM t1 WHERE ename = 'dfkvbk' AND pwd = '' OR '1' = '1'; -- 核心是字符串的拼接,造成sql语句歧义;
-
获取PrepareStatemen对象:
String sql = "select * from t1 where username = ? and password = ?"; //使用占位符?代替 PrepareStatement ps = cnn.prepareStatemen(sql); ps.setXxx(参数1,参数2); // Xxx数据类型,参数1:序号从1开始,参数2:值; ps.exexutUpdate(); ps.executeQuery(); // 不需要传递sql语句 //开启预编译,加入到url中: useServerPrepStmts = true;
-
sql语句执行流程:
- 检查语法 + 编译sql + 执行sql:前两者更耗时;
- PreparedStatement对象在获取时就传入sql语句,传递给mysql,执行语法检查+编译sql,效率更高;
-
-
-
数据库连接池:
-
连接池就是一个容器,负责分配,管理数据库连接;
-
标准接口:DataSource
获取连接:getConnection();
eg:Druid,
-