轻松搞定JDBC操作MySQL数据库

JDBC是什么?

JDBC是Java DataBase Connectivity的简称,代表数据库连接。其实是由Java官方(Sun公司)提供的一套操作数据库的接口规范。由各个数据库厂商实现JDBC这套接口,提供数据库驱动包jar文件。

这样我们不需要知道各个数据库的实现原理,只需要通过JDBC这套接口提供的API就可以去操作各种数据库,真正执行的是驱动jar包中的实现类。
在这里插入图片描述

JDBC使用步骤

这里我们以MySQL数据库为例,演示JDBC的使用步骤。先准备好要操作的数据库和表

-- 创建数据库db4
CREATE DATABASE db4;
-- 使用数据库
USE db4;

-- 创建user表
CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(10),
	PASSWORD VARCHAR(20)
)
-- 添加数据
INSERT INTO USER(username,PASSWORD) VALUES('张三','123');
INSERT INTO USER(username,PASSWORD) VALUES('李四','456');
INSERT INTO USER(username,PASSWORD) VALUES('王五','789');
INSERT INTO USER(username,PASSWORD) VALUES('赵六','101');

查询user表所有数据,如下图
在这里插入图片描述

导入MySQL驱动包

1. 在项目模块里新建libs目录
2. 复制mysql-connector-java-5.1.37-bin.jar到libs目录下
3. 选择jar包右键-->Add As Library

注册MySQL驱动

//固定写法
Class.forName("com.mysql.jdbc.Driver");

获取数据库连接

//数据库地址:"jdbc:mysql://localhost:3306/db3"
//用户名:"root"
//密码:"root"
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4", "root", "root");

获取执行SQL语句的Statement对象

Statement stmt = conn.createStatement();

执行sql语句

执行DML(增删改),使用executeUpdate方法;执行DQL(查询表数据),使用executeQuery方法

//添加一条表记录
String insertSQL="INSERT INTO USER(username,PASSWORD) VALUES('田七','987')";
stmt.executeUpdate(insertSQL);

//修改id为1的表记录
String updateSQL="UPDATE USER SET username='wangmaomao' WHERE id=1";
stmt.executeUpdate(updateSQL);

//删除username为'田七'的记录
String deleteSQL="DELETE FROM USER WHERE username='田七'";
stmt.executeUpdate(deleteSQL);

//查收user表中所有的数据
String selectSQL="SELECT * FROM USER";
ResultSet rs = stmt.executeQuery(selectSQL);
//处理结果集,findAll方法在下面
List<User> list = findAll(rs);

处理结果集
查询语句得到的结果是ResultSet结果集,我们定义一个方法来遍历结果集,代码如下。

//处理结果集
public static List<User> findAll(ResultSet rs) throws SQLException {
    //处理结果集
    List<User> list=new ArrayList<>();
    while(rs.next()){
        User user=new User();
        int id = rs.getInt("id");
        String username = rs.getString("username");
        String password = rs.getString("password");
        user.setId(id);
        user.setUsername(username);
        user.setPassword(password);

        list.add(user);
    }
    return list;
}

释放资源

//释放Statement
stmt.close();
//释放Connection连接
conn.close();

执行完上面演示步骤之后,在SQLYog中查询user表中所有数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4a8BNFpy-1591239979652)(<assets/4.1 JDBC-37ad8281.png>)]

JDBCUtil工具类封装

定义配置文件

# MyQL驱动类
driver=com.mysql.jdbc.Driver
# 数据的地址url
url=jdbc:mysql://localhost:3306/db4
# 用户名
username=root
# 密码
password=root

封装JDBCUtils工具类

package com.itheima.jdbc.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBCUtils {
    //MySQL数据库驱动
    public static String driver;
    //MySQL数据库地址
    public static String url;
    //MySQL数据库用户名
    public static String username;
    //MySQL数据库密码
    public static String password;

    //白话:只要使用本工具类,静态代该处码块就会执行
    static{
        try {


            //读取配置文件
            Properties pro=new Properties();
            //获取src目录下jdbc.properties的输入流
            InputStream inputStream = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
            pro.load(inputStream);

            //获取配置文件中的属性值
            driver=pro.getProperty("driver");
            url=pro.getProperty("url");
            username=pro.getProperty("username");
            password=pro.getProperty("password");

            //注册驱动,并读取配置文件
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据库连接
     * @return
     */
    public static Connection getConnection() 
        throws SQLException {
        Connection conn =
            DriverManager.getConnection(url, username, password);
        return conn;
    }

    /**
     * 释放资源
     * @param conn  数据库连接
     * @param statement  数据库执行者
     */
    public static void close(Statement statement,Connection conn){
        close(null,statement,conn);
    }

    /**
     * 释放资源
     * @param conn  数据库连接
     * @param statement  数据库执行者
     */
    public static void close(ResultSet resultSet,Statement statement,Connection conn){
      if(resultSet!=null){
          try {
              resultSet.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
      if(statement!=null){
          try {
              statement.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
      if(conn!=null){
          try {
              conn.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }
    }
}

用户登录&SQL注入

package com.itheima.jdbc.demo;
import com.itheima.jdbc.utils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;

public class JDBCDemo1 {
    public static void main(String[] args) throws SQLException {
        Connection conn = JDBCUtils.getConnection();
        //获取执行sql的Statement对象
        Statement statement = conn.createStatement();
        //键盘录入用户名和密码
        Scanner sc=new Scanner(System.in);
        System.out.println("键盘录入用户名");
        String username = sc.nextLine();
        System.out.println("键盘录入密码");
        String password = sc.nextLine();

        //执行sql语句
        String sql=
            "select * from user where username='"+username
            +"' AND "+"password='"+password+"'";
        System.out.println(sql);
        ResultSet rs = statement.executeQuery(sql);

        if(rs.next()){
            System.out.println("登录成功");
        }else{
            System.out.println("登录失败");
        }

        rs.close();
        statement.close();
        conn.close();
    }
}

键盘录入的时SQL注入,导致任意的用户名和密码都能登录成功。
在这里插入图片描述

用户登录&预处理Statement

package com.itheima.jdbc.demo;

import com.itheima.jdbc.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class JDBCDemo2 {
    public static void main(String[] args)  {
        Connection conn = null;
        PreparedStatement preStmt =null;
        try {
            //获取数据库连接
            conn = JDBCUtils.getConnection();

            //键盘录入用户名和密码
            Scanner sc=new Scanner(System.in);
            System.out.println("键盘录入用户名");
            String username = sc.nextLine();
            System.out.println("键盘录入密码");
            String password = sc.nextLine();

            //获取预处理的Statement
            String sql=
                "select * from user where username=? password=?";
            preStmt =conn.prepareStatement(sql);
            //设置用户名,给第一个? 赋值
            preStmt.setObject(1,username);
            //设置密码,给第二个? 赋值
            preStmt.setObject(2,password);
            //执行sql语句,获取结果集
            ResultSet rs = preStmt.executeQuery();

            //如果next()为true,说明查询到改用户名和密码
            if(rs.next()){
                System.out.println("登录成功");
            }else{
                System.out.println("登录失败");
            }
        } catch (SQLException e) {
            System.out.println("登录失败,sql语句不正确");
        }finally {
            //释放资源
            JDBCUtils.close(conn,preStmt);
        }
    }
}

执行上面代码,验证登录
在这里插入图片描述

JDBC事务管理

Connection连接对象,提供了事务管理相关的方法,这里我们掌握以下3个方法

public void setAutoCommit(boolean flag)
	当flag设置为false时,表示开启事务。
public void commit()
	调用此方法提交事务,数据会持久化更新
public void rollback()
	当出问题时回滚事务,数据会回到开启事务之前的状态

JDBC事务代码演示

public class JDBCDemo4 {
    public static void main(String[] args) {
        PreparedStatement pstmt =null;
        Connection conn =null;
        ResultSet rs =null;
        try {
            conn = JDBCUtils.getConnection();

            //开启事务
            conn.setAutoCommit(false);

            PreparedStatement p1 = conn.prepareStatement("update account set balance=balance-500 where id=?");
            p1.setInt(1,1);
            p1.executeUpdate();
						//这里故意演示一个问题 sql语句里有一些错误的代码xxx
						//PreparedStatement p2 = conn.prepareStatement("update account xxx set balance=balance+500 where id=?");
						PreparedStatement p2 = conn.prepareStatement("update account set balance=balance+500 where id=?");
            p2.setInt(1,2);
            p2.executeUpdate();

            //提交事务
            conn.commit();

        } catch (SQLException e) {
            e.printStackTrace();
            //如果有问题,回滚事务
            try {
                System.out.println("出问题了,回滚事务...");
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        } finally {
            JDBCUtils.close(rs,pstmt,conn);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值