JDBC

1.定义:

JDBC是Java数据库【database】连接【connectivity】的简称,提供连接各种常用数据库的能力。

 

2.工作原理:

JDBC API

API:应用程序接口,是软件系统不同组成部分衔接的约定。应用程序接口主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节,主要分为Windows API和linux API

提供者:Sun公司

 内容:供程序员调用的接口与类,集成在java.sql和javax.sql包中,

如:DriverManager类;          Connection接口                Statement接口;            ResultSet接口

DriverManager:提供者:Sun公司

作用:管理各种不同的JDBC驱动

JDBC 驱动:提供者:数据库厂商

作用:负责连接各种不同的数据库

主要功能:与数据库建立连接、执行SQL 语句、处理结果

DriverManager :依据数据库的不同,管理JDBC驱动

Connection :负责连接数据库并担任传送数据的任务  

Statement :由 Connection 产生、负责执行SQL语句

ResultSet:负责保存Statement执行后所产生的查询结果

JDBC驱动直接访问数据库:

优点:完全Java代码,快速、跨平台

缺点:访问不同的数据库需要下载专用的JDBC驱动

 

3.Statement常用方法:

方法名                              说    明

ResultSet executeQuery(String sql)   执行SQL查询并获取到ResultSet对象

int executeUpdate(String sql)  可以执行插入、删除、更新等操作,返回值是执行该操作所影响的行数

boolean execute(String sql)   可以执行任意SQL语句,然后获得一个布尔值,表示是否返回ResultSet

ResultSet常用方法

方法名                            说    明

boolean next()                   将游标从当前位置向下移动一行

boolean previous()             游标从当前位置向上移动一行

void close()                   关闭ResultSet 对象

int getInt(int colIndex)          以int形式获取结果集当前行指定列号值

int getInt(String colLabel)          以int形式获取结果集当前行指定列名值

float getFloat(int colIndex)       以float形式获取结果集当前行指定列号值

float getFloat(String colLabel)       以float形式获取结果集当前行

String getString(int colIndex)       以String 形式获取结果集当前行指定列号值

String getString(String colLabel)    以String形式获取结果集当前行指定列名值

 

4.如何避免SQL注入的隐患?

反射:一种动态语言,在程序运行时,可改变程序结构或变量类型,可得对应类全部信息

SQL注入:是一种数据库(网络)攻击手段,填写SQL语句来执行非常规代码过程,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

总体思路:1:寻找到SQL注入的位置

2:判断服务器类型和后台数据库类型

3:针对不同的服务器和数据库特点进行SQL注入攻击

使用PreparedStatement 接口(继承自 Statement接口)

相比Statement对象使用起来更加灵活,更有效率

优点:(1)提高了代码的可读性和可维护性

(2) 提高了SQL语句执行的性能

(3) 提高了安全性

 

5.JDBC关键步骤(与ADO.NET步骤类似)

//1.加载驱动类

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

//2.创建数据库连接

conn=DriverManager.getConnection(URL(标识数据库),数据库用户名,密码);

("jdbc:mysql://localhost:3306/myschool","root","root")

//3.创建一条sql语句

String sql="select *from Student";

//4.创建SQL语句对象

stat=conn.prepareStatement(sql);

stat.setString("");

//5.执行SQL语句得到rs结果

rs=stat.executeQuery("");

//6.通过rs得到单元格内容

while(rs.next()){ }

//7.释放资源

rs.close();stmt.close(); con.close();

 

 

6.注意事项:

(1)遍历结果集中数据可使用列号或列名标识列

(2) PreparedStatement比Statement提高了代码的安全性、可读性和可维护性

 

7.execute、executeUpdate、executeQuery三者的区别(及返回值):

1.ResultSet executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象。

用于产生单个结果集(ResultSet)的语句,例如:被执行最多的SELECT 语句。

这个方法被用来执行 SELECT 语句,但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。

2.int executeUpdate(String sql); 可执行增,删,改,返回执行受到影响的行数。

用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。

INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。

executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。

3.boolean execute(String sql); 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。

execute是executeQuery和executeUpdate的综合.

可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。

 

8.设置编码格式:?useUnicode=true&characterEncoding=UTF-8

                             (用于字符集&编码格式出现错误)

设置时区:?useSSL=false&&serverTimezone=GMT%2B8

 

9.增删改查SQL结构

增:insert into 表名(列名1) values (值1);         insert列1,列2 into 值1,值2 from 表名; 删:delete from 表名 where 删除条件 改:update修改数据 set 原数据where 更新条件(增删改受影响行数,int类) 查:select 列名 from表名 where条件

 10.JDBC架构:

分为双层架构和三层架构。

双层

作用:此架构中,Java Applet 或应用直接访问数据源。

条件:要求 Driver 能与访问的数据库交互。

机制:用户命令传给数据库或其他数据源,随之结果被返回。

部署:数据源可以在另一台机器上,用户通过网络连接,称为 C/S配置(可以是内联网或互联网)。

三层

侧架构特殊之处在于,引入中间层服务。

流程:命令和结构都会经过该层。

吸引:可以增加企业数据的访问控制,以及多种类型的更新;另外,也可简化应用的部署,并在多数情况下有性能优势。

历史趋势:以往,因性能问题,中间层都用 C 或 C++ 编写,随着优化编译器(将 Java 字节码 转为 高效的 特定机器码)和技术的发展,如EJB,Java 开始用于中间层的开发这也让 Java 的优势突显出现出来,使用 Java 作为服务器代码语言,JDBC随之被重视。

eg:

public class JdbcDemo {
public static final String URL = "jdbc:mysql://localhost:3306/mblog";
public static final String USER = "root";
public static final String PASSWORD = "123456";

public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
while(rs.next()){
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
                 }
            }
    }

上一篇:JDBC原生操作


下一篇:为什么使用Mybatis对JDBC进行包装探究