1.sql语句中 查询语句关键字的执行顺序
MySQL语句中,其书写顺序如下:
SELECT [ DISTINCT ] * | 字段 [ 别名 ] [ 字段 [ 别名 ] ] | 统计函数
FROM 表名称 [ 别名 ] , [ 表名称 [ 别名 ] , … ]
[ WHERE 条件 ( s ) ]
[ GROUP BY 分组字段1 [ , 分组字段2 , … ] ]
[ HAVING 分组后的过滤条件 ( 可以使用分组函数 ) ]
[ ORDER BY 排序字段 [ ASC | DESC ] [ 排序字段> [ ASC | DESC ] , … ] ]
而其执行顺序依次为:
FROM
WHERE
GRUOP BY
HAVING
SELECT
ORDER BY
执行顺序思路概要:
→FROM 先拿到要查找信息的表
→ WHERE找到表中自己所要的信息列
→ GROUP BY 有需要进行分组
→ HAVING 筛选分组过后的条件
→ SELECT 选出追中结果中要输出的列
→ ORDER BY 将最终输出的数据进行最后排序
2.HashTable和HashMap的区别
- 线程安全: HashTable是线程安全的,HashMap是线程非安全的。 HashTable的实现方法中添加了synchronized关键字来确保线程同步,因此HashMap性能会高一些。
【无特殊需求建议使用HashMap】- null值问题: HashMap可以使用null作为key,HashTable不可以。
- 父类不同: HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口
- 初始容量不同: HashMap的初始容量为16,HashTable的初始容量为11,两者默认填充因子均为0.75
- 判断键值方法调用: 在判断是否含有某个键值时,HashMap用containsKey()方法,而HashTable使用get()方法。(解释如下)
解释:在HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。
当get()方法返回null值,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。
因此无法用get()方法来判断HashMap中是否存在某个键,二应该用containsKey()方法进行判断。
而HashTable的键值不能为null,所以可以用get()方法来判断是否含有某个键。
3.Statement和PreparedStatement的区别
- PreparedStatement是预编译的,对于批量处理可以大大提高效率,也叫JDBC存储过程
- 数据库只执行一次性存储的时候,用Statement对象进行处理。 PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
- statement每次执行SQL语句,相关数据库都要执行SQL语句的编译,preparedstatement是预编译的,支持批处理。
- preparedstatement对象可以防止SQL注入,而statement不能防止SQL注入。
使用Statement
public static void main(String[] args) throws ClassNotFoundException,SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from tb1");
while(rs.next()){
System.out.println(rs.getString("username")+":"+rs.getInt("age")+":"+rs.getFloat("salary"));
}
rs.close();
st.close();
con.close();
}
使用PreparedStatement
public static void main(String[] args){
try{
//1.注册驱动
class.forName("com.mysql.jdbc.Driver");
//2.获取连接
connection conn = get.Connection("jdbc:mysql://localhost:3306/test","root","123456")
//3.获取预处理对象
String sql = "select * from tb1 where name = ?";
PreparedStatement st = con.prepareStatement
//4.SQL语句占位符设置参数
//索引参数1代表SQL中的第一个?号
st.setString(1,"zhangsan");
//5.执行SQL语句
ResultSet rs = st.executeUpdate();
while(rs.next()){
System.out.println(rs.getString("username")+":"+rs.getInt("age")+":"+rs.getFloat("salary"));
}//6.释放资源
} catch (SQLException e){
e.printStackTrace();
}
}