Homework:SQL执行顺序,HashTable与HashMap,Statement与PreparedStatement区别

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的区别

  1. 线程安全: HashTable是线程安全的,HashMap是线程非安全的。 HashTable的实现方法中添加了synchronized关键字来确保线程同步,因此HashMap性能会高一些。
    【无特殊需求建议使用HashMap】
  2. null值问题: HashMap可以使用null作为key,HashTable不可以。
  3. 父类不同: HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口
  4. 初始容量不同: HashMap的初始容量为16,HashTable的初始容量为11,两者默认填充因子均为0.75
  5. 判断键值方法调用: 在判断是否含有某个键值时,HashMap用containsKey()方法,而HashTable使用get()方法。(解释如下)

解释:在HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。
当get()方法返回null值,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。
因此无法用get()方法来判断HashMap中是否存在某个键,二应该用containsKey()方法进行判断。
而HashTable的键值不能为null,所以可以用get()方法来判断是否含有某个键。

3.Statement和PreparedStatement的区别

  1. PreparedStatement是预编译的,对于批量处理可以大大提高效率,也叫JDBC存储过程
  2. 数据库只执行一次性存储的时候,用Statement对象进行处理。 PreparedStatement对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
  3. statement每次执行SQL语句,相关数据库都要执行SQL语句的编译,preparedstatement是预编译的,支持批处理。
  4. 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();
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值