jdbc-1
认识JDBC
JDBC的本质
就是JAVA访问mysql数据库的一个API。
JDBC访问数据库编码步骤
基本步骤
1:加载一个Driver驱动
2:创建数据库连接(Connection)
3:创建SQL命令发送器Statement
4:通过Statement发送SQL命令并得到结果
5:处理结果(select语句)
6:关闭数据库资源ResultSet Statement Connection
两种方式
不能防止注入攻击
示例
// 有两种方式加载驱动
// Driver driver = new com.mysql.cj.jdbc.Driver();
Class.forName("com.mysql.cj.jdbc.Driver");
// 1.加载驱动
// DriverManager.registerDriver(driver);
String url = "jdbc:mysql://localhost:3306/mytest?serverTimezone=GMT%2B8&useSSL=FALSE&characterEncoding=utf-8";
String user = "root";
String password = "12345";
// 2.创建连接
Connection connection = DriverManager.getConnection(url, user, password);
// 3.创建SQL命令发送器
Statement statement = connection.createStatement();
String sql = "insert into dept values(50,'教学部','北京')";
// 4.发送SQL命令得到结果
int rows = statement.executeUpdate(sql);
System.out.println("影响到的行数是" + rows);
// 5.关闭资源
statement.close();
connection.close();
正常的步骤存在的问题
通过特殊的输入参数,可以改变SQL语句的本意
加入预编译防止注入攻击
1.加载驱动
Class.forName(driver);
2.创建连接
connection = DriverManager.getConnection(url, user,password);
3.sql语句
String sql="select * from account where username = ? and password = ?";
4.发送sql语句
preparedStatement = connection.prepareStatement(sql);
5.设置参数
preparedStatement.setString(1,username );
preparedStatement.setString(2,pwd );
6.执行CURD
resultSet =preparedStatement.executeQuery();
效率问题
开启预编译
useServerPrepStmts是否开启预编译
cachePrepStmts 是否启用预编译缓存
"jdbc:mysql://localhost:3306/mydb?*****&useServerPrepStmts=true&cachePrepStmts=true";
批处理
减少了与数据库的交互次数,效率会大大提高
示例
Class.forName(driver);
connection = DriverManager.getConnection(url, user,password);
String sql="insert into dept values (DEFAULT ,?,?)";
preparedStatement = connection.prepareStatement(sql);//这里已经传入SQL语句
//设置参数
for (int i = 1; i <= 10663; i++) {
preparedStatement.setString(1, "name");
preparedStatement.setString(2, "loc");
preparedStatement.addBatch();// 将修改放入一个批次中
if(i%1000==0){
preparedStatement.executeBatch();
preparedStatement.clearBatch();// 清除批处理中的数据
}
}
/*
* 整数数组中的元素代表执行的结果代号
* SUCCESS_NO_INFO -2
* EXECUTE_FAILED -3
* /
/int[] ints = */
preparedStatement.executeBatch();
preparedStatement.clearBatch();
数据库连接池
解决问题:connection对象的反复创建和销毁,占用资源的问题
事务
认识事务
在逻辑上一组不可分割的操作,由多个sql语句组成,多个sql语句要么全都执行成功,要么都不执行. 原子性 一致性 隔离性 持久性
JDBC中,每条语句执行完毕之后,系统会自动提交。
通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务,在操作完成后调用commit()来进行整体提交
事务的操作步骤
1.设置事务的手动提交
connection.setAutoCommit(false);
2,回滚事务
connection.rollback();
3,提交事务
connection.commit();
设置回滚点
1.设置回滚点的链表
LinkedList
1.设置回滚点
Savepoint savepoint = connection.setSavepoint();
2.添加回滚点
savepoints.addLast(savepoint);
3.回滚
connection.rollback(sp);
浙公网安备 33010602011771号