您的位置:首页 > 职场人生

2017 Java开发面试题-数据库篇(1)

2017-09-11 21:38 387 查看

1、存储过程

--创建

CREATE PROCEDURE pro_name(IN inputName inputType, OUT outputName outputType)

BEGIN
--sql statement...
SELECT ** INTO outputName FROM ** WHERE **
SET outputName = newValue;

END

--调用

set @inputName=value1;

set @outputName=value2;

CALL pro_name(@inputName,@outputName);

--删除

DROP PROCEDURE pro_name;

参数类型:

IN:输入参数

OUT:输出参数

INOUT:既可以输入/输出

2、触发器

CREATE TRIGGER AFTER INSERT/UPDATE/DELETE ON table1 FOR EACH ROW

INSERT INTO tables(...) VALUES(...);

3、数据库三范式

1NF:

字段原子性,不可再分

所有关系型数据库都满足1NF

2NF:

1NF+数据库表中每个实例or行必须可以唯一的被区分

一般通过加上主键实现

3NF:

1NF+2NF+数据库表不包含已在其他表中已包含的非主关键字信息

4、数据库优化经验

1、PrepareStatement性能一般比Statement高

一个sql发给服务器执行,涉及步骤:

语法检查-》语义分析-》编译-》缓存

或:sql-》发给oracle服务器-》语法检查和编译成内部指令-》缓存和执行指令

2、有外键约束会影响

如果能够保证数据的完整性,那在设计数据库时需要去掉外键

3、sql语句优化

4、建立索引

索引一般用B-Tree实现
http://blog.csdn.net/weiliangliang111/article/details/51333169
如果没有索引的话,查询内容一般需要全表遍历,效率低

5、UNION vs UNION ALL

他们用于连接连个结果集

union all保留重复结果

union链接好结果集后,会排序,删除出重复记录

所以union all比union快

6、JDBC注册驱动程序的三种方式

http://blog.csdn.net/b1198103958/article/details/46053509

Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动  

String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  

Connection conn=DriverManager.getConnection(url,"username","password"); 

能够在编译时不依赖于特定的JDBC Driver库

也易于改造成从配置文件读取JDBC配置,可以在运行时动态更换数据库连接驱动

System.setProperty("jdbc.driver", "com.mysql.jdbc.Driver");

String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  

Connection conn=DriverManager.getConnection(url,"username","password"); 

可以同时导入多个驱动:

System.setProperty("jdbc.drivers","XXXDriver:XXXDriver:XXXDriver");

new com.mysql.jdbc.Driver();//创建driver对象,加载数据库驱动  

String url="jdbc:mysql://localhost:3306/databasename";//数据库连接子协议  

Connection conn=DriverManager.getConnection(url,"username","password");  

它必须要有jdbc驱动才可以通过编译

7、Class.forName 的作用

程序按照参数中指定的字符串形式的类名去搜索并加载相应的类

若其字节码已经加载,则返回代表该字节码的Class对象

否则,按照类加载器的委托机制去搜索和加载

若无法加载,抛出异常ClassNotFoundException

加载完字节码后,就可以用Class字节码的newInstance创建实例

有时,程序使用的具体类名设计时无法确定,只能在运行时确定,则就需Class.forName动态加载

此类名多为配置文件中配置的eg:

1、spring ioc每次依赖注入的具体类

2、jdbc驱动类名,以便产品交付后不用改源程序就可以改驱动类

8、数据连接池的工作机制

http://www.cnblogs.com/newpanderking/p/3875749.html

对于共享资源的著名设计模式:资源池

是为了解决资源频繁分配、释放造成的问题

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于次树木的连接

当有新的连接请求,池池驱动程序返回空闲连接

若无空闲连接,根据配置的参数,新建一定数量的连接

Connection是原始COnnection的代理,代理Connection的close不是真的关连接

而是把他代理的Connection对象还给连接池

通过连接池的管理机制可以监控连接使用情况,为系统开发、测试、性能调整提供参考

优点:

1、资源复用

2、减少连接时间,响应快

3、简化的编程模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java开发面试题