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
步骤:
- 加载驱动
- 连接数据库 DriverManager
- 获得执行SQL的对象 Statement
- 获得返回的结果集
- 释放连接
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);
}
}
}