jdbc

JDBC是什么?

JDBC是JavaDataBase Connectivity的缩写,它是Java程序访问数据库的标准接口。使用Java程序访问数据库的时候,Java代码并不是直接通过tcp连接去访问数据库,而是通过jdbc接口访问,而jdbc接口通过jdbc驱动去访问数据库。
在这里插入图片描述
JDBC是一套接口规范,它在哪呢?就在Java的标准库java.sql里放着,不过这里面大部分都是接口。接口并不能直接实例化,而是必须实例化对应的实现类,然后通过接口引用这个实例。那么问题来了:JDBC接口的实现类在哪?
因为JDBC接口并不知道我们要使用哪个数据库,所以,用哪个数据库,我们就去使用哪个数据库的“实现类”,我们把某个数据库实现了JDBC接口的jar包称为JDBC驱动。

Connection

Connection:代表一个jdbc连接,它相当与Java程序到数据库的连接。打开一个Connection时,需要准备URL,用户名,密码才能成功连接到数据库。

jdbc:mysql://localhost:3306/learnjdbc?useSSL=false&characterEncoding=utf8
JDBC连接的url,不同数据库有不同的格式
String JDBC_URL="jdbc:mysql://localhost:3306/test";
String 	JDBC_USER="root";
String JDBC_PASSWORD="password";
//获取连接
Connection conn=DriverManager.getConnection(JDBC_URL,JDBC-USER,JDBC-PASSWORD);
//访问数据库
.....
//关闭连接
conn.close();

JDBC查询

1,通过Connection提供的createStatement()方法创建一个Statement对象,用于执行一个查询。
2,执行Statement对象提供的executQuery(select * from students)并传入sql语句,执行查询并获得返回的结果集,使用一个ResultSet来引用这个结果集。
3,反复调用ResultSet的next()方法并读取每一行结果。

//1
try(Connection conn=DriverManager.getConection(JDBC-URL,JDBC-USER,JDBC-PASSWORD)){
	//2
	try(Statement stmt=conn.createStatement()){
	try(Result rs=stmt.executeQuery("SELECT id, grade, name, gender FROM students WHERE gender=1")){
	while(rs.next()){
	long id=rs.getLong(1);
}
}
	}
}

!!!PreparedStatement可以完全避免SQL注入问题。

插入

插入操作是insert,即插入一条新纪录,通过jdbc进行插入,本质上也是用PreparedStatement执行一条SQL语句。最后executeUpdate();

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

JDBC事务

ACID
Atomicity:原子性
Consistency:一致性
Isolation:隔离性
Durability:持久性

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

JDBC Batch

在JDBC代码中,我们可以利用SQL数据库的这一特性,把同一个SQL但参数不同的若干次操作合并为一个batch执行。我们以批量插入为例,

try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (name, gender, grade, score) VALUES (?, ?, ?, ?)")) {
    // 对同一个PreparedStatement反复设置参数并调用addBatch():
    for (Student s : students) {
        ps.setString(1, s.name);
        ps.setBoolean(2, s.gender);
        ps.setInt(3, s.grade);
        ps.setInt(4, s.score);
        ps.addBatch(); // 添加到batch
    }
    // 执行batch:
    int[] ns = ps.executeBatch();
    for (int n : ns) {
        System.out.println(n + " inserted."); // batch中每个SQL执行的结果数量
    }
}

JDBC连接池

在执行JDBC的增删改查的操作时,如果每一次操作都来一次打开连接,操作,关闭连接,那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接,我们可以通过连接池(Connection Pool)复用已经创建好的连接。
JDBC连接池有一个标准的接口javax.sql.DataSource,注意这个类位于Java标准库中,但仅仅是接口。要使用JDBC连接池,我们必须选择一个JDBC连接池的实现。常用的JDBC连接池有:HikariCP,C3P0,BoneCP,Druid。
1,添加连接池依赖。
2,创建一个DataSource实例,这个实例就是连接池。

HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时:1秒
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize", "10"); // 最大连接数:10
DataSource ds = new HikariDataSource(config);

参考廖雪峰教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值