目录
1.JDBC
- Statement的不足之处
- 大量的字符串拼接,代码可读性降低
- sql注入
- PreparedStatement——预编译(预加载)接口
- 通过Connection获取的对象
- 是Statement的接口的子接口
- sql语句中可以传参。用?占位,通过setxxx的方法来个?赋值
- 提供性能
- 可以避免sql注入
package com.gyc.morning.test;
import com.gyc.morning.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class StudentScoreCourseDao {
/**
* 查询的方法
*/
Connection connection = null;
PreparedStatement statement = null;
List<StudentScoreCourse> list = new ArrayList<>(16);
ResultSet resultSet = null;
String sql = "select stu.name , sc.score ,c.name from student stu left join scores sc " +
"on sc.s_id =stu.id left join course c on sc.c_id = c.id ";
{
connection = JDBCUtil.getConnection();
}
public List<StudentScoreCourse> getAll() {
try {
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
/**
* 查询某一个学生的分数
*/
public List<StudentScoreCourse> getStudent(String name) {
try {
sql = sql + " where stu.`name` = ?";
statement = connection.prepareStatement(sql);
statement.setString(1, name);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
/**
* 查询某一个学生的某一科的分数
*/
public List<StudentScoreCourse> getCourse(String name, String cname) {
try {
sql = sql + " where c.`name` = ? and stu.`name` = ?";
statement = connection.prepareStatement(sql);
statement.setString(1, cname);
statement.setString(2, name);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
/**
* 查询某一个学生的总分
*/
public List<StudentScoreCourse> getCourseSum(String name) {
try {
sql = sql.replace("sc.score", "Sum(sc.score)") + " where stu.`name` = ? ";
statement = connection.prepareStatement(sql);
statement.setString(1, name);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
/**
* 查询某一个学生的平均分
*/
public List<StudentScoreCourse> getCourseAvg(String name) {
try {
sql = sql.replace("sc.score", "Avg(sc.score)") + " where stu.`name` = ?";
statement = connection.prepareStatement(sql);
statement.setString(1, name);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
/**
* 按照总分排序
*/
public List<StudentScoreCourse> getCourseSumSort() {
try {
sql = sql.replace("sc.score", "Sum(sc.score)") +
" group by stu.`name` Order by Sum(sc.score) Desc , stu.id ASC ";
statement = connection.prepareStatement(sql);
resultSet = statement.executeQuery();
while (resultSet.next()) {
list.add(new StudentScoreCourse(resultSet.getString(1),
resultSet.getInt(2), resultSet.getString(3)));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtil.closeConnection(connection, statement, resultSet);
}
return list;
}
}
2.数据库事务
-
数据库的特性
-
MySQL的数据库引擎
- 在mysql中,只有使用了Innodb引擎的数据库才支持事务
- 事务处理用来维护数据的完整性。保证sql语句要么全部执行,要么全部不执行。
- 发生在DML中,增删改
-
事务的四大特征(ACID)
- 原子性——一个事务要么全部完成,要么全部不完成。
- 一致性——在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
- 隔离性——数据库允许多个事务同时对数据进行处理。每个事务之间是互相隔离的。
- 持久性——事务结束以后对数据的增删改是永久性的。
-
提交事务,回滚事务(事务回滚)
- 事务一旦提交,就不能回滚。
- 当一个连接对象被创建时,默认情况是自动提交事务。
- 关闭连接时,数据会自动提交事务。
-
操作事务
-
关闭事务的自动提交
-
new Connection().setAutoCommit(true) //方法 true 开启(默认), false 关闭
-
-
提交事务
-
new Connection().commit() // 事务提交
-
-
事务回滚
-
new Connection().rollback() // 事务回滚 把已经修改的数据撤销
-
-
当做出增删改的时候,数据是在内存中的,只有提交了事务,才会在数据库中体现。
-
面试题
- SQL注入:
- 通过字符串的拼接可以得到一个恒等的sql语句,可以跳过某些判断