Java后端-快速职场篇:104、面试之数据库、web前端

目录

2.3数据库部分

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

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

2.3.3事务四个基本特征或 ACID 特性。

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

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

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

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

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

2.3.9常用SQL

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

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

2.3.12 JDBC中的PreparedStatement相比Statement的好处

2.3.13 数据库连接池作用

2.4.2 简单介绍一下Ajax?

2.4.3 js和jQuery的关系?

2.4.4 jQuery的常用选择器?

2.4.5 jQuery的页面加载完毕事件?

2.4.6 Jquery的Ajax和原生Js实现Ajax有什么关系?

2.4.7简单说一下html5?你对现在的那些新技术有了解?

2.4.8 简单说一下css3?

2.4.9 bootstrap是什么?


2.3数据库部分


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


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

          关系型:mysql oracle sqlserver等

          非关系型:redis,memcache,mogodb,hadoop等

 

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


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

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

 

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

 

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

 

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

 

反三范式,有的时候为了效率,可以设置重复或者可以推导出的字段.

        订单(总价)和订单项(单价)

 

2.3.3事务四个基本特征或 ACID 特性。


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

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

  事务必须满足四大特征:原子性,一致性,隔离性持久性/持续性

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

 一致性:要么都成功、要么都是失败.后面的失败了要对前面的操作进行回滚。

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

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

 

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


100

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

 

 

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


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

 

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

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

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

mysql:

String sql =

"select * from students order by id limit " + pageSize*(pageNumber-1) + "," + pageSize;
oracle:
String sql =
 "select * from " +  
 (select *,rownum rid from (select * from students order by postime desc) where rid<=" + pagesize*pagenumber + ") as t" +

 "where t>" + pageSize*(pageNumber-1);
 

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


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

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

 

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

create table board1(id int primary key auto_increment,name varchar(50),ar

ticleCount int);

create table article1(id int primary key auto_increment,title varchar(50)

,bid int references board1(id));

 

delimiter |#把分割符;改成|

 

create trigger insertArticle_Trigger after insert on article1 for each ro

w begin

    -> update board1 set articleCount=articleCount+1 where id= NEW.bid;

    -> end;

    -> |

delimiter ;

insert into board1 value (null,'test',0);

insert into article1 value(null,'test',1);

 

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


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

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

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

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

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

 

正是由于存储过程的上述优点,目前常用的数据库都支持存储过程,例如 IBM DB2,Microsoft SQL Server,Oracle,Access 等,开源数据库系统 MySQL 也在 5.0 的时候实现了对存储过程的支持。

 

定义存储过程:

create procedure insert_Student (_name varchar(50),_age int ,out _id int)

begin

insert into student value(null,_name,_age);

select max(stuId) into _id from student;

end;

 

call insert_Student('wfz',23,@id);

select @id;

 

 

 

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


贾琏欲执事

加载驱动

获取连接

设置参数

执行

释放连接

 

package com.huawei.interview.lym;

 

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Types;

 

public class JdbcTest {

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

Connection cn = null;

CallableStatement cstmt = null;

try {

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

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

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

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

//cn = ds.getConnection();

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

cstmt = cn.prepareCall("{call insert_Student(?,?,?)}");

cstmt.registerOutParameter(3,Types.INTEGER);

cstmt.setString(1, "wangwu");

cstmt.setInt(2, 25);

cstmt.execute();

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

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

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

finally

{

 

/*try{cstmt.close();}catch(Exception e){}

try{cn.close();}catch(Exception e){}*/

try {

if(cstmt != null)

cstmt.close();

if(cn != null)

cn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

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程序?


贾琏欲执事

加载驱动(com.mysql.jdbc.Driver,oracle.jdbc.driver.OracleDriver)

获取连接(DriverManager.getConnection(url,usernam,passord))

设置参数  Statement PreparedStatement

           cstmt.setXXX(index, value);

执行   executeQuery executeUpdate

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

 

2.3.12 JDBC中的PreparedStatement相比Statement的好处


大多数我们都使用PreparedStatement代替Statement

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、数据库连接不需要每次都去创建,响应时间更快。

2.4 前端部分
2.4.1简单说一下html,css,javascript在网页开发中的定位?
HTML 超文本标记语言 定义网页的结构

CSS 层叠样式表,用来美化页面

JavaScript主要用来验证表单,做动态交互(其中ajax)

 

2.4.2 简单介绍一下Ajax?


  什么是Ajax? 异步的javascript和xml

  作用是什么?通过AJAX与服务器进行数据交换,AJAX可以使网页实现布局更新。

      这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

  怎么来实现Ajax XmlHttpRequest对象,使用这个对象可以异步向服务器发送请求,获取获取响应,完成局部更新。Open send responseText/responseXML 局部响应.

  使用场景 登陆失败时不跳转页面,注册时提示用户名是否存在,二级联动等等使用场景

 

2.4.3 js和jQuery的关系?


  jQuery是一个js框架,封装了js的属性和方法。让用户使用起来更加便利。

,并且增强了js的功能.

 

使用原生js是要处理很多兼容性的问题(注册事件等),由jQuery封装了底层,就不用处理兼容性问题。

原生的js的dom和事件绑定和Ajax等操作非常麻烦,jQuery封装以后操作非常方便。

 

2.4.4 jQuery的常用选择器?


ID选择器   通过ID获取一个元素

Class选择器 通过类(css)获取元素

标签选择器 通过标签获取元素

通用选择器(*) 获取所以的元素

div.myCls  获取有myCls这个类的div

层次选择器

     儿子选择器 > 获取下面的子元素

     后代选择器 空格 获取下面后代,包括儿子、孙子等后代

属性选择器

    Tag[attrName=’test’] 获取有属性名为xxxx并且属性的值为test的所有xxx标签

    <input type=”checkbox” name=”hobby”/> 吃饭<br/>

    <input type=”checkbox” name=”hobby”/> 睡觉<br/>

   Input[name=’hobby’],表示获取属性名为name并且name属性值为hobby的的所有input标签元素

 

2.4.5 jQuery的页面加载完毕事件?


    很多时候我们需要获取元素,但是必须等到该元素被加载完成后才能获取。我们可以把js代码放到该元素的后面,但是这样就会造成js在我们的body中存在不好管理。所有页面加载完毕后所有的元素当然已经加载完毕。一般获取元素做操作都要在页面加载完毕后操作。

第一种:

$(document).ready(function(){

});

 

$(document)把原生的document这个dom对象转换为jQuery对象,转换完成后才能调用ready方法

 

ready(fn),表示的是页面结构被加载完毕后执行传入函数fn

第二种:

$(function(){

});

 

当页面加载完毕后执行里面的函数,这一种相对简单,用得最多。

window.onload的区别

jQuery中的页面加载完毕事件,表示的是页面结构被加载完毕。
window.onload 表示的是页面被加载完毕。
  <img src=”htttp://baidu.com/1.jpg”/> onload必须等等页面中的图片、声音、图像等远程资源被加载完毕后才调用而jQuery中只需要页面结构被加载完毕。

 

 

2.4.6 Jquery的Ajax和原生Js实现Ajax有什么关系?


jQuery中的Ajax也是通过原生的js封装的。封装完成后让我们使用起来更加便利,不用考虑底层实现或兼容性等处理。

 

如果采用原生js实现Ajax是非常麻烦的,并且每次都是一样的。如果我们不使用jQuery我们也要封装Ajax对象的方法和属性。有像jQuery这些已经封装完成,并经过很多企业实际的框架,比较可靠并且开源。我们就不需要封装,直接使用成熟的框架(jQuery)即可.

 

2.4.7简单说一下html5?你对现在的那些新技术有了解?


Html5是最新版本的html,是在原来html4的基础上增强了一些标签。

 

Html增加一些像画板、声音、视频、web存储等高级功能。但是html5有一个不好的地方,那就是html5太强调语义了,导致开发中都不知道要选择那个标签。

  在做页面布局是,无论头部、主题、导航等模块都使用div来表示,但是html5的规范,需要使用不同的标签来表示。(header footer等)

 

 

你对现在的那些新技术有了解

Html5 css3等

 

2.4.8 简单说一下css3?


   Css3是最新版本的css,是对原理css2的功能增强。

 

   Css3中提供一些原来css2中实现起来比较困难或者不能实现的功能。

     1、盒子圆角边框

     2、盒子和文字的阴影

     3、渐变

     4、转换 移动、缩放、旋转等

     5、过渡、动画都可以使用动画。

     6、可以使用媒体查询实现响应式网站。

   Css3最大缺点就是要根据不同的浏览器处理兼容性。对应有一些处理兼容性的工具。不用担心.

 

2.4.9 bootstrap是什么?


BootStrap是一个移动设备优先的UI框架。我们可以不用谢任何css,js代码就能实现比较漂亮的有交互性的页面。我们程序员对页面的编写是有硬伤的,所有要自己写页面的话就要使用类似于bootstrap这样的UI框架。

平时用得很多的:

模态框
表单,表单项
布局
删格系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值