概念
JDBC:Java DataBase Connectivity (Java 数据库连接), Java语言操作数据库 。
JDBC本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
步骤
添加maven依赖
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
或者直接导入驱动jar包。
注册驱动
//加载MySql驱动
Class.forName("com.mysql.jdbc.Driver")
获取数据库连接对象 Connection
为了方便,可以从properties文件中加载连接参数。
示例:
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class TestDB {
public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
Properties properties = new Properties();
InputStream path = TestDB.class.getResourceAsStream("/database.properties");
properties.load(path);
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
Class.forName(driver); //加载MySQL驱动
Connection conn = DriverManager.getConnection(url, user, password);
}
}
执行SQL语句
在执行SQL语句前,首先需要创建一个Statement对象。
Statement stat = conn.createStatement();
接着把要执行的SQL语句放入字符串中,例如:
String command = "UPDATE Books SET price = price - 5.00";
然后,调用executeUpdate
方法:
stat.executeUpdate(command); //返回受影响的行数
执行查询时使用executeQuery
方法,会返回一个ResultSet
类型的对象,通过它来遍历所查询的结果:
while (rs.next){
...
}
预备语句
我们没有必要在每一次查询时都建立新的查询语句,而是可以准备一个带有变量的查询语句,每次查询时填入不同的字符串就可以反复使用。在预备语句中,每个变量都用 “?” 来表示。例如:
String publisherQuery = "SELECT Books.Price,Books FROM Books,Publishers"
+"WHERE Books.Publisher_Id = Publishers.Publisher_Id AND Publishers.Name = ?";
PreparedStatement stat = conn.prepareStatement(publisherQuery);
在执行预备语句之前,必须使用set
方法将变量绑定到实际值上,针对不同的数据类型有不同的方法,在本例中设置一个字符串值:
stat.setString(1,publisher); //1表示是赋予第一个?的值
使用预备语句还可以防止SQL注入问题。
释放资源
使用完ResultSet、Statement或Connection对象后,应立即调用close
方法。这些对象都使用了规模较大的数据结构,会占用数据库服务器的有限资源。
可以使用带资源的try语句块自动释放资源。
事务
我们可以将一组SQL语句构建成一个事务。当所有语句都顺利执行后,事务可以被提交;否则,如果其中某个语句遇到错误,那么事务将被回滚到为执行过的状态。
默认情况下,数据库连接处于自动提交模式,即每个SQL语句一旦被执行便提交到数据库,无法回滚为原来的值,在使用事务时,要关闭这个默认值:
conn.setAutoCommit(false);
然后按照通常的方式执行SQL语句,如果执行没有出错,,则调用提交方法:
conn.commit();
如果出现错误,则调用:
conn.rollback();
当事务被SQLException异常中断时,典型的办法就是发起回滚操作。
保存点
使用保存点可以更细粒度地控制回滚操作。创建一个保存点意味着稍后回滚会返回这个点,而非放弃整个事务。例如:
Statement stat = conn.createStatement();
stat.excuteUpdate(command1);
Savepoint svpt = conn.setSavepoint(); //会返回到整个点
stat.excuteUpdate(command2);
if(...)
conn.rollback(svpt);
...
conn.commit();
conn.releaseSavepoint(svpt); //不需要时,应该释放它