MySQL 数据库-JDBC

1.事务

事务(Transaction):要么都成功,要么都失败
事务原则:ACID原则(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))

  • 原子性:要么都成功,要么都失败
  • 一致性:事务前后的数据完整性要保证一致(如,转账操作后,两个人的总额不变)
  • 持久性:事务一旦提交不可逆,被持久化到了数据库中(事务没提交,恢复到原状态;事务提交了,持久化到数据库的)
  • 隔离性:针对多个用户同时操作,主要排除其他事务对本次事务的影响

脏读:指一个事务读取了另外一个事务未提交的数据
幻读:指在一个事务内读到了别的事务插入的数据,导致前后读取不一致

2.数据库备份

导出:

  • mysqldump -hlocalhost -uroot -pxxx database_name table_name1 table_name2 > path/new.sql
  • mysqldump -hlocalhost -uroot -pxxx database_name > path/new.sql

导入:

  • source path/source.sql(登录情况下)
  • mysql -u用户名 -p密码 库名 < 备份文件

3.JDBC

步骤:

  1. 加载驱动
  2. 连接数据库 DriverManager
  3. 获得执行SQL的对象 Statement
  4. 获得返回的结果集
  5. 释放连接
JDBC 连接代码
import java.sql.*;

public class JdbcFirstDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 1.加载驱动
        Class.forName("com.mysql.jdbc.Driver"); // 固定写法,加载驱动
        // 2.用户信息和 url
        String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf-8&useSSL=true";
        String username = "root";
        String password = "root";
        // 3,连接成功,数据库对象
        Connection connection = DriverManager.getConnection(url, username, password);
        // 4.执行SQL的对象
        Statement statement = connection.createStatement();
        // 5.执行SQL的对象,去执行 SQL,可能存在结果,查看返回结果
        String sql = "select * from users";
        ResultSet resultSet = statement.executeQuery(sql);//返回的结果,结果集中封装了所有结果
        while (resultSet.next()){
            System.out.println("id=" + resultSet.getObject("id"));
            System.out.println("name=" + resultSet.getObject("name"));
            System.out.println("age=" + resultSet.getObject("age"));
            System.out.println("=======================");
        }
        // 6.释放连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

执行SQL对象

statement.executeQuery(sql);// 查询操作
statement.execute(sql);// 执行任何SQL
statement.executeUpdate(sql);//更新、插入、删除都用这个,返回一个受影响的行数

一般将数据库的连接配置都放在 .properties 文件中

4.SQL注入问题

4.1.SQL 代码问题

问题代码:String sql = "select * from users where `NAME`='"+username+"' AND `password` ='"+password+"'";

相当于:username 赋值为 'or 1=1 --+
本质:会将值拼接到SQL语句中

4.2.PreparedStatement 对象

通过预编译防御SQL注入
本质:把传递进来的参数当作字符

防止SQL注入
import java.sql.Connection;
import java.sql.PreparedStatement;

public class SQLInjection {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        try{
            conn = JdbcUtils.getConnection();

            // 使用 ? 占位符代替参数
            String sql = "insert into users(id,name,password) values(?,?,?)";
            st = conn.prepareStatement(sql);// 预编译SQL,先写SQL,然后不执行
            // 手动给参数赋值
            st.setInt(1,1);// id
            st.setString(2,"xiaoming");// name
            st.setString(3,"123456");// password
            // 执行
            int i = st.executeUpdate();
            if (i > 0) System.out.println("插入成功!");
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn, st, null);
        }
    }
}
posted @ 2024-05-27 21:13  落落的学习  阅读(19)  评论(0编辑  收藏  举报