JDBC的简介
简介
- JDBC(Java Database Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成
- JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
- JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX
- JDBC库包括与数据库使用相关的API
- 连接数据库
- 创建SQL或MYSQL语句
- 在数据库中执行SQL或MYSQL查询
- 查看和修改生成的记录
JDBC体系结构
- JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:
- JDBC:提供了应用程序到数据库连接规范
- JDBC驱动程序:连接数据库的驱动程序的实现
JDBC核心组件
- DriverManager:此类管理数据库驱动程序列表,使用通信协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。
- Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互,而是使用DriverManager对象来管理这种类型的对象
- Connection:该接口具有用于连接数据库的所有方法,连接对象表示上下文,数据库的所有通信仅通过连接对象
- Statement:使用从此接口创建的对象将SQL语句提交到数据库,除了执行存储过程之位,一些派生接口还接受参数
- ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据
- SQLException:此类处理数据库应用程序中发生的任何异常
JDBC使用步骤
导入JDBC驱动包:需要下载包含数据可编程所需的JDBC的jar包(mysql的jar包:mysql-connector-java-5.1.48.jar)
注册JDBC驱动程序:要求您初始化驱动程序,以便您可以打开与数据库的通信通道
创建连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表示与数据库的物理连接
执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库
从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中集中检索数据
释放资源:需要明确的关闭所有数据库资源,而不依赖于JVM的垃圾收集
- 用eclipse,建议导入jar包,在项目下创建lib目录,把mysql的jdbc的jar包放入此目录,并添加到build path中(idea不同)
注册驱动
- 第一种方式:是使用静态DriverManager.registerDriver()方法。
package waking.test.jdbc;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Driver;
public class Demo01 {
public static void main(String[] args) {
try {
Driver driver = new Driver();
DriverManager.registerDriver(driver);
System.out.println("注册驱动成功、、、");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("注册驱动异常、、、、");
}
}
}
- 第二种方式:Class.forName():注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内
存中,并将其自动注册
package waking.test.jdbc;
public class Demo02 {
public static void main(String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("注册成功、、、");
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("注册异常、、、");
}
}
}
- 第三种方式:什么都不写,程序会自动加载驱动(不建议使用)
获取连接
- 加载驱动程序后,可以使用DriverManager.getConnection()方法建立连接。
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url,String user, String Password)
String URL ="jdbc:mysql://localhost:3306/csdn";
//csdn是数据库名,localhost是代表本机,3306,是端口号
String USER ="root";
//mysql数据库用户名
String PASS = "123456"
//mysql数据库密码
//获取连接
Connection conn = DriverManager.getConnection(URL,USER,PASS);
执行sql语句
- 一旦获得了连接,就可以与数据库交互,JDBC Statement和PreparedStatement接口定义了能够发送SQL命令并从数据库接收数据的方法和属性。
接口 | 使用 |
---|
Statement | 用于对数据库进行通用访问。在运行时使用静态SQL语句时很有用。注:Statement接口不能接收参数 |
PreparedStatement | 推荐使用,多次使用SQL语句时使用,PrepareStatement接口在运行时接受输入参数 |
方法名 | 说明 |
---|
boolean execute(String SQL) | 如果可以检索到ResultSet对象,则返回一个布尔值true,否则返回false。使用此方法执行SQL DDL语句或需要使用真正的动态SQL时 |
int executeUpdate(String SQL) | 返回SQL语句执行影响行数,使用此方法执行预期会影响多个行的SQL语句,列如:insert,update,delete语句 |
ResultSet executeQuery(String SQL) | 返回一个ResultSet对象,使用select语句 |
就像IO流一样,JDBC中的方法也要关闭连接,通常关闭顺序
ResultSet--->statement/preparedStatement-->Connection
CRUD操作
查询(select)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo03 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from user";
rs = stmt.executeQuery(sql);
while(rs.next()) {
int userId = rs.getInt("userId");
String username = rs.getString("username");
String pword = rs.getString("password");
String address = rs.getString("address");
String phone = rs.getString("phone");
System.out.println("userId:"+userId+"username:"+username+"pword:"+pword+"address:"+address+"phone:"+phone);
}
} 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();
}
}
}
}
}
插入(insert)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo04 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "insert into user values(5,'waking','waking','haha','17273934784')";
int row = stmt.executeUpdate(sql);
System.out.println("影响"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
更新(update)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo05 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "update user set password = '123456' where userId=5";
int row = stmt.executeUpdate(sql);
System.out.println("影响"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
删除(delete)
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo06 {
public static void main(String[] args) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "delete from user where userId = 5";
int row = stmt.executeUpdate(sql);
System.out.println("影响"+row+"行");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
用户登录注册
- 用户登录案例是开放人员最常用的操作,以下实现简单的登录注册
- 注册
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请您注册、、");
System.out.println("请您输入姓名");
String username = sc.nextLine();
System.out.println("请输入密码、、、");
String pword = sc.nextLine();
System.out.println("请输入地址、、、");
String address = sc.nextLine();
System.out.println("请输入手机号码、、、");
String phone = sc.nextLine();
register(username, pword, address, phone);
}
public static void register(String username,String pword,String address,String phone) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "insert into user(username,password,address,phone) values('"+username+"','"+pword+"','"+address+"','"+phone+"')";
int row = stmt.executeUpdate(sql);
System.out.println("影响"+row+"行");
System.out.println("注册成功、、、");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo08 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请登录、、、");
System.out.println("请输入用户名、、、");
String username = sc.nextLine();
System.out.println("请输入密码");
String pword = sc.nextLine();
login(username, pword);
}
public static void login(String username,String pword) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs =null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
stmt = conn.createStatement();
String sql = "select * from user where "+"username='"+username+"' and "+"password='"+pword+"'";
rs= stmt.executeQuery(sql);
if(rs!=null) {
System.out.println("登录成功、、、");
}
} 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();
}
}
}
}
}
SQL注入
- 以上的用法有安全问题(SQL注入)
- 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
- 具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
- 例子:
SELECT * FROM USER WHERE username='waking' AND PASSWORD='wakingwdr' OR '1'='1';
#后面or ‘1’=‘1’恒成立
package waking.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class Demo09 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
System.out.println("请登录、、、");
System.out.println("请输入用户名、、、");
String username = sc.nextLine();
System.out.println("请输入密码");
String pword = sc.nextLine();
login(username, pword);
}
public static void login(String username,String pword) {
String dirver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/csdn";
String user = "root";
String password = "123456";
String sql = "select * from user where username = ? and password = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs =null;
try {
Class.forName(dirver);
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, pword);
rs = pstmt.executeQuery();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
System.out.println("登录成功、、、");
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
下一篇会介绍JDBC和mysql的事务问题,以及批处理问题,感谢您的观看