Java笔记(十):JDBC

JDBC指Java DataBase Connectivity

它是Java程序访问数据库的标准接口

JDBC连接

Connection代表一个JDBC连接

MySQL的URL是

jdbc:mysql://<hostname>:<port>/<db>?key1=value1&key2=value2

首先我们设置url 用户名 密码

String JDBC_URL = "jdbc:mysql://localhost:3306/test";
String JDBC_USER = "root";
String JDBC_PASSWORD = "liu1997530";

接着获得connection 使用prepareStatement输入sql语句并使用一个结果集来接收

代码如下

import java.sql.*;

public class main {
    public static void main(String[] args) throws SQLException {
        String JDBC_URL = "jdbc:mysql://localhost:3306/test";
        String JDBC_USER = "root";
        String JDBC_PASSWORD = "liu1997530";
        try(Connection conn = DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD)) {
            try (PreparedStatement ps = conn.prepareStatement("SELECT id,study_number,name,math_grade,lec_grade FROM grade")) {
                try (ResultSet rs = ps.executeQuery()){
                    while (rs.next()) {
                        long id = rs.getLong(1);
                        long study_number = rs.getLong(2);
                        String name = rs.getString(3);
                        double math_grade = rs.getDouble(4);
                        double lec_grade = rs.getDouble(5);
                        System.out.println(id);
                        System.out.println(study_number);
                        System.out.println(name);
                        System.out.println(math_grade);
                        System.out.println(lec_grade);
                    }
                }
            }
        }
    }
}

更新

增删查改 那么如何更新呢?需要使用PreparedStatement的占位符

import java.sql.*;

public class main {
    public static void main(String[] args) throws SQLException {
        String JDBC_URL = "jdbc:mysql://localhost:3306/test";
        String JDBC_USER = "root";
        String JDBC_PASSWORD = "liu1997530";
        try(Connection conn = DriverManager.getConnection(JDBC_URL,JDBC_USER,JDBC_PASSWORD)) {
            try (PreparedStatement ps = conn.prepareStatement("INSERT INTO grade (id,study_number,name,math_grade,lec_grade) VALUES (?,?,?,?,?)")) {
                ps.setObject(1,4);
                ps.setObject(2,1004);
                ps.setObject(3,"老六");
                ps.setObject(4,90.5);
                ps.setObject(5,85.6);
                int n = ps.executeUpdate();
                    }
                }
            }
        }

如果数据库的表设置了自增主键,那么在执行INSERT语句时,并不需要指定主键,数据库会自动分配主键。对于使用自增主键的程序,有个额外的步骤,就是如何获取插入后的自增主键的值。

try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {
    try (PreparedStatement ps = conn.prepareStatement(
            "INSERT INTO students (grade, name, gender) VALUES (?,?,?)",
            Statement.RETURN_GENERATED_KEYS)) {
        ps.setObject(1, 1); // grade
        ps.setObject(2, "Bob"); // name
        ps.setObject(3, "M"); // gender
        int n = ps.executeUpdate(); // 1
        try (ResultSet rs = ps.getGeneratedKeys()) {
            if (rs.next()) {
                long id = rs.getLong(1); // 注意:索引从1开始
            }
        }
    }
}

UPDATE和DELETE只存在SQL语句的不同 其他均相同

JDBC事务

类似于同步的概念,多条SQL语句应该全部执行成功,要么全部不执行

如果sql语句是异步的,那么就会出现一条成功,一条失败,数据库的信息就出错了

代码示例

Connection conn = openConnection();
try {
    // 关闭自动提交:
    conn.setAutoCommit(false);
    // 执行多条SQL语句:
    insert(); update(); delete();
    // 提交事务:
    conn.commit();
} catch (SQLException e) {
    // 回滚事务:
    conn.rollback();
} finally {
    conn.setAutoCommit(true);
    conn.close();
}

先关闭自动提交 再完成若干sql语句后 调用conn.commit()提交 再开启自动提交

JDBC连接池

为了避免频繁地创建和销毁JDBC连接,我们可以通过连接池(Connection Pool)复用已经创建好的连接。

目前使用最广泛的是HikariCP。

HikariConfig config = new HikariConfig();
config.setJdbcUrl(JDBC_URL);
config.setUsername(JDBC_USER);
config.setPassword(JDBC_PASSWORD);
config.addDataSourceProperty("connectionTimeout","1000"); //连接超时1s
config.addDataSourceProperty("idleTimeout","60000");//空闲超时60s
config.addDataSourceProperty("maximumPoolSize","10"); //最大连接数
DataSource ds = new HikariDataSource(config);

得到的DataSource就是连接池

接下来得到连接

try (Connection conn = ds.getConnection())

就实现了和数据库的连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值