JDBC复习读这一篇就够了!

JDBC全称又叫做Java DataBase Connectivity,就是Java数据库连接,说白了就是用Java语言来操作数据库。

JDBC原理

JDBC主要是用于java连接数据库的,能连接什么数据库没有指定,其实能连接很多种数据库,熟知的就有oracle、mysql和sqlserver。数据库种类太多,为每种数据库定值连接类对于开发人员来说是非常不友好的。于是sun公司那帮人想出了一个办法,sun公司定义一套规则,数据库厂商都按照这个规则来编写自己数据库的底层原理实现API,而开发人员只需要调用其就实现对数据库的访问。这套规则就是JDBC,遵循了JDBC规范数据库厂商编写的数据库的底层原理实现API被称之为驱动。
在这里插入图片描述

连接步骤

  • 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库)
  • 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,使用完必须关闭)
  • 第三步:获取数据库操作对象(专门执行sql语句的对象)
  • 第四步:执行sQL语句(DQL DML…)
  • 第五步:处理香询结果集(只有当第四步执行的是select语句的时才有这一步)
  • 第六步:释放资源(使用完资源之后一定要关闭资源)

例子

public class Main {
    // 数据库连接地址
    private static String JDBC_URL = null;
    // 用户名
    private static String JDBC_USER = null;
    // 密码
    private static String JDBC_PASSWORD = null;
    // 驱动
    private static String Driver = null;
    // 储存学生信息
    private static final List<Student> students = new ArrayList<Student>();

    public static void main(String[] args) throws SQLException, IOException {
        // 读取配置文件
        InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        properties.load(in);
        JDBC_URL = properties.getProperty("JDBC_URL");
        JDBC_USER = properties.getProperty("JDBC_USER");
        JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
        Driver = properties.getProperty("Driver");

        // 注册驱动 利用反射加载静态方法块注册
        try {
            Class.forName(Driver);
        } catch (ClassNotFoundException e) {
            System.out.println("找不到驱动程序类 ,加载驱动失败!");
            e.printStackTrace();
        }

        // 获取连接对象
        try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
            // 需要执行的sql语句
            String sql = "SELECT * FROM student WHERE sdept=?";
            // 获取可执行sql的对象(避免注入攻击)
            try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
                // 设置参数
                preparedStatement.setObject(1, "软件工程");
                // 执行
                try (ResultSet rs = preparedStatement.executeQuery()) {
                    /**
                     * 执行查询 .executeQuery() 查
                     * 返回值 ResultSet结果集
                     * 执行更新 .executeUpdate() 增 删 改
                     * 返回值 int(更新数量)
                     */
                    //遍历结果集,取出数据(.next()返回布尔值)
                    while (rs.next()) {
                        Student student = new Student();
                        student.setSno(rs.getString("Sno"));
                        student.setSname(rs.getString("Sname"));
                        student.setSsex(rs.getString("Ssex"));
                        student.setSage(rs.getInt("Sage"));
                        student.setSdept(rs.getString("Sdept"));
                        students.add(student);
                    }
                }
            }
        }

        // 输出结果
        students.forEach(System.out::println);
//        useBatch(students);
    }
    // 只有参数不同的若干语句可以使用batch执行
    public static void useBatch(List<Student> list) throws SQLException {
        try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
            try (PreparedStatement ps = conn.prepareStatement("INSERT INTO student  VALUES (?, ?, ?, ?, ?)")) {
                // 对同一个PreparedStatement反复设置参数并调用addBatch():
                for (Student s : list) {
                    ps.setString(1, s.getSno() + 1);
                    ps.setString(2, s.getSname());
                    ps.setString(3, s.getSsex());
                    ps.setInt(4, s.getSage());
                    ps.setString(5, s.getSdept());
                    // 添加到batch
                    ps.addBatch();
                }
                // 执行batch:
                int[] ns = ps.executeBatch();
                for (int n : ns) {
                    // batch中每个SQL执行的结果数量
                    System.out.println(n + " inserted.");
                }
            }
        }
    }
}

Student类:

public class Student {
    private String Sno;
    private String Sname;
    private String Ssex;
    private String Sdept;
    private int Sage;

    public String getSno() {
        return Sno;
    }

    public void setSno(String sno) {
        Sno = sno;
    }

    public String getSname() {
        return Sname;
    }

    public void setSname(String sname) {
        Sname = sname;
    }

    public String getSsex() {
        return Ssex;
    }

    public void setSsex(String ssex) {
        Ssex = ssex;
    }

    public String getSdept() {
        return Sdept;
    }

    public void setSdept(String sdept) {
        Sdept = sdept;
    }

    public int getSage() {
        return Sage;
    }

    public void setSage(int sage) {
        Sage = sage;
    }

    @Override
    public String toString() {
        return String.format("{Student: id=%s, name=%s, Sex=%s, age=%d, dept=%s}", this.Sno, this.Sname, this.Ssex, this.Sage, this.Sdept);
    }
}

配置文件:

Driver = com.mysql.cj.jdbc.Driver
JDBC_URL = jdbc:mysql://localhost:3306/learnjdbc?serverTimezone=GMT
JDBC_USER = root
JDBC_PASSWORD = 123456

数据库字段:
![[Pasted image 20201226200008.png]]

数据库连接封装类

public class DBUtil {
    // 数据库连接地址
    private static String JDBC_URL = null;
    // 用户名
    private static String JDBC_USER = null;
    // 密码
    private static String JDBC_PASSWORD = null;
    // 驱动
    private static String Driver = null;

    // 构造方法
    private DBUtil() {
    }

    // 静态代码块,只在类加载的时候执行一次。
    static {
        // 读取配置文件
        InputStream in = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
        Properties properties = new Properties();
        try {
            properties.load(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
        JDBC_URL = properties.getProperty("JDBC_URL");
        JDBC_USER = properties.getProperty("JDBC_USER");
        JDBC_PASSWORD = properties.getProperty("JDBC_PASSWORD");
        Driver = properties.getProperty("Driver");

        try {
            Class.forName(Driver);
        } catch (ClassNotFoundException e) {
            System.out.println("找不到驱动程序类 ,加载驱动失败!");
            e.printStackTrace();
        }
    }
    /**
     * 获取数据库连接对象
     * @throws  SQLException
     * @return 连接对象
     */
    public static Connection getconnection() throws SQLException {
        return DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
    }

    /**
     * 关闭资源
     * @param connection 数据库连接对象
     * @param statement 数据库操作对象
     * @param resultSet 数据库查询结果集
     */
    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

JDBC连接池

有空了在写~~

猜你喜欢

转载自blog.csdn.net/else_tdk/article/details/111768571