Java-JDBC
JDBC让java程序可以连接任何提供了JDBC驱动的数据库(Mysql/Oracle/SOL server)。
连接Mysql
连接Mysql需要先添加驱动,把com.mysql.jdbc.Driver
这个字节码加载到JVM中,字节码中的静态代码块会自动执行。(需要导入mysql-connector-java包)
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
添加完驱动就可以获取连接对象了,该方法接收三个参数分别是:链接urrl、用户名、密码。打印出链接对象说明我们已经链接成功。
String url = "jdbc:mysql://localhost:3306/java01";
String user = "root";
String password = "636332";
try {
Connection connection = DriverManager.getConnection(url,user, password);
System.out.println(connection);
} catch (SQLException e) {
e.printStackTrace();
}
// com.mysql.jdbc.JDBC4Connection@53b32d7
操作数据库
我们先以创建一个表为例,需要先创建一个Statement对象,然后通过Statement对象的executeUpdate方法去执行创建的sql语句,并返回结果。执行完成之后释放资源。
String sql = "create table students(id int, name varchar(255), age int)";
Statement statement = null;
try {
statement = connection.createStatement();
statement.executeUpdate(sql);
// 释放资源
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
接下来我们给这个表中插入一条数据,这里执行sql语句的方法也是executeUpdate。
String sql2 = "insert into students value(1, '杨超越', 24)";
statement.executeUpdate(sql2);
接下我们来看一下查询的写法,查询与之前使用的方法不一样,需要使用executeQuery方法执行sql语句。
String sql3 = "select * from students where age = '24'"; //查询总共几条
ResultSet res = statement.executeQuery(sql3);
while (res.next()){
// 打印查出来的数据的name字段
System.out.println(res.getString("name"));
}
事物处理
事物的概念
事物是一个最小的工作单元,可能由几个任务组成,这些任务要么全部执行成功,要么全部都不执行,不能只执行其中一部分。
举个简单的例子:去银行转账,A发起转账的任务,银行进行处理扣除A账户的钱,并给B账户增加响应的钱。B收到钱,一个事物算是完成。不存在A的钱扣除了,因为某种系统的原因,B没有收到转账。
事物的特性
-
原子性:对于数据来说,事物就是最小的单元,不能在进行分割。要么所有操作都成功,要么都不操作。
-
一致性:事物执行成功,所有的变化都有效的应用,一单发生错误,该事物的所有操作都进行回滚到之前的状态。
-
隔离性:事物在执行的过程中是独立的,如果此时又运行同样的事物出现了并发,那么一个事物就要等另一个事物的执行。
-
持久性:事物完成之后,对数据库的修改是永久保持的。
代码实现事务的流程
1、默认情况下,我们执行一条sql语句就是一个事务,执行就会被自动提交,我们需要关闭自动提交。
2、把一个事务要执行的多条sql语句放在一起,如果全部正常执行,手动进行提交。
3、如果一旦发生错误,全部回滚,之前的操作都会被撤销。
上代码
我们先创建一个超级简单的表,
初始表.png
然后用代码操作数据库,不加事务管理的情况下,我们执行两个sql语句,然而a.split("1");
会发生异常,这时就造成了只执行了一条语句。
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String dbUrl = "jdbc:mysql://localhost:3306/java01";
String user = "root";
String password = "636332";
String sql = "update bank set money = 200 where name = 'zhangsan'";
String sql2 = "update bank set money = 100 where name = 'lisi'";
try {
Connection connection = DriverManager.getConnection(dbUrl, user, password);
Statement statement = connection.createStatement();
statement.executeUpdate(sql);
String a = null;
a.split("1");
statement.executeUpdate(sql2);
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
结果如下:
有异常操作后.png很明显这不符合我们事务的特性,我们来加上事务相关代码:
Connection connection = null;
try {
connection = DriverManager.getConnection(dbUrl, user, password);
// 关闭自动提交
connection.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
try {
Statement statement = connection.createStatement();
statement.executeUpdate(sql);
String a = null;
a.split("1");
statement.executeUpdate(sql2);
// 所有sql语句执行完成手动提交
connection.commit();
statement.close();
connection.close();
} catch (SQLException e) {
try {
// 一旦上面操作有异常就回滚
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
这时我们再看数据库,发现两个sql语句都没有执行。如果我们把有异常的a.split("1");
去掉再执行一次。发现都执行成功。