1、JDBC是jdk提供的与数据库连接的接口,其具体实现类由数据库厂商提供。
2、执行基本增删改查的步骤如下:
1、注册驱动 反射技术,将驱动类加入到内容。使用了java.sql.DriverManager类静态方法
registerDriver(Driver driver)
类加载的同时调用它的静态代码块的静态方法:
Class.forName("com.mysql.cj.jdbc.Driver");
2、获得数据库连接 DriverManager类中静态方法
static Connection getConnection(String url, String user, String password)
返回值是Connection接口的实现类
String url = "jdbc:mysql://localhost:3306/zonghe";
String url="jdbc:mysql://localhost:3306/zonghe?
serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true";//链接的mysql
String username="root";
String password="yangjiexing";
Connection con = DriverManager.getConnection(url, username, password);
3、通过数据库连接对象,获取到SQL语句的执行者对象
Statement stat = con.createStatement();
或者使用占位符,防止注入攻击,PreparedStatement是Statement的一个实现子类
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setObject(1, user);
pst.setObject(2, pass);
4、执行SQL语句
Statement类中的主要方法:
ResultSet executeQuery(String sql); //查
int executeUpdate(String sql); //增删改
5、处理ResultSet
ResultSet中的主要方法:
boolean next(); 光标移动一行记录
String getString(String columnLabel);
int getInt(String columnLabel);
Example:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/*
* JDBC技术,查询数据表,获取结果集
*/
public class JDBCDemo1 {
public static void main(String[] args) throws Exception{
//1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获取连接对象
String url = "jdbc:mysql://localhost:3306/zongheserverTimezone=GMT%2B8&useSSL=false";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3 .获取执行SQL 语句对象
Statement stat = con.createStatement();
// 拼写查询的SQL
String sql = "SELECT * FROM sort";
//4. 调用执行者对象方法,执行SQL语句获取结果集
// ResultSet executeQuery(String sql) 执行SQL语句中的select查询
// 返回值ResultSet接口的实现类对象,实现类在mysql驱动中
ResultSet rs = stat.executeQuery(sql);
//5 .处理结果集
// ResultSet接口方法 boolean next() 返回true,有结果集,返回false没有结果集
while(rs.next()){
//获取每列数据,使用是ResultSet接口的方法 getXX方法参数中,建议写String列名
System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+
" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
stat.close();
con.close();
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;
/*
* Java程序实现用户登录,用户名和密码,数据库检查
* 防止注入攻击
* Statement接口实现类,作用执行SQL语句,返回结果集
* 有一个子接口PreparedStatement (SQL预编译存储,多次高效的执行SQL)
* PreparedStatement的实现类数据库的驱动中,如何获取接口的实现类
*
* 是Connection数据库连接对象的方法
* PreparedStatement prepareStatement(String sql)
*/
public class JDBCDemo3 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/mybase";
String username = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, username, password);
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
//执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
//调用Connection接口的方法prepareStatement,获取PrepareStatement接口的实现类
//方法中参数,SQL语句中的参数全部采用问号占位符
PreparedStatement pst = con.prepareStatement(sql);
System.out.println(pst);
//调用pst对象set方法,设置问号占位符上的参数
pst.setObject(1, user);
pst.setObject(2, pass);
//调用方法,执行SQL,获取结果集
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
}
rs.close();
pst.close();
con.close();
}
}
3、自己写一个JDBCUtil工具类用于提供连接对象和关闭资源功能,利用properties配置文件存储数据库连接的信息。
/*
* 实现JDBC的工具类
* 定义方法,直接返回数据库的连接对象
* properties文件存在src目录下,利用类加载器找到bin目录下的配置文件
* 写关闭方法
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con ;
static{
try{
InputStreamin=JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
//获取集合中的键值对
String driverClass=pro.getProperty("driverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(driverClass);
Connection con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex+"数据库连接失败");
}
}
/*
* 定义静态方法,返回数据库的连接对象
*/
public static Connection getConnection(){
return con;
}
public static void close(Connection con,Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
public static void close(Connection con,Statement stat , ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(SQLException ex){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
}