一、JDBC
1.概念:
- 1.Java DataBase Connectivity。 java数据库连接,java语言操作数据库。
- 2.JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
2.快速入门
1.步骤:
- 1.导入驱动jar包
- 1.复制jar包到项目的libs目录下(目录随便起)
- 2.右键---->add as Library
- 2.注册驱动
- 3.获取数据库的连接对象----Connection
- 4.定义sql
- 5.获取执行sql语句的对象----Statement
- 6.执行sql,接收返回结果
- 7.处理结果
- 8.释放资源
2.代码实现:
//1.导入驱动jar包
//2.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//3.获取数据库连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://主机ip:MySQL开放端口/数据库名称", "用户名", "密码");
//4.定义sql语句
String sql = "update account set balance = 500 where id = 1";
//5.获取执行sql的对象 Statement
Statement statement = conn.createStatement();
//6.执行sql
# executeUpdate 执行insert,delete,update语句,返回值为int类型。它返回的是sql语句执行完成后影响的记录条数
int count = statement.executeUpdate(sql);
//7.处理结果
System.out.println(count);
//8.释放资源
statement.close();
conn.close();
3.详解各个对象
- 1.DriverManager: 驱动管理对象
- 1.功能:
- 1.注册驱动:告诉程序该使用哪一个数据库驱动jar包
-
static void registerDriver(Driver driver):注册与给定的驱动程序 DriverManager.
-
写代码使用: Class.forName(“com.mysql.jdbc.Driver”);
-
通过查看源码发现:在com.mysql.jdbc.Driver类中存在静态代码块:
static{ try{ java.sql.DriverManager.registerDriver(new Driver()); } catch(SQLException E){ throw new RuntimeException("Can't register driver!") } }
-
注意:MySQL5之后的驱动jar包可以省略注册驱动的步骤。
-
- 2.获取数据库连接
- 1.方法:static Connection getConnection(String url, String user, String password)
- 2.参数:
- url:指定的连接路径
- 语法:jdbc:mysql://主机ip:MySQL开放端口/数据库名称
- user:用户名
- password:密码
- url:指定的连接路径
- 1.注册驱动:告诉程序该使用哪一个数据库驱动jar包
- 1.功能:
- 2.Connection: 数据库连接对象
- 1.功能:
- 1.获取执行sql的对象
- 1.Statement createStatement()
- 2.PreparedStatement prepareStatement(String sql)
- 2.管理事务
- 1.开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务
- 2.提交事务:commit()
- 3.回滚事务rollback()
- 1.获取执行sql的对象
- 1.功能:
- 3.Statement: 执行sql的对象
- 1.执行sql
- 1.boolean execute(String sql):可以执行任意的sql 了解即可
- 2.int executeUpdate(String sql): 执行DML(insert update delete)语句,也可以执行DDL语句。
- int返回值:返回的是sql语句执行完成后影响的记录条数
- 可以通过这个影响的行数判断DML语句是否执行成功。返回值大于0则执行成功。
- 3.ResultSet executeQuery(String sql):执行DQL(select)语句
- 1.执行sql
- 4.ResultSet: 结果集对象,封装查询结果
- 1.boolean next()方法:游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
- 2.getXxx(参数):获取数据
- Xxx:代表数据类型。 如:int getInt()
- 参数:
- 1.int:代表列的编号,从1开始,不是索引。
- 2.String:代表列名称。
- 3.注意:
- 使用步骤:
- 1.游标向下移动一行
- 2.判断是否有数据
- 3.获取数据
- 使用步骤:
- 5.PreparedStatement: 执行sql的对象
- 1.sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
- 1.输入用户随便,输入密码:a’ or ‘a’ = 'a
- 2.解决sql注入问题:使用PreparedStatement对象来解决
- 3.预编译的sql:参数使用?作为占位符
- 4.步骤:
- 1.导入驱动jar包
- 1.复制jar包到项目的libs目录下(目录随便起)
- 2.右键---->add as Library
- 2.注册驱动
- 3.获取数据库的连接对象----Connection
- 4.定义sql
- 注意:sql的参数使用?作为占位符
- 5.获取执行sql语句的对象----PreparedStatement Connection.preparedStatement(String sql)
- 6.给?赋值:
- 方法:setXxx(参数1,参数2)
- 参数1:?的位置编号,从1开始
- 参数2:?的值
- 方法:setXxx(参数1,参数2)
- 7.执行sql,接收返回结果,不需要传递sql语句
- 8.处理结果
- 9.释放资源
- 1.导入驱动jar包
- 5.注意:后期都会使用PreparedStatement 来完成增删改查的的所有操作
- 1.可以防止sql注入
- 2.效率更高
- 1.sql注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题。
4.抽取JDBC工具类: JDBCUtils
- 1.目的:简化书写
- 2.分析:
- 1.注册驱动的抽取
- 2.抽取一个方法获取连接对象
- 需求:不想传递参数(麻烦),还得保证工具类的通用性
- 解决:使用配置文件 jdbc.properties
- 3.抽取一个方法释放资源
5.JDBC控制事务
- 1.事务:一个包含多个步骤的业务操作。如果这个业操作被事务管理,则这个步骤要么同时成功,要么同时失败。
- 2.操作:
- 1.开启事务
- 2.提交事务
- 3.回滚事务
- 3.适应Connection对象来管理事务
- 1.开启事务:setAutoCommit(boolean autoCommit):调动该方法设置参数为false,即开启事务
- 在执行sql之前开启事务
- 2.提交事务:commit()
- 当所有的sql都执行完提交事务
- 3.回滚事务 :rollback()
- 在catch中回滚事务
- 1.开启事务:setAutoCommit(boolean autoCommit):调动该方法设置参数为false,即开启事务
- 4.代码:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*
事务操作
*/
public class jdbcDemo09 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement1 = null;
PreparedStatement preparedStatement2 = null;
try {
//1.获取连接
connection = JDBCUtils.getConnection();
//开启事务
connection.setAutoCommit(false);
//2.定义sql
//2.1。张三 - 500
String sql1 = "update account set balance = balance - ? where id = ?";
//2.2 李四 + 500
String sql2 = "update account set balance = balance + ? where id = ?";
//3.获取执行sql对象
preparedStatement1 = connection.prepareStatement(sql1);
preparedStatement2 = connection.prepareStatement(sql2);
//4.设置参数
preparedStatement1.setDouble(1,500);
preparedStatement1.setInt(2,1);
preparedStatement2.setDouble(1,500);
preparedStatement2.setInt(2,2);
//5.执行sql
preparedStatement1.executeUpdate();
preparedStatement2.executeUpdate();
//提交事务
connection.commit();
} catch (Exception e) {
//事务回滚
try {
if (connection != null){
connection.rollback();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtils.close(preparedStatement1,connection);
JDBCUtils.close(preparedStatement2,null);
}
}
}