2022-8-19 第一组 (≥▽≤) 学习笔记

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语句,可以跳过某些判断
posted @ 2022-08-19 20:56  (≧∇≦)(≧∇≦)(≧∇≦)  阅读(26)  评论(0)    收藏  举报