1.什么是JDBC
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
2.数据库驱动
我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数据库打交道。其实也就是数据库厂商的JDBC接口实现,即对Connection等接口的实现类的jar文件。
1、 Statement的使用:
public class TestStatment {
public static void main(String[] args) {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
//1 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获取连接
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");
//3 创建statment对象
statement = connection.createStatement();
//4 执行sql,获取结果集resultSet
resultSet = statement.executeQuery("select * from user");
//5 遍历结果
//resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
while (resultSet.next()) {//遍历行
// 通过结果集resultSet获取响应的数据
System.out.println("id:"+resultSet.getInt("id"));
System.out.println("name:"+resultSet.getString("name"));
}
//更新
int c = statement.executeUpdate("update user set sex='男' where id=2");
//c 影响行数
if(c>0){
System.out.println("更新成功");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
//6 关闭statment
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
//7 关闭连接
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
2、 PreparedStatment的使用
public class TestPreparedStatment {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获取连接
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");
//3 创建statment对象
//参数使用占位符"?"
preparedStatement = connection.prepareStatement("select * from user where id=?");
// 将上面的sql语句中的第一个"?"用数值5代替
preparedStatement.setInt(1,5);
//4 执行sql
resultSet = preparedStatement.executeQuery();
//5 遍历结果
//resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
while (resultSet.next()) {//遍历行
System.out.println("id:"+resultSet.getInt("id"));
System.out.println("name:"+resultSet.getString("name"));
}
//更新
//参数使用占位符?
//preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
preparedStatement = connection.prepareStatement("update user set sex=? where id=?");
// 将上面的sql语句中的第一个"?"用字符串"man"代替
preparedStatement.setString(1,"man");
// 将上面的sql语句中的第二个"?"用数值5代替
preparedStatement.setInt(2,5);
int c = preparedStatement.executeUpdate();
//c 影响行数
if(c>0){
System.out.println("更新成功");
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
//6 关闭statment
try {
// statement.close();
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
//7 关闭连接
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3、jdbc事务相关操作
/**
* jdbc事务操作
*/
public class TestTransaction {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1 加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获取连接
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/test", "root", "1111");
//设置事务非自动提交(默认是自动提交)
//开启事务
connection.setAutoCommit(false);
//3 创建statment对象
preparedStatement = connection
.prepareStatement("select * from user where id=? for update");
preparedStatement.setInt(1,5);
//4 执行sql
resultSet = preparedStatement.executeQuery();
//5 遍历结果
//resultSet.next():移动指针,如果指针的位置有值则返回true否则返回false
while (resultSet.next()) {//遍历行
System.out.println("id:"+resultSet.getInt("id"));
System.out.println("name:"+resultSet.getString("name"));
}
//更新
//参数使用占位符?
//preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
preparedStatement = connection
.prepareStatement("update user set sex=? where id=?");
preparedStatement.setString(1,"man1");
preparedStatement.setInt(2,5);
int c = preparedStatement.executeUpdate();
//c 影响行数
if(c>0){
System.out.println("第一个sql更新成功");
}
//更新
//参数使用占位符?
//preparedStatement好处:sql可以预编译,重复利用。提高应用执行速度
preparedStatement.setString(1,"man2");
preparedStatement.setInt(2,6);
c = preparedStatement.executeUpdate();
//c 影响行数
if(c>0){
System.out.println("第二个sql更新成功");
}
// 如果没有异常,则直接提交事务
connection.commit();//提交事务
} catch (SQLException e) {
try {
// 如果上面的代码有异常,则进入catch块中回滚事务
connection.rollback();//回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} catch (ClassNotFoundException e) {
try {
connection.rollback();//回滚事务
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
//6 关闭statment
try {
//statement.close();
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
//7 关闭连接
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}