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())
就实现了和数据库的连接