25.1. Java操作Mysql

25.1.1. JDBC技术

Java中数据库编程是通过JDBC(Java Database Connectivity)实现的。 使用JDBC技术涉及到三种不同的角色:Java官方、开发人员和数据库厂商。

JDBC技术涉及到三种不同的角色 * Java官方提供JDBC接口,如Connection、Statement和ResultSet等。

  • 数据库厂商为了支持Java语言使用自己的数据库,他们根据这些接口提供了具体的实现类,这 些具体实现类称为JDBC Driver(JDBC驱动程序),例如Connection是数据库连接接口,如何能 够高效地连接数据库或许只有数据库厂商自己清楚,因此他们提供的JDBC驱动程序当然是最高 效的,当然针对某种数据库也可能有其他第三方JDBC驱动程序。
  • 对于开发人员而言,JDBC提供了一致的API,开发人员不用关心实现接口的细节。

25.1.2. 建立数据连接

HelloWorld.java

package com.a51work;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class HelloWorld {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("驱动程序加载成功...");
        } catch (
                ClassNotFoundException e) {
            System.out.println("驱动程序加载失败...");
            // 退出
            return;
        }

        String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
        String user = "root";
        String password = "admin#123";
        try (
                Connection conn = DriverManager.getConnection(url, user, password)) {
            System.out.println("数据库连接成功:" + conn);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

读取配置文件示例

package com.a51work;

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

public class JDBCUtilsV3 {
    private Connection conn2;       //连接对象
    private PreparedStatement pst;
    private ResultSet rst;

    private static String DRIVER;
    private static String URL;
    private static String USER;
    private static String PASSWORD;

    static {
        Properties pt = new Properties();
        try {
            FileInputStream in = new FileInputStream("resources/config.properties");
            pt.load(in);
            DRIVER = pt.getProperty("driver");
            URL = pt.getProperty("url");
            USER = pt.getProperty("user");
            PASSWORD = pt.getProperty("password");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接方法
     *
     * @return
     */
    public static Connection getConnection() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {
            Class.forName(DRIVER);
            System.out.println("连接数据库驱动成功.....");

        } catch (ClassNotFoundException e) {
            System.out.println("连接数据库驱动失败.....");
            return conn;
        }

        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println("连接数据库成功......");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            release(conn, pstmt, rs);
        }
        return conn;
    }

    /**
     * 释放资源方法
     *
     * @param conn
     * @param pstmt
     * @param rs
     */
    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        JDBCUtilsV3.getConnection();
    }
}

Java连接Mysql

JdbcUtil.java

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

public class JdbcUtil {
//这个url用来跟数据库建立连接
//localhost 这个是用来建立连接的数据库的ip地址
//3306是要连接的端口,就是数据库绑定的端口
// db这个是要建立连接的数据库的名字
//useUnicode=true&characterEncoding=UTF-8这里使用unicode编码,编码格式是UTF-8,就是跟数据库建立连接的格式
//这个字符集的设置是用来解决中文乱码问题的
    static String url ="jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8";
//这个连接数据库的用户名
    static String username = "root";
//这个是连接数据库的密码
    static String password = "root";
    //注册驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
//得到一个数据库的连接
    public static Connection getConnection() throws Exception{
        return DriverManager.getConnection(url,username,password);
    }
//这个方法用来释放连接
//ResultSet是结果集,从数据库里查询出来的数据会存放在这里
//Statement 这个是用来执行事务,SQL语句的
//Connection是跟数据库之间的连接
    public static void free(ResultSet rs,Statement st,Connection con){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

25.1.3. 数据CRUD操作(MySQL增删改查)

有条件的查询

CRUDSample.java

package com.a51work;

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

public class CRUDSample {
    //连接数据库url
    private static String DRIVER;
    private static String URL;
    private static String USER;
    private static String PASSWORD;

    //创建Properties对象
    static Properties info = new Properties();

    //1.驱动程序加载
    static {
        try {
            FileInputStream in = new FileInputStream("resources/config.properties");
            info.load(in);
            DRIVER = info.getProperty("driver");
            URL = info.getProperty("url");
            USER = info.getProperty("user");
            PASSWORD = info.getProperty("password");
            Class.forName(DRIVER);
            System.out.println("");
            System.out.println("驱动程序加载成功...");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败...");
        } catch (IOException e) {
            System.out.println("加载属性文件失败...");
        }
    }

    //数据有条件查询操作
    public static void read() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 2创建数据库连接
            conn = DriverManager.getConnection(URL, info);
            // 创建语句对象
            pstmt = conn.prepareStatement("select * from student where id =?");
            pstmt.setInt(1,1001);
            rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.printf("id: %d  name:%s\n", rs.getInt(1), rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            release(conn, pstmt, rs);
        }
    }

    /**
     * 释放资源方法
     *
     * @param conn
     * @param pstmt
     * @param rs
     */
    public static void release(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        read();
    }

}

/*
驱动程序加载成功...
id: 1001  name:hujianli
*/

无条件的查询

//数据无条件查询操作
public static void readMaxUserId() {
    int maxId = 0;
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {
        // 2创建数据库连接
        conn = DriverManager.getConnection(URL, info);
        // 创建语句对象
        pstmt = conn.prepareStatement("select max(id) from student");
        rs = pstmt.executeQuery();
        while (rs.next()) {
            System.out.printf("id: %d  \n", rs.getInt(1));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        // 释放资源
        release(conn, pstmt, rs);
    }
}

插入数据

// 插入数据
public static void create() {
    try (Connection conn = DriverManager.getConnection(URL, info);
         PreparedStatement pstmt = conn.prepareStatement("INSERT INTO student(id,name,phone) VALUES(?,?,?)")) {
        int maxId = readMaxUserId();
        System.out.println(maxId);
        pstmt.setInt(1, ++maxId);
        pstmt.setString(2, "xiaojian" + maxId);
        pstmt.setString(3,"1213122344325");
        int affectedRows = 0;
        try {
            affectedRows = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.printf("成功插入%d条数据。\n", affectedRows);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

更新数据

package com.a51work;

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

public class CRUDSample4 {
    //连接数据库url
    private static String DRIVER;
    private static String URL;
    private static String USER;
    private static String PASSWORD;

    //创建Properties对象
    static Properties info = new Properties();

    //1.驱动程序加载
    static {
        try {
            FileInputStream in = new FileInputStream("resources/config.properties");
            info.load(in);
            DRIVER = info.getProperty("driver");
            URL = info.getProperty("url");
            USER = info.getProperty("user");
            PASSWORD = info.getProperty("password");
            Class.forName(DRIVER);
            System.out.println("");
            System.out.println("驱动程序加载成功...");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败...");
        } catch (IOException e) {
            System.out.println("加载属性文件失败...");
        }
    }


    // 更新数据
    public static void update() {
        // 自动释放资源
        try (  // 2创建数据库连接
               Connection conn = DriverManager.getConnection(URL, info);
               // 3.创建语句对象
               PreparedStatement pstmt = conn.prepareStatement("update student set name = ? where id > ?")) {
            // 4.绑定参数
            pstmt.setString(1, "胡建力");
            pstmt.setInt(2, 1001);
            int affectedRows = pstmt.executeUpdate();
            System.out.printf("成功更新%d条数据。\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        update();
    }


}

//驱动程序加载成功...
//        成功更新3条数据。

删除数据

// 删除数据
public static void delete() {
    // 自动释放资源
    try (  // 2创建数据库连接
           Connection conn = DriverManager.getConnection(URL, info);
           // 3.创建语句对象
           PreparedStatement pstmt = conn.prepareStatement("delete from student where name = ?")) {
        // 4.绑定参数
        pstmt.setString(1, "hu");
        // 执行修改(C、U、D)
        int affectedRows = pstmt.executeUpdate();
        System.out.printf("成功删除%d条数据。\n", affectedRows);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}


public static void main(String[] args) {
    delete();
}

数据增删改查(CRUD汇总)

package com.a51work;

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

public class CRUDSample6 {
    //连接数据库url
    private static String DRIVER;
    private static String URL;
    private static String USER;
    private static String PASSWORD;


    //创建Properties对象
    static Properties info = new Properties();

    //1.驱动程序加载
    static {
        try {
            FileInputStream in = new FileInputStream("resources/config.properties");
            info.load(in);
            DRIVER = info.getProperty("driver");
            URL = info.getProperty("url");
            USER = info.getProperty("user");
            PASSWORD = info.getProperty("password");
            Class.forName(DRIVER);
            System.out.println("");
            System.out.println("驱动程序加载成功...");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动程序加载失败...");
        } catch (IOException e) {
            System.out.println("加载属性文件失败...");
        }
    }

    //数据有条件查询操作
    public static void read() {
        try (
            // 2创建数据库连接
            Connection conn = DriverManager.getConnection(URL, info);
            // 3.创建语句对象
            PreparedStatement pstmt = conn.prepareStatement("select * from student where id =?")){
            pstmt.setInt(1,1001);
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.printf("id: %d  name:%s\n", rs.getInt(1), rs.getString("name"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //数据无条件查询操作
    public static int readMaxUserId() {
        int maxId = 0;
        // 自动释放资源
        try (  // 2创建数据库连接
               Connection conn = DriverManager.getConnection(URL, info);
               // 3.创建语句对象
               PreparedStatement pstmt = conn.prepareStatement("select max(id) from student")) {
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                System.out.printf("id: %d  \n", rs.getInt(1));
                maxId = rs.getInt(1);
            }
        } catch (SQLException e) {
            e.printStackTrace();

        }
        return maxId;
    }

    // 插入数据
    public static void create() {
        try (Connection conn = DriverManager.getConnection(URL, info);
             PreparedStatement pstmt = conn.prepareStatement("INSERT INTO student(id,name,phone) VALUES(?,?,?)")) {
            int maxId = readMaxUserId();
            System.out.println(maxId);
            pstmt.setInt(1, ++maxId);
            pstmt.setString(2, "xiaojian" + maxId);
            pstmt.setString(3,"1213122344325");
            int affectedRows = 0;
            try {
                affectedRows = pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.printf("成功插入%d条数据。\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 更新数据
    public static void update() {
        // 自动释放资源
        try (  // 2创建数据库连接
               Connection conn = DriverManager.getConnection(URL, info);
               // 3.创建语句对象
               PreparedStatement pstmt = conn.prepareStatement("update student set name = ? where id > ?")) {
            // 4.绑定参数
            pstmt.setString(1, "胡建力");
            pstmt.setInt(2, 1001);
            int affectedRows = pstmt.executeUpdate();
            System.out.printf("成功更新%d条数据。\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    // 删除数据
    public static void delete() {
        // 自动释放资源
        try (  // 2创建数据库连接
               Connection conn = DriverManager.getConnection(URL, info);
               // 3.创建语句对象
               PreparedStatement pstmt = conn.prepareStatement("delete from student where name = ?")) {
            // 4.绑定参数
            pstmt.setString(1, "hu");
            // 执行修改(C、U、D)
            int affectedRows = pstmt.executeUpdate();
            System.out.printf("成功删除%d条数据。\n", affectedRows);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        create();
        delete();
        update();
        read();
        readMaxUserId();
    }

}