一、JDBC概述
1.概念 2.作用
二、JDBC快速入门
1.实现步骤 2.查询数据和操作数据 3.SQL注入 4.事务管理 5.Statement与PreparedStatement的区别 6.Batch功能
一、JDBC概述
1.概念
JDBC(Java DataBase Connectivity) java数据库连接。是一套通过java操作数据的公共规范。
2.作用
使JAVA程序连接访问关系型数据库。
二、JDBC快速入门
1.实现步骤
- 导入相关数据库的jdbc驱动包
- 配置数据库连接相关信息
- 通过Class.forName、DriverManager加载驱动并创建Connection对象连接数据库
- 通过Connection对象创建PrepareStatement对象发送sql执行语句到数据库并执行
- 通过PrepareStarement设置参数(若sql没有占位符则跳过)
- 执行sql,获取结果
- 关闭连接
2.查询数据和操作数据
查询数据
public static void main(String[] args) throws Exception {
// 通过properties工具类获取数据库连接信息
String DRIVER = PropertiesUtil.readProerties("src/homework/task1.properties","DRIVER");
String URL = PropertiesUtil.readProerties("src/homework/task1.properties","URL");
String USER = PropertiesUtil.readProerties("src/homework/task1.properties","USER");
String PWD = PropertiesUtil.readProerties("src/homework/task1.properties","PWD");
// 加载驱动
Class.forName(DRIVER);
//创建数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
//发送sql语句到数据库
PreparedStatement pst = conn.prepareStatement("select * from student");
//执行sql语句并返回结果
ResultSet rs = pst.executeQuery();
//提取执行结果
while(rs.next()) {
System.out.println("name: " + rs.getString("stu_name") + " password: " + rs.getString(2));
}
conn.close();// 关闭连接
}
操作数据
public static void main(String[] args) throws Exception {
// 通过properties工具类获取数据库连接信息
String DRIVER = PropertiesUtil.readProerties("src/homework/task1.properties","DRIVER");
String URL = PropertiesUtil.readProerties("src/homework/task1.properties","URL");
String USER = PropertiesUtil.readProerties("src/homework/task1.properties","USER");
String PWD = PropertiesUtil.readProerties("src/homework/task1.properties","PWD");
// 加载驱动
Class.forName(DRIVER);
//创建数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
//发送sql语句到数据库
PreparedStatement pst = conn.prepareStatement("delete from student where stu_id = ? ");
//执行sql语句并返回结果
int i = pst.executeUpdate();
//提取执行结果
if(i>0){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
conn.close();// 关闭连接
}
Connection接口:与特定数据库的连接(会话)。
PreparedStatement接口:表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
ResultSet接口:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。
3.SQL注入
概念
在定义sql时把用户输入的内容作为参数与sql拼接的话,如果用户输入不合理的数据值有可能会导致sql执行异常。
例如:正常的登录sql:
select * from student where stu_name = ? and stu_pwd = ?
,如果用户输入的内容包含 ’ 则会异常。
典型的异常
1' or 1='1
用户不知道密码也可登录
select * from student where stu_name = 1 or 1='1' and stu_pwd = ?
abc' or 1='1' --
用户名和密码都不知道也可登录
select * from student where stu_name = abc or 1='1' -- and stu_pwd = ?
4.事务管理
概念
事务是数据库中非常重要的一个特性,事务属于原子性操作,是数据库执行过程中的一个逻辑单位,要么全部成功要么全部失败。
事务操作
JDBC事务的操作是进行在Connection接口中
方法 | 作用 |
---|---|
.commit() | 事务提交 |
.rollback() | 事务回滚 |
.setAutoCommit(true/false) | 执行是否自动提交事务(默认自动提交) |
5.Statement与PreparedStatement的区别
- PreparedStatement是预编译的,对于多次执行的SQL可以大大提高效率。而Statement不行。
- PreparedStatement可以通过占位符的方式解决SQL注入的问题,而Statement不行。
- 两者SQL的传入位置不同。
// Statement :
Statement statement = conn.createStatement();
String sqlString = " delete from student where stu_name ='张三' ";
statement.executeUpdate(sqlString);
//PreparedStatement :
PreparedStatement updateSales = conn.prepareStatement("delete from student where stu_name ='seven' ");
updateSales.executeUpdate();
6.Batch功能
作用
当执行一行的SQL,不同的参数值(比如插入N条数据)的时候可以使用PreparedStatement的Batch功能。这样不管操作多少条数据都只需要2次网络往返(1次是预存储statement,1次是执行batch命令)。
使用
// PreparedStatement executeBatch code :
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement("insert into student values (?,?,?))";
for (n = 0; n < 100; n++) {
ps.setString(1,n+"");
ps.setLong(2,n+"");
ps.setInt(3,n+"");
ps.addBatch();
}
int [] = ps.executeBatch();
con.commit();
ps.clearBatch();
注意点
- 事务要设置为不自动提交,需批量添加后手动添加。
- 使用时要在url后面加上
rewriteBatchedStatements=true
,否则不生效。
String url="jdbc:mysql://localhost:3306/XXdb?rewriteBatchedStatements=true";