JDBC~

本文详细介绍了JDBC的概念,包括注册驱动、获取数据库连接、创建Statement和PreparedStatement对象、发送SQL语句及解析结果。强调了PreparedStatement在防止SQL注入方面的优势,并提到了主键回显技术和批量插入的实现方法。此外,还讨论了事务管理在JDBC中的应用。
摘要由CSDN通过智能技术生成

JDBC

JDBC的技术概念和理解

  1. Java DataBase Connectivity 的缩写
  2. 是java程序链接数据库的技术统称
  3. 是由java语言的接口和各个数据厂商实现驱动组成
  4. 是典型的面向接口编程
  5. 只要学习了JDBC的规范接口方法,即可操作所有的数据库软件

JDBC核心API和使用路线

涉及到的核心接口

  • DriverManager
    1. 将第三方的数据库商jar注册到程序中
    2. 根据数据库信息获取connection对象
  • Connection
    1. 和数据库链接,在连接对象上,执行多次的数据库card动作
    2. 获取Statement | PreparedStatement | CallableStatement对象
  • Statement | PreparedStatement | CallableStatement
    1. 具体发送SQL语句到数据库软件管理对象
    2. PreparedStatement为重点!
  • Result
    1. 查询结果
    2. 存储DQL查询数据库的对象
    3. 需要解析,获取具体数据

使用路线

  • Statement :静态SQL语句
  • PreparedStatement :动态SQL语句 (常用)
  • CallableStatement:执行标准存储过SQL路线

基本步骤

  1. 注册驱动依赖的jar包,进行安装
  2. 建立连接 connection
  3. 创建发送SQL语句的对象statement
  4. statement对象发送到数据库,返回结果
  5. 解析结果relsutset
  6. 销毁资源
    1. 释放connection
    2. 释放statement
    3. 释放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语句
  1. excuteUpdate()
    • 参数:非DQL语句
    • 返回int:删除了列的行数等等
  2. 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的问题
  1. SQL语句的字符串拼接比较麻烦
  2. 只能是字符类型
  3. 可能发生注入攻击
preparedStatement解决方法
  1. 编写SQL语句,动态值部分用?所替代
  2. 创建preparedStatement,并且传入动态值部分
  3. 发送并且返回结果
编写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的扩展实现

主键回显技术

  1. 创建Stetement时候写上第二个参数Statement.RETURN_GENERATED_KEYS)
        PreparedStatement preparedStatement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
  1. 再获取主键
		ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
        generatedKeys.next();
        int anInt = generatedKeys.getInt(1);

批量插入

  1. 路径后面添加**?rewriteBatchedStatements=true**允许批量插入
  2. insert into values [ ] 语句后面不能加分号;
  3. 将数据添加到方法中statement.addBatch()
  4. 进行批量添加操作statement.excuteBatch()

事务回顾

  1. 事务回顾添加在业务方法中
  2. 利用try catch代码块,开启和提交业务,事务回滚
  3. 将connection传入doo层中直接利用即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值