- 概念:Java DataBase Connecting (Java数据库连接 / Java语言 *** 作数据库)
- JDBC本质:其实是官方(sun公司)定义的一套 *** 作所有关系型数据库的规则,即接口。各个数据库厂商去实现这个接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
- 导入驱动jar包
- 注册驱动 注意:新版本mysql请用:com.mysql.cj.jdbc.Driver
- 获取数据库连接对象(Connection)
- 定义sql语句
- 获取执行sql的对象,Statement
- 执行sql
- 处理结果
- 释放资源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*
JDBC快速入门
*/
public class JDBC_Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//3.获取数据库连接对象
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test", "root", "yyqx0416");
//4.定义sql语句
String sql="update account set balance=500 where id=1";
//5.获取执行sql的对象 Statement
Statement sta = con.createStatement();
//6.执行sql
int i= sta.executeUpdate(sql);
//7.处理结果
System.out.println(i);
//8.释放资源
sta.close();
con.close();
}
}
详解各个对象:
1.DriverManager:驱动管理对象
2.Connection:数据库连接对象
3.statement:执行sql的对象
- 添加数据 insert
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /* account表 添加一条记录 insert语句 */ public class JDBC_Test_inse { public static void main(String[] args) { Connection con=null; Statement sta=null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取Connection对象 con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416"); //3.定义sql语句 String sql="insert into account values(null,'王五',3000)"; //4.获取执行sql的对象 statement sta=con.createStatement(); //5.执行sql int i = sta.executeUpdate(sql); //收到影响的行数 //6.处理结果 System.out.println(i); if(i>0){ System.out.println("添加数据成功!"); }else{ System.out.println("添加失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (SQLException e) { e.printStackTrace(); }finally { //7.释放资源 //避免空指针异常,要先判断需要释放的资源是否为空 if(sta!=null){ try { sta.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
- 修改数据 update
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; /* account表 修改一条记录 update语句 */ public class JDBC_Test2_upda { public static void main(String[] args) { Connection con=null; Statement sta=null; try { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取连接对象 con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416"); //3.定义sql语句 String sql="update account set balance=1500 where id=2"; //4.获取sql执行对象 sta=con.createStatement(); //5.执行sql语句 int i = sta.executeUpdate(sql); //6.处理结果 System.out.println(i); if(i>0){ System.out.println("修改数据成功!"); }else{ System.out.println("修改数据失败!"); } } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (SQLException e) { e.printStackTrace(); }finally { //7.释放资源 if(sta!=null){ try { sta.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
- 删除数据 delete 其实只是修改sql语句即可,其他都与上面两条一样
//3.定义sql语句 String sql="delete from account where id=3";
import java.sql.*;
/*
在ResultSet结果集中获取数据
*/
public class JDBC_Test3_resultset {
public static void main(String[] args) {
Connection con=null;
Statement sta=null;
ResultSet rs=null;
try {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
con= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test","root","yyqx0416");
//3.定义sql语句
String sql="select * from account";
//4.获取sql执行对象
sta=con.createStatement();
//5.执行sql语句
rs = sta.executeQuery(sql);
//6.处理结果
while(rs.next()){
//判断游标的下一行是否有数据,有就打印出来
int id = rs.getInt("id");
String name = rs.getString("name");
int balance = rs.getInt("balance");
System.out.println(id+"---"+name+"---"+balance);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}finally {
//7.释放资源
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
- 练习:
- 前面先从数据库拿到数据,然后新建emp对象,通过对象set方法把数据传给emp对象
- 创建一个与emp表中的变量、类型一一对应的emp类,查询该表,将emp表中的每一条记录当作一个emp对象,将这一条条对象放在集合中
- sql注入问题:用户名随便,密码:a' or 'a' ='a
/*给?赋值*/
pre.setString(1,username);
pre.setString(2,password);
抽取JDBC工具类:JDBCUtil
- 工具类都是静态方法static
- 静态方法:static关键字修饰,在项目启动之前就开始运行 Java静态、构造代码块、构造函数、普通代码块,还在傻傻的分不清?_哔哩哔哩_bilibili彻底弄懂【静态代码块、构造代码块、构造函数、普通代码块 】有什么区别?以及它们之间的执行顺序。https://www.bilibili.com/video/BV11T4y1y7da?spm_id_from=333.337.search-card.all.click
把配置文件需要提前加载的放在静态代码块中
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/*
抽取JDBC工具类:JDBCutils
*/
public class JDBC_Utils {
private static String url;
private static String user;
private static String password;
private static String driver;
//1.静态代码块,在项目启动之前就先执行
/*
文件的读取,只需要读取一次就可以拿到这些值
*/
static{
//读取资源文件,获取值
try {
//1.创建properties集合类
Properties pro=new Properties();
/* 获取src路径下的文件路径---->ClassLoader类加载器
* 使用这个出错原因:文件路径中有中文,使用这个路径必须全为英文*/
/*ClassLoader cl=JDBC_Utils.class.getClassLoader();
URL res= cl.getResource("jdbc.properties");
String path = res.getPath();*/
//2.加载文件
pro.load(new FileReader("E:\\Java项目\\Test\\JavaWeb\\src\\jdbc.properties"));
//3.获取数据,赋值
url= pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
* @throws SQLException
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
/**
* 释放资源
* @param sta 执行sql语句的对象
* @param con 获取连接的对象
*/
public static void close(Statement sta, Connection con){
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* * 释放资源
* @param rs 封装查询结果的结果集对象
* @param sta 执行sql语句的对象
* @param con 获取连接的对象
*/
public static void close(ResultSet rs,Statement sta, Connection con){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(sta!=null){
try {
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
练习:通过键盘录入用户名和密码,判断是否登录成功(存在安全问题)
/* 获取src路径下的文件路径---->ClassLoader类加载器 * 使用这个出错原因:文件路径中有中文,使用这个路径必须全为英文*/ ClassLoader cl=JDBC_Utils.class.getClassLoader(); URL res= cl.getResource("jdbc.properties"); String path = res.getPath();
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
/*
登录练习:通过键盘录入用户名和密码,判断是否登录成功
*/
public class JDBC_Test4_login {
public static void main(String[] args) {
//键盘录入用户名,密码
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
boolean flag = new JDBC_Test4_login().login(username, password);
if(flag){
System.out.println("登录成功!");
}else{
System.out.println("用户名或密码错误!");
}
}
/* 登录方法*/
public boolean login(String username,String password){
if(username==null||password==null){
return false;
}
Connection con=null;
Statement sta=null;
ResultSet re=null;
try {
//连接数据库
con = JDBC_Utils.getConnection();
//定义sql语句
String sql="select * from user where username='"+username+"' and password='"+password+"'";
//获取执行sql语句的对象
sta=con.createStatement();
re= sta.executeQuery(sql);
return re.next(); //下一条语句存在,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JDBC_Utils.close(re,sta,con);
}
return false;
}
}
登录案例(无安全问题)
import java.sql.*;
import java.util.Scanner;
/*
登录练习:通过键盘录入用户名和密码,判断是否登录成功
*/
public class JDBC_Test4_login2 {
public static void main(String[] args) {
//键盘录入用户名,密码
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
boolean flag = new JDBC_Test4_login2().login2(username, password);
if(flag){
System.out.println("登录成功!");
}else{
System.out.println("用户名或密码错误!");
}
}
/* 登录方法*/
public boolean login2(String username,String password){
if(username==null||password==null){
return false;
}
Connection con=null;
PreparedStatement pre=null;
ResultSet re=null;
try {
//连接数据库
con = JDBC_Utils.getConnection();
//定义sql语句
String sql="select * from user where username=? and password=?";
//获取执行sql语句的对象
pre = con.prepareStatement(sql);
/*给?赋值*/
pre.setString(1,username);
pre.setString(2,password);
//查询,不用传参
re = pre.executeQuery();
return re.next(); //下一条语句存在,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
//释放资源
JDBC_Utils.close(re,pre,con);
}
return false;
}
}
JDBC管理事务
在执行 *** 作前开启事务
在 *** 作执行结束后提交事务,若执行过程出现异常,就在catch里进行事务回滚
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)