preparedStatement和Statement区别
2020-06-03 本文已影响0人
Time一柒
/**
* 查询方法
* @param sql 执行的sql
* @return ListMap
*/
public static List<Map<String, Object>> MysqlSelectWhereList(String sql){
List<Map<String,Object>> list = new ArrayList<>();
try
{
Class.forName(driver);//加载驱动程序
Connection c =DriverManager.getConnection(url,user,password);//连接数据库
if(!c.isClosed())
System.out.println("成功链接数据库!");
// 使用Statement对象
// 使用范围:当执行相似SQL(结构相同,具体值不同)语句的次数比较少
// 优点:语法简单
// 缺点:采用硬编码效率低,安全性较差。
// 原理:硬编码,每次执行时相似SQL都会进行编译
Statement statement =c.createStatement();//操作数据库
// 预编译PreparedStatement
// 使用范围:当执行相似sql语句的次数比较多(例如用户登陆,对表频繁操作..)语句一样,只是具体的值不一样,被称为动态SQL
// 优点:语句只编译一次,减少编译次数。提高了安全性(阻止了SQL注入)
// 缺点: 执行非相似SQL语句时,速度较慢。
// 原理:相似SQL只编译一次,减少编译次数
PreparedStatement ps = c.prepareStatement(sql);//这里使用了prepareStatement()方法//操作数据库
ps.setString(1, "");//这里设置?的值 1对应第一个?
ps.setString(2, "");
//String sql ="select * from register_followyangxingpatient";//要执行的sql语句
ResultSet rs=statement.executeQuery(sql);
ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();
while(rs.next()){
Map<String,Object> rowData = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
rowData.put(md.getColumnName(i), rs.getObject(i));
}
list.add(rowData);
}
rs.close();
c.close();
//System.out.println(list);
return list;
}
catch(ClassNotFoundException e)
{
System.out.println("对不起,找不到驱动程序!");
e.printStackTrace();
return list;
} catch(SQLException e) {
e.printStackTrace();
return list;
}
}