0
点赞
收藏
分享

微信扫一扫

JDBC 数据库操作

八卦城的酒 2022-02-12 阅读 111

一、引言

1.1 如何操作数据库

客户端操作数据库步骤
在这里插入图片描述

1.2 实际开发中,会采用客户端操作数据库吗?

二、JDBC (Java Database Connectivity)

2.1 什么是 JDBC?

2.2 JDBC 核心思想

核心思想
在这里插入图片描述

2.2.1 Mysql 数据库驱动

2.2.2 JDBC API

类型权限定名简介
classjava.sql.DriverManager管理多个数据库驱动类,提供了获取数据库连接的方法
interfacejava.sql.Connection代表一个数据库连接(当 connection 不是 null 时,表示已连接数据库)
interfacejava.sql.Statement发送 SQL 语句到数据库工具
interfacejava.sql.ResultSet保存 SQL 查询语句的结果数据(结果集)
classjava.sql.SQLException处理数据库运用程序时所发生的异常

2.3 环境搭建

三、JDBC 开发步骤【重点

3.1 注册驱动

Class.forName("com.mysql.cj.jdbc.Driver");

3.2 连接数据库

DriverManager.getConnection("jdbc:mysql://localhost:3306/day17","root","199610fan");
  • URL(Uniform Resource Locator)统一资源定位符:由协议、IP、端口、SID(程序实例名称)组成

3.3 获取发送 SQL 对象

Statement statement = connection.createStatement();

3.4 执行 SQL 语句

Statement statement = connection.createStatement();

String sql = "INSERT INTO users(user_id,user_name,user_pwd,user_realname,user_img) VALUES(12,'luogenhua','199610','罗根华','ing.jpg')";

int result = statement.executeUpdate(sql);
  • 注意:在编写 DML 语句时,一定要注意字符串参数的符号是单引号 ‘值’
  • DML 语句:增删改时,返回受影响行数(int 类型)
  • DQL 语句:查询时,返回结果数据(ResultSet 结果集)

3.5 处理结果

if(result == 1){
  System.out.println("Success");
}
  • 受影响行数:逻辑判断,方法返回
  • 查询结果集:迭代、一次获取

3.6 释放资源

statement.close();
connection.close();

3.7 整个代码

import com.mysql.jdbc.Driver;

import java.sql.*;

public class JDBCTest {
  public static void main(String[] args) throws ClassNotFoundException, SQLException {
      //1、加载驱动 加载驱动
      Class.forName("com.mysql.cj.jdbc.Driver");

      String url = "jdbc:mysql://localhost:3306/day17";
      String user = "root";
      String password = "199610fan";

      //2、获得连接
      Connection connection = DriverManager.getConnection(url, user, password);

      if (connection != null){
        System.out.println("连接成功");
      }else {
        System.out.println("连接失败");
      }

      //3、获得执行 sql 语句的对象
      Statement statement = connection.createStatement();


      //4、编写 sql 语句,并执行语句
      String sql = "INSERT INTO users(user_id,user_name,user_pwd,user_realname,user_img) 			           VALUES(12,'luogenhua','199610','罗根华','ing.jpg')";

      int i = statement.executeUpdate(sql);

      //5、处理接收结果
      if (i == 1){
        System.out.println("执行成功");
      }else {
        System.out.println("执行失败");
      }

      //6、释放资源,先开后关
      statement.close();
      connection.close();
    }
}

四、ResultSet(结果集)

4.1 接收结果集

ResultSet resultSet = statement.executeQuery(SELECT * FROM USERS);

4.2 遍历 ResultSet 中的数据

boolean next = resultSet.next();

4.3 遍历方法

int getInt(int columnIndex)
int getInt(String columnLabel)
...
String getString(int columnIndex)
String getString(String columnLabel)
...

4.4 整个代码

package com.luo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class QueryJdbc {
    public static void main(String[] args) throws Exception {
        //1 加载驱动 加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/day17";
        String user = "root";
        String password = "199610fan";

        //2 获得连接
        Connection connection = DriverManager.getConnection(url, user, password);

        if (connection != null){
            System.out.println("连接成功");
        }else {
            System.out.println("连接失败");
        }

        //3 获得执行 sql 语句的对象
        Statement statement = connection.createStatement();

        // 4 编写 sql 语句 并执行
        String sql = "SELECT * FROM USERS";
        ResultSet resultSet = statement.executeQuery(sql);

        //5 处理结果
        // 判断是否有数据
        while (resultSet.next()){
            String user_id = resultSet.getString("user_id");

            String user_name = resultSet.getString("user_name");

            String user_pwd = resultSet.getString("user_pwd");

            String user_realname = resultSet.getString("user_realname");

            String user_img = resultSet.getString("user_img");

            System.out.println(user_id+"\t"+user_name +"\t"+ user_pwd +"\t"+ user_realname +"\t"+ user_img);
        }

        // 6 释放资源,先开后关
        statement.close();
        connection.close();
    }
}

五、常见错误

六、综合案列【登入】

6.1 创建一张表

CREATE TABLE user(
		id INT PRIMARY KEY AUTO_INCREMENT,
		username VARCHAR(20) UNIQUE NOT NULL,
		password VARCHAR(20) NOT NULL,
		phone VARCHAR(11)
);

6.2 实现登入

package com.luo;

import java.sql.*;
import java.util.Scanner;

public class LogJdbc {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入用户名:");

        String username = scanner.next();

        System.out.print("请输入密码:");

        String pwd = scanner.next();

        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/day14";
        String user = "root";
        String password = "199610fan";

        Connection connection = DriverManager.getConnection(url, user, password);

        Statement statement = connection.createStatement();

        String sql = "select * from user where username = '"+username+"' and password = '"+pwd+"'";

        ResultSet resultSet = statement.executeQuery(sql);

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

        statement.close();
        connection.close();

    }
}

七、SQL 注入问题

7.1 什么是 SQL 注入

7.2 如何避免 SQL 注入

八、PreparedStatement【重点】

8.1.1 参数标记

// 预编译 SQL 语句
PreparedStatement pstmt = connection.prepareStatement("select * from user where username = ? and password = ?");
  • 注意:JDBC 中的所有参数都是由 ? 符号占位,这被称为参数标记。在执行 SQL 语句之前,必须为每个参数提供值

8.1.2 动态参数绑定

PreparedStatement pstmt = connection.prepareStatement("select * from user where username = ? and password = ?");

pstmt.setString(1,username);
pstmt.setString(2,pwd);

8.1.3 整个代码

package com.luo;

import java.sql.*;
import java.util.Scanner;

public class PrepareStatement {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);

        System.out.print("请输入用户名:");

        String username = scanner.next();

        System.out.print("请输入密码:");

        String pwd = scanner.next();

        Class.forName("com.mysql.cj.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/day14";
        String user = "root";
        String password = "199610fan";

        Connection connection = DriverManager.getConnection(url, user, password);

        // 预编译 SQL 语句
        PreparedStatement pstmt = connection.prepareStatement("select * from user where username = ? and password = ?;");

        pstmt.setString(1,username);
        pstmt.setString(2,pwd);

        ResultSet resultSet = pstmt.executeQuery();

        if (resultSet.next()){
            System.out.println("登入成功");
        }else {
            System.out.println("登入失败,用户名或密码错误");
        }

        pstmt.close();
        connection.close();
    }
}

九、封装工具类

9.1 重用性方案

9.2 整儿代码

package com.luo;

import java.sql.*;

public class DBUtils {

    // 类加载,只加载一次
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //1.获取连接
    public static Connection getConnection(){

        String url = "jdbc:mysql://localhost:3306/day14";
        String user = "root";
        String password = "199610fan";

        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //2、释放资源
    public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){

        try{
            if (connection != null){
                connection.close();
            }
            if (statement != null){
                statement.close();
            }
            if (resultSet != null){
                resultSet.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

9.3跨平台方案

9.3.1 跨平台工具类实现

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/day14
user=root
password=199610fan
package com.luo2;

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

public class DBUtils {
    private static final Properties PROPERTIES = new Properties();
    static {
        InputStream is = DBUtils.class.getResourceAsStream("/db.properties");
        try {
            PROPERTIES.load(is);
            Class.forName(PROPERTIES.getProperty("driver"));
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 获取 Connection 对象
    public static Connection getConnection() {
        Connection connection = null;

        try {
           connection = DriverManager.getConnection(
                                                   PROPERTIES.getProperty("url"),
                                                   PROPERTIES.getProperty("user"),
                                                   PROPERTIES.getProperty("password"));
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    // 关闭 资源 方法
    public static void closeAll(Connection connection, Statement statement, ResultSet resultset){
        if (connection != null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (statement != null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (resultset != null){
            try {
                resultset.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

十、ORM

10.1 实体类(entity):零散数据的载体

10.2 表对应的实体类代码

package com.luo2;

public class User {
    private String id;
    private String username;
    private String password;
    private String phone;

    public User() {
    }

    public User(String id, String username, String password, String phone) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "user{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

10.3 测试类代码

package com.luo2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class TestORM {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<User> list = new ArrayList<User>();

        try {
            connection = DBUtils.getConnection();

            preparedStatement = connection.prepareStatement("select * from user");

            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()){
                String id = resultSet.getString("id");
                String username = resultSet.getString("username");
                String password = resultSet.getString("password");
                String phone = resultSet.getString("phone");

//                System.out.println(id +"\t"+ username +"\t"+ password +"\t"+ phone);

                User user = new User();
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
                user.setPhone(phone);

                // 没遍历一次得到对象,存放在集合里,方便后续的使用
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,resultSet);
        }

        //遍历集合
        for (User u:list) {
            System.out.println(u);
        }
    }
}

十一、DAO 数据访问对象(Data Access Object)

11.1 创建数据库

11.2 数据库代码

CREATE TABLE Person(
	id INT PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(20) NOT NULL,
	age INT NOT NULL,
	bornDate DATE,
	email VARCHAR(20),
	address VARCHAR(20)
)CHARSET=utf8;

11.3 封装实体类

package com.person;

import java.util.Date;

public class Person {

    private int id;
    private String name;
    private int age;
    private Date bornDate;
    private String email;
    private String address;

    public Person() {
    }

    public Person(String name, int age, Date bornDate, String email, String address) {
        this.name = name;
        this.age = age;
        this.bornDate = bornDate;
        this.email = email;
        this.address = address;
    }

    public Person(int id, String name, int age, Date bornDate, String email, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.bornDate = bornDate;
        this.email = email;
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", date=" + bornDate +
                ", email='" + email + '\'' +
                ", address='" + address + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBornDate() {
        return bornDate;
    }

    public void setBornDate(Date date) {
        this.bornDate = date;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

11.4 编写 DaoImpl 类

package com.person;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PersonDaoImpl {
    // 新增方法
    public int insert(Person person){
        Connection connection = null;
        PreparedStatement preparedStatement = null;

        String sql = "insert into person(name,age,borndate,email,address) values(?,?,?,?,?)";

        try {
            connection = DBUtils.getConnection();
            preparedStatement =  connection.prepareStatement(sql);
            preparedStatement.setString(1,person.getName());
            preparedStatement.setInt(2,person.getAge());
            preparedStatement.setDate(3,null);
            preparedStatement.setString(4,person.getEmail());
            preparedStatement.setString(5,person.getAddress());

            int result = preparedStatement.executeUpdate();

            return result;
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,null);
        }
        return 0;
    }

    //根据 id 更新
    public int update(Person person){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
      
        String sql = "update  Person set name = ?,age = ?,bornDate = ?,email = ?,address = ? where id= ?";
        try {

            connection = DBUtils.getConnection();

            preparedStatement = connection.prepareStatement(sql);

            preparedStatement.setString(1,person.getName());
            preparedStatement.setInt(2,person.getAge());
            preparedStatement.setDate(3,null);
            preparedStatement.setString(4,person.getEmail());
            preparedStatement.setString(5,person.getAddress());
            preparedStatement.setInt(6,person.getId());

            int i = preparedStatement.executeUpdate();

            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,null);
        }
        return  0;
    }

    //根据 id 删除
    public int delete(int id){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        String sql = "delete from Person where id = ?";

        connection = DBUtils.getConnection();

        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,id);

            int i = preparedStatement.executeUpdate();
            return i;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,null);
        }
        return 0;
    }

    // 根据 id 查单个
    public Person select(int id){
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Person person = null;

        String sql = "select * from  Person where id = ?";

        try {
            connection = DBUtils.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1,id);
            resultSet = preparedStatement.executeQuery();

            if (resultSet.next()){
                int pid = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                Date bornDate = resultSet.getDate("bornDate");
                String email = resultSet.getString("email");
                String address = resultSet.getString("address");

                person = new Person();

                person.setId(pid);
                person.setName(name);
                person.setAge(age);
                person.setBornDate(bornDate);
                person.setEmail(email);
                person.setAddress(address);
            }
            return person;

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,resultSet);
        }
        return null;
    }

    // 查所有
    public List<Person> selectAll(){

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Person person = null;
        List<Person> personList = new ArrayList<Person>();

        String sql = "select * from Person";

        connection = DBUtils.getConnection();

        try {
            preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

           while (resultSet.next()){
                   int pid = resultSet.getInt("id");
                   String name = resultSet.getString("name");
                   int age = resultSet.getInt("age");
                   Date bornDate = resultSet.getDate("bornDate");
                   String email = resultSet.getString("email");
                   String address = resultSet.getString("address");

                   person = new Person(pid,name,age,bornDate,email,address);

                   personList.add(person);
               }

           return personList;
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtils.closeAll(connection,preparedStatement,resultSet);
        }
        return null;
    }
}

举报

相关推荐

0 条评论