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(); 光标下移,判断是否有下一条数据;true、false
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();
}
}
来源:CSDN
作者:不想写博客ト
链接:https://blog.csdn.net/weixin_45892170/article/details/103949987