1. DriverManager

  (1) 注册驱动

    Class.forName("com.mysql.cj.jdbc.Driver");

    

    真正注册驱动的是驱动包下 jdbc 文件夹中 Driver 类的 "DriverManager.registerDriver(Driver driver)"方法。

    告诉程序使用哪个数据库驱动 jar 包。

    注意:MySQL 5及以后的注册驱动的语句可以不用写的,因为驱动 jar 包的 META-INF -- services -- java.sql.Driver 文件中记录着加载驱动的位置和文件。如果没有手动注册,则会自动读取这个文件然后注册驱动。建议还是手动注册比较稳妥。

    

  (2) 获取数据库链接

    public static Connection getConnection(String url,String user,String password)

    尝试建立与给定数据库URL连接,不同的数据库有不同的URL语句。

    "jdbc:mysql://IP地址:端口/数据库"    // MySQL数据库URL
    "jdbc:oracle:thin:@//IP地址:端口/数据库" // Oracle数据库URL
    "jdbc:sqlserver://IP地址:端口;DatabaseName=数据库" // SQL Server数据库URL

    如果MySQL使用本地数据库和默认端口,则可以使用简写 "jdbc:mysql:///数据库"。

2. Connection

  (1) 获取执行sql的对象

    createStatement()
    prepareStatement(String sql)

  (2) 管理事务

    setAutoCommit(boolean autoCommit) // 设值为false开启事务
    commit() // 提交事务
    rollback() // 回滚事务

3. Statement

  (1) int executeUpdate(String sql)

    执行DML语句增删改表和DDL语句操作数据库,返回影响行数,判断DML语句执行是否成功。

  (2) ResultSet executeQuery(String sql)

    执行DQL语句查询表中数据,返回查询结果集。

  (3) boolean execute(String sql)

    可以执行任意SQL语句,但不常用。

  注意:Statement对象因为安全性和效率问题,几乎很少用到,都由PreparedStatement替代。

4. ResultSet

  这是结果集对象,封装了查询结果。要做的就是将结果集中的数据取出来。

  这里面有一个抽象的东西,叫游标。就像数组中的下标一样,游标从一开始指向的是结果集的列名一行,不指向任何一行数据。通过方法,可以移动游标,指向数据读取数据。

  (1) boolean next()

    这个方法可以使游标向下移动一行,返回一个布尔类型数据,告诉这行是否有数据,也就是是否移动到最后一行末尾(移动到表外面了)。如果移出去了,就返回false,如果没移出去就返回true。

  (2) get数据类型(参数)

    例如:int getInt(int columnIndex)     String getString(int columnIndex)

    注意:参数有两种:

    1) int:代表列的编号,从最左边的第一列开始为1。

      例如:getInt(1)

    2) String:代表列的名称,这样更精确更直观一些,用的比较多。

      例如:getString("name")

  示例:

import java.sql.*;

public class JDBCSelect {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/" +
"db?characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false",
"root","saqwedcxz");
String sql = "SELECT * FROM user";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
int id = rs.getInt(1);
String name = rs.getString("name");
int age = rs.getInt(3);
System.out.println(id + " - " + name + " - " + age);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}

5. PreparedStatement

  (1) 问题

    常规的传值登陆,通过简单的字符串拼接,就可能有一些SQL的关键字参与字符串的拼接,将SQL语句改变,就会导致非法访问,这又称为"SQL注入"漏洞。

    最经典的SQL注入字符串:a' or 'a' = 'a

  (2) 解决

    使用预编译SQL的 PreparedStatement 对象解决问题。

    预编译SQL的参数使用"?"作为占位符,之后为占位符赋值便可。虽然使用起来比较麻烦,但是安全性大大提升了。解决了SQL注入问题。

  (3) 使用

    1) 在定义SQL语句的时候,将参数用 "?" 代替。

      例如:"SELECT * FROM user WHERE id = ?";

    2) 获取执行SQL语句对象,需要使用 prepareStatement(String sql) 方法

      例如:conn.prepareStatement(sql);

    3) 给 "?" 赋值,使用 set数据类型(第几个占位符,值) 方法

      例如:pstmt.setInt(1,1);

    4) 执行SQL语句时,因为已经给 PreparedStatement 预编译,就无需再传SQL。

      例如:pstmt.executeQuery();

  (4) 注意

    在绝大多数时间都会使用PreparedStatement完成DML和DQL操作。一是可以防止SQL注入;二是执行的效率更高。

  示例

        Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "SELECT * FROM user WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,1);
rs = pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(rs, pstmt, conn);
}

详解JDBC对象的更多相关文章

  1. 执行对象Statement、PreparedStatement和CallableStatement详解 JDBC简介(五)

    执行对象是SQL的执行者,SQL是“安排好的任务”,执行对象就是“实际工作的人”. 执行对象有三种: Statement.PreparedStatement和CallableStatement,他们都 ...

  2. 详解JDBC与Hibernate区别

    详解JDBC与Hibernate区别 引用地址:http://www.cnblogs.com/JemBai/archive/2011/04/13/2014940.html 刚开始学习JAVA时,认为H ...

  3. dom对象详解--document对象(二)

       dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...

  4. dom对象详解--document对象(一)

     document对象 Document对象代表整个html文档,可用来访问页面中的所有元素,是最复杂的一个dom对象,可以说是学习好dom编程的关键所在. Document对象是window对象的一 ...

  5. js对象详解(JavaScript对象深度剖析,深度理解js对象)

    js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...

  6. Struts功能详解——ActionMapping对象

    Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...

  7. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  8. 18.Java 封装详解/多态详解/类对象转型详解

    封装概述 简述 封装是面向对象的三大特征之一. 封装优点 提高代码的安全性. 提高代码的复用性. "高内聚":封装细节,便于修改内部代码,提高可维护性. "低耦合&quo ...

  9. 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...

随机推荐

  1. 【转载】 腾讯云通过设置安全组禁止某些IP访问你的服务器

    有时候我们在运维网站的过程中会发现一些漏洞扫描者的IP信息,或者个人爬虫网站的IP信息,此时我们想禁止掉这些IP访问到你的服务器,可以通过腾讯云的安全组功能来设置禁止这些IP访问你的服务器,也可以通过 ...

  2. JavaScript Array vs new Array区别

    规范说明 When Array is called as a function rather than as a constructor, it creates and initialises a n ...

  3. 浅谈javascript中变量作用域和内存(1)

    先理解两个概念:基本类型和引用类型的值 1.基本类型和引用类型的值 (1)定义: 基本类型:指简单的数据段,比如按值访问的js五种基本数据类型undefined.null.boolean.number ...

  4. js中0.1+0.2 与0.3的对比

    Math.abs(0.1+0.2-0.3)<=Number.EPSILON

  5. OSI协议与TCP\IP协议之间的关系

    OSI协议 TCP\IP协议 五层协议(学习参考) 应用层 应用层 应用层 表示层 会话层 运输层 运输层 运输层 网络层 网络层 网络层 数据链路层 网络接口层 数据链路层 物理层 物理层 基于五层 ...

  6. Fortify漏洞之Cross-Site Scripting(XSS 跨站脚本攻击)

    书接上文,继续对Fortify漏洞进行总结,本篇主要针对XSS跨站脚步攻击漏洞进行总结,如下: 1.Cross-Site Scripting(XSS 跨站脚本攻击) 1.1.产生原因: 1. 数据通过 ...

  7. 解决 google 浏览器记住密码导致输入框样式改变(变成淡黄色背景)

    直接在页面上使用css代码: input:-webkit-autofill , textarea:-webkit-autofill, select:-webkit-autofill { -webkit ...

  8. shell 三剑客之 sed pattern 详解

    sed 基础介绍 语法格式 sed 处理过程 sed 选项 cat sed.txt '-p' 打印输出 ,默认输出两次,流输出一次,源文件输出一次 sed 'p' sed.txt -n  只显示处理的 ...

  9. Flutter——消息框(Fluttertoast)

    引入依赖: dependencies: fluttertoast: ^3.1.3 import 'package:flutter/material.dart'; import 'package:flu ...

  10. JSON【1】

    http://repo1.maven.org/maven2/com/fasterxml/jackson/core/    JSON[jar]包下载 JSON是什么? 是一种轻量级的数据交换格式,完全独 ...