prepareStatement的使用:
执行插入操作:
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.*;
import java.util.Date;
public class TestInsert {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
// 区别:
// 使用 问号(?) 占位符代替参数
String sql = "insert into users(id, `NAME`, `PASSWORD`, `email`, `birthday`) values(?,?,?,?,?)";
prst = conn.prepareStatement(sql); // 预编译sql,先写sql,然后不执行
// 手动给参数类型
prst.setInt(1, 4);
prst.setString(2, "kuangshen");
prst.setString(3, "123456");
prst.setString(4, "6999@qq.com");
// 注意点:sql.Date 数据库
// java.util.Date JAVA 获得时间戳
prst.setDate(5, new java.sql.Date(new Date().getTime()));
// 执行
int i = prst.executeUpdate();
if (i>0) {
System.out.println("插入成功");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(conn, prst, rs);
}
}
}
执行删除操作:
public class TestDelete {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
// 区别:
// 使用 问号(?) 占位符代替参数
String sql = "delete from users where `id`= ?";
prst = conn.prepareStatement(sql); // 预编译sql,先写sql,然后不执行
// 手动给参数赋值
prst.setString(1, "4");
//执行
int i = prst.executeUpdate();
if (i>0) {
System.out.println("删除成功");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(conn, prst, rs);
}
}
}
执行更新操作:
public class TestUpdate {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
// 区别:
// 使用 问号(?) 占位符代替参数
String sql = "update users set `name`=? where id = ?";
prst = conn.prepareStatement(sql); // 预编译sql,先写sql,然后不执行
// 手动给参数赋值
prst.setString(1, "xiaodong");
prst.setInt(2, 1);
//执行
int i = prst.executeUpdate();
if (i>0) {
System.out.println("更新成功");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(conn, prst, rs);
}
}
}
执行查询操作:
public class TestSelect {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement prst = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
//预编译sql
String sql = "select * from users where `name` = ?";
prst = conn.prepareStatement(sql);
// 手动给参数赋值
prst.setString(1, "xiaodong");
// 执行
rs = prst.executeQuery();
if (rs.next()){
System.out.println(rs.getString("NAME"));
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JdbcUtils.release(conn, prst, rs);
}
}
}
prepareStatement防止SQL注入:
public class SQL注入 { public static void main(String[] args) { //login("lisi", "123456"); //正常 login(" 'or'1 = 1", " 'or'1 = 1"); // SQL注入操作 // 因为使用了PreparedStatement,所以可以防止 } // 登陆业务 public static void login(String username, String password) { Connection conn= null; PreparedStatement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); // 使用编写好的JdbcUtils类中的静态方法获取链接 //PreparedStatement防止SQL注入的本质,把传递进来的参数当作字符 //假设其中存在转义字符,就直接忽略掉,比如‘’会被直接转义 String sql = "SELECT * FROM USERS WHERE `NAME` = ? and `password`= ?"; st = conn.prepareStatement(sql); st.setString(1, username); st.setString(2, password); rs = st.executeQuery(); // 执行sql语句,返回结果是一个结果集 while (rs.next()) { System.out.println(rs.getString("NAME")); System.out.println(rs.getString("password")); System.out.println("======================================="); } } catch (SQLException e) { throw new RuntimeException(e); } finally { JdbcUtils.release(conn, st, rs); // 使用编写好的JdbcUtils类中的静态方法释放资源 } } }