1、预处理 解决sql注入问题
- 普通的Statement使用字符串拼接执行sql语句,因此在执行动态sql语句时,用户如果了解sql语言的语法,可以根据语法传入与SQL语句有关的导致输入任何用户名即可登录的情况,称为SQL注入。
- PreparedStatement使用set方法设置动态SQL语句的参数,会进行预处理,解决了sql注入的问题。
1、SQL批处理
- 概念:一次执行多条SQL语句,在连接串带上rewriteBatchedStatements=true 是真正的批处理,否则是伪批处理,实际还是一条语句SQL语句慢慢执行,速度慢,效率低。
- addBatch(String sql) //添加到批处理
- executeBatch() //执行批处理
- clearBeach() //清空批处理
Statement批处理: 适用多条不同的sql语句同时执行
PreparedStatement: 适用多条相同的sql语句,同时执行
2、DB工具类
- 在静态代码块中从配置文件中读取信息
private static String url;
private static String user;
private static String password;
//静态代码块初始化信息
static {
//从配置文件加载信息
Properties ps;
try {
InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
ps = new Properties();
ps.load(is);
url=ps.getProperty("url");
user=ps.getProperty("user");
password=ps.getProperty("password");
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
- 封装数据库连接
//获取数据库连接
public static Connection getConnection() {
Connection connection =null;
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return connection;
}
- 提供关闭连接的方法
//关闭所有连接
public static void close(Connection con,Statement stat, ResultSet rs) {
close(con);
close(stat);
close(rs);
}
//关闭一个AutoCloseable
public static void close(AutoCloseable cls) {
if(cls!=null) {
try {
cls.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、DML封装
- 写一个方法,传入sql语句,和一个可变参数,来调用执行这个DML的SQL语句
//传入参数并,执行DML语句
public static boolean executeDML(String sql,Object...obj) throws SQLException {
//获取连接
Connection con = DBUtil.getConnection();
//获取Statement对象
PreparedStatement ps = con.prepareStatement(sql);
//设置参数
setParams(ps, obj);
return ps.executeUpdate() > 0;
}
//设置sql语句中的参数
private static void setParams(PreparedStatement ps,Object...obj) throws SQLException {
if(obj!=null) {
for(int i=0;i<obj.length;i++) {
ps.setObject(i+1, obj[i]);
}
}
}