1.JDBC简介
1.1简介
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。
JDBC库包括与数据库使用相关的API。
-
连接数据库。
-
创建SQL或MySQL语句。
-
在数据库中执行SQL或MySQL查询。
-
查看和修改生成的记录。
1.2JDBC体系结构
JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:
-
JDBC:提供了应用程序到数据库连接规范。
-
JDBC驱动程序: 连接数据库的驱动程序的实现。(一般由数据库实现)
JDBC API使用驱动程序管理器和特定于数据库的驱动程序来提供与异构数据库的透明连接。
1.3JDBC核心组件
Driver:驱动
DriverManager:驱动管理类
Connection:负责连接数据库
Statement:负责执行命令
ResultSet:封装结果集
PrepareStatement:预编译命令
SQLException:此类处理数据库应用程序中发生的任何异常。
2.JDBC的相关SQL语句与基本控制台操作
在用java对数据库数据进行操作时候,必须先将相应jar导入。
2.1 利用SQL中的CRUD(Create, Read, Update, and Delete )对数据库进行操作
创建数据库、创建表格案例:
注意:导入jar包,在项目下创建lib目录,把mysql的jdbc包放入此目录,并添加到build path中(idea是选 Add as library)。
步骤 1.加载驱动 2.获取连接对象 3.获取Statement对象 4.利用SQL语句进行增删改 5.从结果集中提取数据 6.关闭资源
public class JDBC {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mydb1?useSSL=true&characterEncoding=utf8";
String username = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, username, password);
Statement stat = conn.createStatement();
// String sql ="create database mydb1 if not exsits;";
// String sql = "create table `user`(id int primary key,username varchar(20),password varchar(20));";
String sql = "insert into user values(1,'zhangsan','123')";//添加
// String sql = "update user set username='lisi' where id=1;";//更新
// String sql = "delete from user where id=1;";//删除
stat.executeUpdate(sql);
String sql1 = "select * from user where id=1";
ResultSet rs = stat.executeQuery(sql1);//根据查询语句获取结果集
if(rs.next()){
int id = rs.getInt("id");
String user = rs.getString("username");
String pwd = rs.getString("password");
System.out.println(id+" "+user+" "+pwd);
}
rs.close();
stat.close();
conn.close();
System.out.println("执行完毕!");
}
}
2.2 各个数据库的驱动
RDBMS | JDBC驱动程序名称 | 连接字符串格式 |
---|---|---|
MySQL的 | com.mysql.jdbc.Driver | jdbc:mysql://hostname:3306 / databaseName |
ORACLE | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@ hostname:port Number:databaseName |
DB2 | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2:hostname:port Number / databaseName |
SYBASE | com.sybase.jdbc.SybDriver | jdbc:sybase:Tds: hostname:port Number / databaseName |
案例:实现用户登录
public class DbUtils {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
Properties prop = new Properties();
try {
prop.load(new FileReader("src\\db.properties"));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception{
Connection conn = DriverManager.getConnection(url, username, password);
// Statement stat = conn.createStatement();
// String sql = "create table user(id int primary key auto_increment,username varchar(18),password varchar(18),age int,sex char(1));";
// int i = stat.executeUpdate(sql);
// System.out.println(i);
// String sql = "insert into user(username,password,age,sex) values('zhangsan','123456',20,'男');";
// String sql1 = "insert into user(username,password,age,sex) values('lisi','123',26,'男');";
// String sql2 = "insert into user(username,password,age,sex) values('wangwu','123456',30,'男');";
// stat.executeUpdate(sql);
// stat.executeUpdate(sql1);
// stat.executeUpdate(sql2);
Scanner input = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = input.nextLine();
System.out.println("请输入密码:");
String password = input.nextLine();
String sql="select * from user;";
PreparedStatement pstat=conn.prepareStatement(sql);
ResultSet resultSet = pstat.executeQuery();
boolean flag = false;
Integer id=null;;
Integer age=null;
String sex=null;
while (resultSet.next()){
if(username.equals(resultSet.getString("username"))&&password.equals(resultSet.getString("password"))){
id = resultSet.getInt("id");
age = resultSet.getInt("age");
sex = resultSet.getString("sex");
flag=true;
}
}
if(flag){
System.out.println("登录成功!");
System.out.println(id+" "+username+" "+password+" "+age+" "+sex);
}else{
System.out.println("登录失败!");
}
pstat.close();
conn.close();
// stat.close();
}
}
2.3 恶意的SQL注入
它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
为了避免恶意SQL注入,所以引入执行命令PrepareStatement
2.4 PrepareStatement
PrepareStatement是Statement的子接口,提供了一个通用的Statement对象有两个优点附加功能。
作用:1预编译,效率高 2 安全,避免SQL注入
动态的提供参数:
其中问号表示占位符,把SQL语句提交之后要给每个占位符赋值,pstat.setInt(1,25);表示给第一个站位符,赋值25
PreparedStatement pstat = null;
try {
String SQL = "Update Employees SET age = ? WHERE id = ?";
pstat = conn.prepareStatement(SQL);
pstat.setInt(1,25);
pstat.setInt(2,2);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
注意:用完之后要释放资源 pstat.close();
2.5 抽取数据库工具类
DbUtils类功能:1 注册驱动 2 获取连接 3释放资源 4执行命令
```sql
package com.qf.utils;
/**
* 1 注册驱动
* 2 获取连接
* 3 释放资源
* 4 执行SQL 增删改
* @author wgy
*
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DbUtils {
//驱动名称
static String driver="com.mysql.jdbc.Driver";
//url连接字符串
static String url="jdbc:mysql://localhost:3306/school";
//用户名
static String user="root";
//密码
static String password="root";
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
System.out.println("注册驱动失败");
}
}
/**
* 获取连接
* @return
*/
public static Connection getConnection() {
try {
return DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 释放资源
* @param rs
* @param stat
* @param conn
*/
public static void closeAll(ResultSet rs,Statement stat,Connection conn) {
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(stat!=null) {
stat.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 执行命令
* @param sql insert int emp() values(?,?,?,?)
* @param params
*/
public static int executeUpdate(String sql,Object... params) {
try {
Connection conn = getConnection();
PreparedStatement pstat = conn.prepareStatement(sql);
if(params!=null) {
for(int i=0;i<params.length;i++) {
pstat.setObject(i+1, params[i]);
}
}
int count=pstat.executeUpdate();
closeAll(null, pstat, conn);
return count;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}