JDBC简述(mysql)

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驱动程序:连接数据库的驱动程序的实现
      alt
JDBC核心组件
  • DriverManager:此类管理数据库驱动程序列表,使用通信协议将来自java应用程序的连接请求与适当的数据库驱动程序匹配。
  • Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互,而是使用DriverManager对象来管理这种类型的对象
  • Connection:该接口具有用于连接数据库的所有方法,连接对象表示上下文,数据库的所有通信仅通过连接对象
  • Statement:使用从此接口创建的对象将SQL语句提交到数据库,除了执行存储过程之位,一些派生接口还接受参数
  • ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。它作为一个迭代器,允许我们移动其数据
  • SQLException:此类处理数据库应用程序中发生的任何异常
JDBC使用步骤
  • 构建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;

/**
 * JDBC连接注册驱动
 * @author waking
 *
 */
public class Demo01 {
	public static void main(String[] args) {
		try {
			//创建Driver对象
			Driver driver = new Driver();
			//使用静态DriverManager.registerDriver()方法
			DriverManager.registerDriver(driver);
			System.out.println("注册驱动成功、、、");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("注册驱动异常、、、、");
		}
		
	}
}
  • 第二种方式:Class.forName():注册驱动程序最常见的方法是使用Java的Class.forName()方法,将驱动程序的类文件动态加载到内
    存中,并将其自动注册
package waking.test.jdbc;
/**
 * 注册驱动(建议使用)
 * @author waking
 *
 */
public class Demo02 {
	public static void main(String[] args) {
		try {
			//使用Class.forName()
			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;


/**
 * JDBC连接数据库
 *查询csdn数据库中user表
 * @author waking
 *
 */
public class Demo03 {
	public static void main(String[] args) {
		//驱动
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		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();
			//返回结果
			//sql语句
			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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
插入(insert)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC连接数据库insert操作
 * @author waking
 *
 */
public class Demo04 {
	public static void main(String[] args) {
		//驱动
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//声明连接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加载驱动
			Class.forName(dirver);
			//创建连接
			conn = DriverManager.getConnection(url, user, password);
			//查询
			stmt = conn.createStatement();
			//返回结果
			//sql语句
			String sql = "insert into user values(5,'waking','waking','haha','17273934784')";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影响"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
更新(update)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC连接数据库update操作
 * @author waking
 *
 */
public class Demo05 {
	public static void main(String[] args) {
		//驱动
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//声明连接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加载驱动
			Class.forName(dirver);
			//创建连接
			conn = DriverManager.getConnection(url, user, password);
			//查询
			stmt = conn.createStatement();
			//返回结果
			//sql语句
			String sql = "update user set password = '123456' where userId=5";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影响"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
删除(delete)
package waking.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * JDBC连接数据库delete操作
 * @author waking
 *
 */
public class Demo06 {
	public static void main(String[] args) {
		//驱动
		String dirver = "com.mysql.jdbc.Driver";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//声明连接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加载驱动
			Class.forName(dirver);
			//创建连接
			conn = DriverManager.getConnection(url, user, password);
			//查询
			stmt = conn.createStatement();
			//返回结果
			//sql语句
			String sql = "delete from user where userId = 5";
			
			int row = stmt.executeUpdate(sql);
			System.out.println("影响"+row+"行");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					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;

/**
 * 用户注册
 * @author waking
 *
 */
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";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		
		//声明连接
		Connection conn = null;
		Statement stmt = null;
		
		try {
			//加载驱动
			Class.forName(dirver);
			//创建连接
			conn = DriverManager.getConnection(url, user, password);
			//查询
			stmt = conn.createStatement();
			//返回结果
			//sql语句
			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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					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;

/**
 * 登录
 * @author waking
 *
 */
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";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		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();
			//返回结果
			//sql语句
			String sql = "select * from user where "+"username='"+username+"' and "+"password='"+pword+"'";
			
			rs= stmt.executeQuery(sql);
			if(rs!=null) {
				System.out.println("登录成功、、、");
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(stmt!=null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					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’恒成立
  • 解决办法:使用PreparedStatement
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;

/**
 *  登录-解决SQL注入
 * @author waking
 *
 */
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";
		//url
		String url = "jdbc:mysql://localhost:3306/csdn";
		//user
		String user = "root";
		//password
		String password = "123456";
		//sql语句
		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) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//关闭连接
			if(rs!=null) {
				try {
					rs.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(pstmt!=null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			if(conn!=null) {
				try {
					System.out.println("登录成功、、、");
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}
	}
}

  • 通常会把JDBC的方法封装,这里就不封装了
下一篇会介绍JDBC和mysql的事务问题,以及批处理问题,感谢您的观看
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值