JDBC原理及基本操作

落花浮王杯 提交于 2020-01-14 00:24:00

1、JDBC原理

1、JDBC API:提供各种操作访问接口,Connection Statement PreparedStatement ResultSet;
2、JDBC DriverManager:管理不同的数据驱动;
3、各种数据库驱动:相应的数据库厂商提供的数据库驱动,链接直接操作数据库;

2、Java操作数据库(JDBC API)

1、与数据库建立连接;
2、发送SQL语句;
3、返回处理结果;

DriverManager    //管理jdbc驱动
Connection    //连接
Statement   //增删改查
PreparedStatement    //增删改查
CallableStatement    //调用数据库中的 存储过程/存储函数
ResultSet    //返回的结果集

JDBC访问数据库的具体步骤:
a、导入具体的驱动程序,加载具体的驱动类 ;
b、与数据库建立连接 ;
c、发送sql,执行;
d、处理结果集(查询);

数据库                   数据库驱动
MySQL                   ojdbc-x.jar
Oracle					mysql-connector-java-x.jar
SqlServer				sqljdbc-x.jar

3、Java操作MySQL

package jdbc;

import java.sql.*;
//import com.mysql.jdbc.Connection;

public class JDBC {
	private final String URL = "jdbc:mysql://localhost:3306/zhouzhongzhou?serverTimezone=GMT%2B8&useSSL=false";
	private final String USER = "root";
	private final String PWD = "123456";

	private Connection connection;
	private Statement stmt;
	private int count;
	private ResultSet rs;
	public void Util() {
		// a.添加数据库驱动,导入具体的驱动类
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// b、与数据库建立连接
		try {
			connection = DriverManager.getConnection(URL, USER, PWD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// c、发送sql,执行增删改查
		try {
			stmt = connection.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 执行sql
		String sql = "insert into stu values('S_9999','NiuJiu',21,'females')";
		// d、梳理结果
		try {
			count = stmt.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//
		if (count > 0) {
			System.out.println("操作成功!");
		}
		if(stmt!=null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(connection!=null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void Query() {
		//添加具体的数据驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			connection = DriverManager.getConnection(URL,USER,PWD);
			stmt = connection.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		String sql = "SELECT sid,sname,age,gender from stu";
		try {
			rs = stmt.executeQuery(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			while(rs.next()) {
				String id = rs.getString("sid");
				String name = rs.getString("sname");
				int age = rs.getInt("age");
				String gender = rs.getString("gender");
				System.out.println(id +"--"+ name +"--"+ age +"--" + gender);
			}
		} 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(connection!=null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String [] args) {
		JDBC jdbc = new JDBC();
		//jdbc.Util();
		jdbc.Query();
		
	}
}
DriverManager;	//管理jdbc驱动
Connection;	//连接数据库(通过DriverManager产生)

Statement(PreparedStatement);	//增删改查(通过Connection产生)
CallableStatement;	//调用数据库中的 存储过程,存储函数(通过Connection产生)

Result;	 //返回结果集(由Statement,PreparedStatement,CallableStatement产生)

Connection产生的操作数据库对象:
Connection产生Statement对象:createStatement();
Connection产生PreparedStatement对象:prepareStstement();
Connection产生CallableStatement对象:prepareCall();

1、Statement操作数据库:
增删改:executeUpdate();
查询:executeQuery();

ResultSet:  保存结果集,select* from xxxx;
next();   光标下移,判断是否有下一条数据;truefalse
previous();   放回true/false
getXxxx(字段名|位置);    获取具体的字段值

2、PreparedStatement操作数据库:
public interface PreparedStatement extends Statement;
增删改:executeUpdate();
查询:executeQuery();
复制操作:setXxx();

PreparedStatement 和 Statement在使用时的区别:
1、Statement:sql,executeUpdate(sql);
2、PreparedStatement:sql(?,?,?,?);在创建PreparedStatement对象时,将sql预编译  PreparedStatement(sql);  executeUpdate();  setXxx()进行占位符替换!

PreparedStatement 比较 Statement在使用时的优势:
1、可执行预编译操作
stmt:
stmt = connection.createStatement();
String sql = "insert into stu values('String','String',int,'String')";
stmt.executeUpdate(sql);

pstmt: 
String sql = "insert into stu values(?,?,?,?)";
pstmt = connection.preparedStatement(sql);  //预编译SQL
pstmt.setString(1,name);
pstmt.setInt();
....
2、提高性能(例:100次重复增加,只需要编译一次)
stmt:
stmt = connection.createStatement();
String sql = "insert into stu values('String','String',int,'String')";
stmt.executeUpdate(sql); //执行100次

pstmt: 
String sql = "insert into stu values(?,?,?,?)";
pstmt = connection.preparedStatement(sql);  //预编译SQL
pstmt.setString(1,name);
pstmt.setInt();
...
pstmt.executeUpdate(); //执行100次
3、安全性(有效防止sql注入的风险)
pstmt:有效防止sql注入;
sql注入: 将客户端输入的内容 和 开发人员的SQL语句 混为一体;


package 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;

public class PareparedStatementDemo {

	private final String URL = "jdbc:mysql://localhost:3306/zhouzhongzhou?serverTimezone=GMT%2B8&useSSL=false";
	private final String USER = "root";
	private final String PWD = "123456";

	private Connection connection;
	//private Statement stmt;
	private PreparedStatement pstmt;
	private int count;
	private ResultSet rs;
	public void Update() {
		// a.添加数据库驱动,导入具体的驱动类
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// b、与数据库建立连接
		try {
			connection = DriverManager.getConnection(URL, USER, PWD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// c、发送sql,执行增删改查
		/*
		try {
			stmt = connection.createStatement();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// 执行sql
		String sql = "insert into stu values('S_9999','NiuJiu',21,'females')";
		// d、梳理结果
		try {
			count = stmt.executeUpdate(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		*/
		
		String sql = "insert into stu values(?,?,?,?)";
		
		try {
			pstmt = connection.prepareStatement(sql);
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			pstmt.setString(1, "s_0000");
			pstmt.setString(2, "zhangsan");
			pstmt.setInt(3, 45);
			pstmt.setString(4, "male");
		} catch (SQLException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}
		try {
			count = pstmt.executeUpdate();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		//
		if (count > 0) {
			System.out.println("操作成功!");
		}
		if(pstmt!=null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if(connection!=null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public void Query() {
		//添加具体的数据驱动
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			connection = DriverManager.getConnection(URL,USER,PWD);
			String sql = "SELECT sid,sname,age,gender from stu";
			pstmt = connection.prepareStatement(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//String sql = "SELECT sid,sname,age,gender from stu";
		try {
			rs = pstmt.executeQuery();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			while(rs.next()) {
				String id = rs.getString("sid");
				String name = rs.getString("sname");
				int age = rs.getInt("age");
				String gender = rs.getString("gender");
				System.out.println(id +"--"+ name +"--"+ age +"--" + gender);
			}
		} 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(connection!=null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String [] args) {
		PareparedStatementDemo psd = new PareparedStatementDemo();
		//psd.Update();
		psd.Query();
	}
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!