2.3.1 数据库的分类及常用的数据库

数据库分为:关系型数据库和非关系型数据库

关系数据库:mysql,oracle,sqlServer

非关系型:redis,mongoDB

2.3.2 简单介绍一下关系数据库三范式

范式就是规范,就是关系型数据库在设置表时,要遵循的三个规范。

要满足第二范式必须先满足第一范式,要满足第三范式必须先满足第二范式。

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体列中的某个属性不能有多个值或者不能有重复的属性,列数据的不可分割。

二范式(2NF)要求数据库表中的每个行必须可以被唯一的区分,为实现区分通常需要为表加上一列,以存储各个实例的唯一标识。(主键)

满足第三范式(3NF)必须先满足第二范式,简而言之,第三范式要求一个数据库表中不包含已在其他表中已包含的非关键字信息。(外键)

反三范式,有的时候为了效率,可以设置重复或者可以推导的字段,订单(总价)和订单项(单价)

2.3.3 事务的四个基本特征

事物是并发控制的单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。

一个转账必须A帐号扣钱成功,B帐号加钱成功,才算真正的转账成功。

事务必须满足四大特征:

原子性:表示事务内操作不可分割,要么成功,要么都失败

一致性:要么成功,要么失败,后面的失败了要对前面的操作进行回滚

隔离性:一个事务开始后,不能与其他事务干扰

持久性(持续性):表示事务开始了,就不能终止。

2.3.4 mysql数据库的默认的最大连接数?

为什么需要最大连接数?特定服务器上面的数据库只能支持一定数目同时连接,这时候需要我们设置最大连接数(最多同时服务多少连接),在数据库安装时都会有一个默认的最大连接数。最大连接数为100.

max_connections=100;

2.3.5 说一下mysql的分页?Oracle的分页?

为什么需要分页?在很多数据库时,不可能完全显示数据,进行分段显示。

mysql是使用关键字limit 来进行分页的,limit offset,size 表示从多少索引取多少位。

Oracle的分页。大部分情况下,我们是记不住了,说思路,要使用三层嵌套查询

oracle的分页优点记不住了,只记得一些大概,是使用类三层嵌套查询,如果在工作中使用了,可以到原来的项目中拷贝或上网查询。

sqlserver的是top

  1. --top not in方式
  2. select top 条数 *  from tablename
  3. where Id not in (select top 条数*页数  Id from tablename)

2.3.6 简单讲一下数据库的触发器的使用场景

触发器,需要触发条件,当条件满足以后做什么操作。

触发器用处还是很多的,比如校内网、Facebook,你发一个日志,自动通知好友,其实就是在增加日志做一个后触发,再向通知表中写入条目,因为触发效率高,而UCH没有用触发器,效率和数据处理能力很低。

每插入一个帖子,都希望将版面表中的最后发帖时间,帖子数字段进行同步更新,用触发器做效率更高。

关键字:trigger

2.3.7 简单讲一下数据库的存储过程的使用场景?

数据库存储过程具有如下优点:

1)存储过程只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句每执行一次就编译一次,因此使用存储过程可以大大提高数据执行数度,

2)通常,复杂的业务逻辑需要多条SQL语句,这些语句要分别地从客户端发送到服务器,当客户端和服务器之间的操作很多时,将产生大量的网络传输,如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输就会大大减少,降低类网络负载,

3)存储过程创建一次便可以重复使用,从而可以减少数据库开发人员的工作量,

4)安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用exectu权限调用存储过程,无需拥有访问底层数据库对象的显示权限。

定义存储过程:

create procedure studen(name varchar(50),age int,id in);

begin

insert into student values('lisi',22,1);

select name,age from student;

end;

调用存储过程

call student();

2.3.8 用jdbc怎么调用存储过程?

加载驱动

获取连接

设置参数

执行

释放连接

public static void main(String[]args) {

Connection conn = null;

CallableStatement st = null;

try {

//这里最好不要这么干,因为驱动名写死在程序中了

Class.forName("com.mysql.jdbc.Driver");

//实际项目中,这里应用DataSource数据,如果用框架

//这个数据源不需要我们编码创建,我们只需DataSourceds=context.lookup();

//conn = ds.getConnection();

conn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

st = conn.prepareCall("{call insert_Student(?,?,?)}");

st.registerOutParameter(3, Types.INTEGER);

st.setString(1, "laowang");

st.setInt(2, 25);

st.execute();

//get第几个,不同的数据库不一样,建议不写

System.out.println(st.getString(3));

} catch(Exception e){

e.printStackTrace();

}

}

2.3.9 常用的SQL

2.3.10 简单说一下你对jdbc的理解

Java database connection java数据库连接,数据库关系系统(mysql,oracle)是很多,每个数据库管理系统支持的命令是不一样的,

java只定义接口,让数据库厂商自己实现接口,对于我们而言只需要导入对应厂商开发的实现接口,然后以接口方式进行调用(mysql+mysql驱动+jdbc)

2.3.11 写一个简单的jdbc的程序,写一个访问oracle数据库的jdbc程序?

加载驱动(oracle.jdbc.driver.OracleDriver)

获取连接(DriverManager.getConnection(url, user, password))

设置参数

Statement st = conn.createStatement();

st.setXXX(index,value)

执行(execute)

释放连接(是否连接要从小到大,必须放到finally)

2.3.12 JDBC中的PreparedStatement相比Statement的好处

大多数时候都使用PreparedStatement代替

1)PreparedStatement是预编译的,比Statement速度快

2)代码的可读性和可维护性

虽然PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说,都比直接用Statement的代码高很多档次。

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");

perstmt.setString(1,var1);

perstmt.setString(2,var2);

perstmt.setString(3,var3);

perstmt.setString(4,var4);

perstmt.executeUpdate();

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

3)安全性

PreparedStatement可以防止SQL注入攻击,而Statement却不能,比如:

String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?

select * from tb_name = '随意' and passwd = '' or '1' = '1';

因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:

把[';drop table tb_name;]作为varpasswd传入进来,则:

select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而 如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编 译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement, 有可能要对drop,;等做费尽心机的判断和过虑.

2.3.13 数据库连接池的作用

1)限定数据库的个数,不会导致由于数据库过多导致系统运行缓慢或者崩溃。

2)数据库连接池不需要每次创建或者销毁,节约资源。

3)数据库连接池不需要每次创建,响应时间快。

java面试④数据库部分的更多相关文章

  1. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. Java面试准备十六:数据库——MySQL性能优化

    2017年04月20日 13:09:43 阅读数:6837 这里只是为了记录,由于自身水平实在不怎么样,难免错误百出,有错的地方还望大家多多指出,谢谢. 来自MySQL性能优化的最佳20+经验 为查询 ...

  3. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  4. java面试宝典(蓝桥学院)

    Java面试宝典(蓝桥学院) 回答技巧 这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的学生在笔试/面试时更好地赢得好的结果.由于这套试题涉及的范围 ...

  5. 亚信联创--java面试题目总结

    这几天投简历,只有两家的HR表示感兴趣.易思卓越和亚信联创,不管怎样如果能有机会面试都一定尽力表现,所以找了找网上的面经,这里先把题目总结一下. 职位要求如下: ------------------- ...

  6. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

  7. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  8. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)

    hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和学习,使自己在做项目中更加 ...

  9. Java面试题精选(三) JSP/Servlet Java面试逻辑题

    --   JSP/Servlet  Java面试逻辑题   --     很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...

随机推荐

  1. Win10系统下编译GEOS3.6.2

    环境说明 1.Win10专业版.64位: 2.VS2012旗舰版: 3.cmake-3.9.0.64位: 资源准备 GEOS管网(http://trac.osgeo.org/geos)下载3.4.3版 ...

  2. test命令详解

    test命令格式: test condition 通常,在if-then-else语句中,用[]代替,即[ condition ].注意:方括号两边都要用空格.   1.数值比较 ========== ...

  3. LeetCode135:Candy

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

  4. .NET高级代码审计(第一课)XmlSerializer反序列化漏洞

    0X00 前言 在.NET 框架中的 XmlSerializer 类是一种很棒的工具,它是将高度结构化的 XML 数据映射为 .NET 对象.XmlSerializer类在程序中通过单个 API 调用 ...

  5. Code First 更新数据库 记录

    每次都会忘记这个,所以记录一下 第一步:打开程序包管理控制台 第二步:启动迁移配置 第三步: 更新数据库的迁移的名称 因为设置了多个context,所以要指定更新的是哪一个库. 如果没有指定,会出现下 ...

  6. OPC测试常用的OPCClient和OPCServer软件推荐

    各位在进行OPC通讯时,常会遇到两种情况: 1)使用一个OPCClient在同一台计算机上连接远程计算机上的多个OPCServer时,发现某个OPCServer是通畅的,但其他的OPCServer却无 ...

  7. 【cocos2d-x 手游研发----精灵的八面玲珑】

    继续上一篇文章继续聊吧,这章内容会比较多,也会附上代码,很多朋友加了群,大家在群里面探讨了很多东西,这让大家都觉得受益匪浅,这便是极好的,废话不多了,精灵是游戏的重要组成部分,那ARPG里面的精灵必然 ...

  8. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  9. [TJOI2013]攻击装置(网络流,最小割)

    前言 网络流被hbx吊起来打 Solution 考虑一下这个走法是不是和象棋中马的走法一模一样(废话) 那么显然我每一次移动是走三次,如果将棋盘二分图染色一下,不就是每一次只能走到另一个颜色的吗? 然 ...

  10. OpenSL的代码编写

    #include <jni.h>#include <string>#include <SLES/OpenSLES.h>#include <SLES/OpenS ...