java入门篇17 -- JDBC编程

对于读取数据,我们应当如何与数据库打交道呢,这个时候应该使用JDBC,就是java帮助我们实现了操控数据库的一些连接,我们只需要到时候加载一个连接数据库的插件

下面即使java程序的对数据库的增删改查,以及事务处理

import java.sql.*;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        String JDBC_URl = "jdbs:mysql://127.0.0.1:3306/bbsoo";
        String JDBC_USER = "root";
        String JDBC_PASSWORD = "mysql";
        // 查找数据
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            // 方法一使用 Statement
            try (Statement st = conn.createStatement()) {
                // 执行语句
                try (ResultSet rs = st.executeQuery("select user_id, username, user_type from bbs_users;")) {
                    // 判断是否有下一个值
                    while (rs.next()) {
                        int id = rs.getInt(1);
                        String username = rs.getString(2);
                        int user_type = rs.getInt(3);
                        System.out.println("first: user :id" + id + " username:" + username + "user_type:" + user_type);
                    }
                }
            }
            // 方式二 PreparedStatement
            try (PreparedStatement st = conn.prepareStatement("select ?, ?, ? from bbs_users;")) {
                // 在对应位置拼接我们的字符
                st.setObject(1, "user_id");
                st.setObject(2, "username");
                st.setObject(3, "user_type");
                try (ResultSet rs = st.executeQuery()) {
                    while (rs.next()) {
                        int id = rs.getInt(1);
                        String username = rs.getString(2);
                        int user_type = rs.getInt(3);
                        System.out.println("second: user :id" + id + " username:" + username + "user_type:" + user_type);
                    }
                }
            }
        }
        // 插入数据
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            // 准备sql语句
            try (PreparedStatement ps = conn.prepareStatement("INSERT INTO bbs_users (username, user_type) values (?, ?) ")) {
                // 填入对应索引位置的值
                ps.setObject(1, "ming");
                ps.setObject(2, 1);
                // 执行sql语句,返回值表示插入的记录数量
                int n = ps.executeUpdate();
                System.out.println(n);
                // 这个可以抓住插入的那条数据
                try (ResultSet rs = ps.getGeneratedKeys()) {
                    if (rs.next()) {
                        int id = rs.getInt(1); // 获取id
                    }
                }
            }
        }
        // 更新
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            try (PreparedStatement ps = conn.prepareStatement("UPDATE bbs_users SET username=? where id =?")) {
                ps.setObject(1, "ning");
                ps.setObject(2, 1);
                int n = ps.executeUpdate(); // 返回更新的条数
                System.out.println(n);
            }
        }
        // 删除
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            try (PreparedStatement ps = conn.prepareStatement("DELETE FROM bbs_users where id = ?")) {
                ps.setObject(1, 1);
                int n = ps.executeUpdate(); // 返回删除条数
                System.out.println(n);
            }
        }
        // 事务
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            try {
                conn.setAutoCommit(false);
                try (PreparedStatement ps = conn.prepareStatement("DELETE FROM bbs_users where id = ?")) {
                    ps.setObject(1, 1);
                    int n = ps.executeUpdate(); // 返回删除条数
                    System.out.println(n);
                }
                try (PreparedStatement ps = conn.prepareStatement("DELETE FROM bbs_users where id = ?")) {
                    ps.setObject(1, 2);
                    int n = ps.executeUpdate(); // 返回删除条数
                    System.out.println(n);
                }
                conn.commit();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                conn.setAutoCommit(true);
                conn.close();
            }
        }
        // batch, 对于又重复操作,并且可以进行整理数据进行逐条执行,效率较低,可以使用batch
        try (Connection conn = DriverManager.getConnection(JDBC_URl, JDBC_USER, JDBC_PASSWORD)) {
            // 准备sql语句
            try (PreparedStatement ps = conn.prepareStatement("INSERT INTO bbs_users (username, user_type) values (?, ?) ")) {
                // 填入对应索引位置的值
                for (int i = 0; i < 10; i++) {
                    ps.setObject(1, "ming" + i);
                    ps.setObject(2, 1);
                    ps.addBatch(); // 添加到batch中
                }
                // 执行sql语句,返回的是每一条成功数量的数组
                int[] n = ps.executeBatch();
                for (int nn : n) {
                    System.out.println(nn + "success");
                }
            }
        }
    }
}

我们都知道数据库的几大特性:原子性,一致性,隔离性,持久性,那么为了保证数据一致性,在进行多次操作数据库,或者这些数据修改会影响数据库一致性的情况下,一定要开启事务,这样最终失败,可以进行数据回滚,保证数据的一致性

猜你喜欢

转载自www.cnblogs.com/yangshixiong/p/12182662.html