JDBC
JDBC
JDBC的技术概念和理解
- 是Java DataBase Connectivity 的缩写
- 是java程序链接数据库的技术统称
- 是由java语言的接口和各个数据厂商实现驱动组成
- 是典型的面向接口编程
- 只要学习了JDBC的规范接口方法,即可操作所有的数据库软件
JDBC核心API和使用路线
涉及到的核心接口
- DriverManager
- 将第三方的数据库商jar注册到程序中
- 根据数据库信息获取connection对象
- Connection
- 和数据库链接,在连接对象上,执行多次的数据库card动作
- 获取Statement | PreparedStatement | CallableStatement对象
- Statement | PreparedStatement | CallableStatement
- 具体发送SQL语句到数据库软件管理对象
- PreparedStatement为重点!
- Result
- 查询结果
- 存储DQL查询数据库的对象
- 需要解析,获取具体数据
使用路线
- Statement :静态SQL语句
- PreparedStatement :动态SQL语句 (常用)
- CallableStatement:执行标准存储过SQL路线
基本步骤
- 注册驱动依赖的jar包,进行安装
- 建立连接 connection
- 创建发送SQL语句的对象statement
- statement对象发送到数据库,返回结果
- 解析结果relsutset
- 销毁资源
- 释放connection
- 释放statement
- 释放relsutset
Statement具体实现和一些细节处理
1. 注册驱动
DriverManager.registerDriver(new Driver());
当我们查询Driver()时会发现
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
里面会有静态的代码块,意味着如果我们使用如上方法会注册两次,我们可以使用驱动代码块的方式来进行注册:
1.new 关键字
2.调用静态方法/属性
3.使用1.8default默认实现
4.反射
5.子类触发父类
6.写程序时的main
使用反射的效果最好:
Class.forname("com.mysql.cj.jdbc.Driver2");
2. 获取连接
Connection root = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc", "root", "12345");
核心属性:
1. 数据库所在ip地址:localhost/127.0.0.1
2. 数据库所在的主机端口号:3306
3. 账号,密码
4. 可选信息:没有
函数可填入的三个参数:
- String url:jdbc:数据库管理软件名称[mysql/oracle]: //ip地址|主机号:port端口号/数据库名?key=value(可选信息)
- 账号,密码
3.创建Statement
Statement statement = root.createStatement();
4. 发送sql语句
- excuteUpdate()
- 参数:非DQL语句
- 返回int:删除了列的行数等等
- excuteQuery()
- 参数DQL语句
- 返回Result对象
5.解析结果
while(resultSet.next()){
int id = resultSet.getInt("id");
String account = resultSet.getString("account");
String password = resultSet.getString("password");
System.out.println(id+account+password);
}
获取列的信息
可以使用getMetaData()来获取列的信息,比如索引
ResultSetMetaData metData = resultSet.getMetaData();
int a = metData.getColumnCount();
再在循环中使用for循环遍历即可,顺便获取列下角标的值和名称
//列下角标的值
Object value = resulSet.getObject(i);
//列下角标的名称
String str = metaData.getColumnLabl(i);
//放入集合Map中(例如)
map.put(str,value)
preparedStatement
statement的问题
- SQL语句的字符串拼接比较麻烦
- 只能是字符类型
- 可能发生注入攻击
preparedStatement解决方法
- 编写SQL语句,动态值部分用?所替代
- 创建preparedStatement,并且传入动态值部分
- 发送并且返回结果
编写SQL语句
String sql = "select * from t_user where account = ? and password = ?";
创建statement并且设置SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
单独占用符进行赋值
参数一:索引值由 1 开始,从左往右一次排列
参数二:object 占位符的位置 可以设置任意类型的数据
preparedStatement.setObject(1,account);
preparedStatement.setObject(2,password);
使用API总结
1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
2. 获取连接
Connection connection = DriverManager.getConnection("","","");
3. 创建Statement
静态
Statement statement = connection.createStatement();
预备
PreparedStatement preparedstatement = connection.preparedStatement(sql语句);
4. 占位符赋值
preparedstatement.setObject(?的位置,值);
5. 发送SQL语句
int rows = excuteUpdate();
ResultSet resultset = excuteQuery();
6. 解析结果
7. 关闭资源
全新JDBC的扩展实现
主键回显技术
- 在创建Stetement时候写上第二个参数Statement.RETURN_GENERATED_KEYS)
PreparedStatement preparedStatement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
- 再获取主键
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
generatedKeys.next();
int anInt = generatedKeys.getInt(1);
批量插入
- 路径后面添加**?rewriteBatchedStatements=true**允许批量插入
- insert into values [ ] 语句后面不能加分号;
- 将数据添加到方法中statement.addBatch()
- 进行批量添加操作statement.excuteBatch()
事务回顾
- 事务回顾添加在业务方法中
- 利用try catch代码块,开启和提交业务,事务回滚
- 将connection传入doo层中直接利用即可