JDBC使用步骤总结
1. 注册驱动- Class.forName("com.mysql.cj.jdbc.Driver");
复制代码 2. 获取链接- Connection connection =
- DriverManager.getConnection(url,user,password);
复制代码 3. 创建statement- //静态:
- Statement statement = connection.createStatement();
- //动态:
- PreparedStatement preparedstatement = connection.preparedStatement();
- //编写sql语句,其中动态值用 ? 代替
- String sql = "";
复制代码 4. 占位符赋值- //下标从1开始
- preparedStatement.setObject(index,value);
复制代码 5. 发送sql语句获取结果集- //非DDL语句
- int i = preparedStatement.executeUpdate();
- //DDL语句
- ResultSet = preparedStatement.executeQuery();
复制代码 6. 查询结果解析结果集- /*
- resulset看成一个表格,里面有行有列,其中含有一个游标,初始指向第1行之前
- 可以通过next()方法遍历
- getObject(columName):获取当前行此列名的对象
- resulset 包含 MetaData对象
- */
- //构建metaData对象
- ResultSetMetaData metaData = resultSet.getMetaData();
- //调用方法获取列数
- int columnCount = metaData.getColumnCount();
- ArrayList<Map> list = new ArrayList<>();
- while (resultSet.next()){//遍历行
- Map map = new HashMap();
- for (int i = 1; i <= columnCount; i++) {//遍历列
- Object value = resultSet.getObject(i);
- //要用columLabel 不要用 columName,因为columName获取的是真名,无法获取别名
- String columnLabel = metaData.getColumnLabel(i);
- map.put(columnLabel,value);
- }
- list.add(map);
- }
复制代码 4.当sql语句含有动态值的时候,为什么不适合用statement例如:- 此方法会注册两次驱动
- 1.DriverManger.registerDriver() 方法本身会注册一次
- 2.Driver.static{DriverManager.registerDriver()} 静态代码块也会注册一次
复制代码 5.为什么说preparedStatement 不会发生注入攻击?
因为生成preparedStatement的时候,先传输一遍sql语句的结构,无法通过动态值来混淆,改变sql语句的结构。
6.遍历结果集的方法- 1.加载: class文件-->jvm的class对象
- 2. 连接: 验证(语法错误,文件类型) --> 准备(静态变量默认值) --》 解析(触发静态代码块)
- 3. 初始化(静态属性赋真实值)
复制代码 7.要用columLabel 不要用 columName
因为columName获取的是真名,无法获取别名
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |