Statement的不足
- 大量的字符串拼接,代码可读性降低
- sql注入
PreparedStatement
预编译(预加载) 接口
- 通过conn获取的对象
- 是statement接口的子接口
- sql语句中可以传参。用?占位,通过setXXX方法来给?赋值
- 提供性能
- 避免sql注入
-------更新数据
@Test
public void test01(){
try {
conn = JDBCUtil.getConnection();
String sql = "UPDATE teacher SET name = ? WHERE id = ?";
//预编译
pstmt = conn.prepareStatement(sql);
//给占位符赋值,按照位置
pstmt.setString(1,"JJ");
pstmt.setInt(2,5);
int i = pstmt.executeUpdate();
System.out.println(i);
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JDBCUtil.newclose(conn,pstmt);
}
}
--------------查询数据
@Test
public void test02(){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConnection();
String sql = "SELECT * FROM scores WHERE s_id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1,5);
rs = pstmt.executeQuery();
while (rs.next()){
int sId = rs.getInt("s_id");
int score = rs.getInt("score");
int cId = rs.getInt("c_id");
System.out.println("学号:" + sId + ",分数:" + score + ",科目号:" + cId);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
JDBCUtil.close(conn,pstmt,rs);
}
}
元数据
- 元数据:表格本身的数据
- 表格的列名,结果集的列名
ResultSetMetaData接口获取元数据的方法
getMetaData() 获取元数据
resultsetmetadata.getColumnName(i);返回第i个列名
metaData.getColumnCount() 获得该结果集的列数
//getMetaData() 获取元数据
ResultSetMetaData metaData = rs.getMetaData();
//获得该结果集的列数
//resultsetmetadata.getColumnName(i);返回第i个列名
//metaData.getColumnCount() 获得该结果集的列数
for (int i = 1; i <= metaData.getColumnCount() ; i++) {
metaData.getColumnName(i);
}
事务
数据库事务:是数据库的特性
Mysql的数据库引擎
- 在MySQL中,只有使用了Innodb引擎的数据库才支持事务
- 事务处理可以用来维护数据的完整性。保证sql语句要么全部执行,要么全部不执行。
- 发生在DML中,增删改。
事务的四大特征ACID
- 原子性 A
- 一个事务,要么全部完成,要么全部不完成。
- 一致性 C
- 在事务开始之前和事务结束之后,数据库的完整性没有被破坏。
- 隔离性 Isolation
- 数据库允许多个事务同时对数据进行处理。每个事务之间是相互隔离。
- 持久性 D
- 事务结束以后,对数据的增删改是永久性的。
术语:提交事务,回滚事务(事务回滚)
- 事务一旦提交,就不可能回滚。
- 当一个连接对象被创建时,默认情况下自动提交事务。
- 关闭连接时,数据会自动提交事务。
操作事务的步骤:
- 关闭事务的自动提交
- true:开启(默认) false:关闭
- conn.setAutoCommit(false);
- 提交事务
- conn.commit();
- 事务回滚:事务提交之前可以进行撤销
- conn.rollback();
当做出增删改操作,把变化发生在内存中,提交事务,才会真正提交给数据库。
面试题
SQL注入:BUG
- 通过字符串的拼接,可以得到一个恒等的sql语句,可以跳出某些判断