介绍了一些数据库知识,及其数据库在java中的使用知识
1、阐述JDBC操作数据库的步骤?
- 加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
- 创建连接
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "scott", "tiger");
- 创建语句
PreparedStatement ps = con.prepareStatement("select * from emp where sal between ? and ?");
ps.setInt(1, 1000);
ps.setInt(2, 3000);
- 执行语句,获得结果集
ResultSet rs = ps.executeQuery();
- 处理结果
while(rs.next()) {
System.out.println(rs.getInt("empno") + " - " + rs.getString("ename"));
}
- 关闭资源
finally {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
提示:关闭外部资源的顺序应该和打开的顺序相反,也就是说先关闭ResultSet、再关闭Statement、在关闭Connection。上面的代码只关闭了Connection(连接),虽然通常情况下在关闭连接时,连接上创建的语句和打开的游标也会关闭,但不能保证总是如此,因此应该按照刚才说的顺序分别关闭。此外,第一步加载驱动在JDBC 4.0中是可以省略的(自动从类路径中加载驱动),但是我们建议保留。
2、Statement和PreparedStatement有什么区别?哪个性能更好?
1.PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性).
2.PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全.
3.当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划).
补充:为了提供对存储过程的调用,JDBC API中还提供了CallableStatement接口。存储过程(Stored Procedure)是数据库中一组为了完成特定功能的SQL语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。虽然调用存储过程会在网络开销、安全性、性能上获得很多好处,但是存在如果底层数据库发生迁移时就会有很多麻烦,因为每种数据库的存储过程在书写上存在不少的差别。
3、简述数据库中的事务及其四大特性ACID
。
定义: 指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作单元需要具有原子性, 一致性,隔离性和持久性四个属性,统称为ACID特性
ACID:
-
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败.
-
一致性(Consistent):事务在完成时,必须使所有的数据都保持一致状态.
-
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态或并发执行的事物是相互隔离的,不能项目干扰.
-
持久性(Durable):一旦一个事务提交,它对数据库中数据的改变是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证.
4、小知识
- SqlPlus 启动脚本命令:
@ 脚本路径
- SQL
rtrim()
函数: 返回字符串 str 与尾部的空格字符去掉,TRIM()
: 去除指定字符的前后空格,LTRIM()
: 去除指定字符的前面空格。