JavaEE第二阶段面试题总结(1)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> JavaEE第二阶段面试题总结(1)

目录

前端技术(HTML、CSS、JS、JQuery等)在js中怎么样验证数字?js中如何给string这个类型加方法?谈谈js的定时器?请写几个javascript 里面的对象和对象的函数使用请写几个html元素以及相应控制效果ajax的实现机制****如何在b.html页面获取a.html元素值javascript中如何判断数据类型,返回值分别是什么?用jq或者js获取复选框中选中的值jQuery中find方法和children方法的使用和区别J2EE基础Servlet属于线程安全的吗?在JSP中,只有一行代码:%=A+B %,运行结果是()jsp和servlet有什么关系?iso8859-1如何转换成utf-8?你如何防止直接敲URL进行访问页面谈谈Jsp的9大内置对象谈谈jsp的4个数据传输域以及他们的区别谈谈jsp跟Servlet的区别谈谈Servlet的生命周期谈谈转发和重定向的区别谈谈MVC设计模式的理解谈谈cookie跟session的区别谈谈你用过的设计模式??如何在XML文件中输出,,#这些特殊字符JSP页面中如何处理编码问题jsp中有几种注释方式,分别是什么?与Window.location.href的区别?在jsp页面怎么获取url里面的请求参数?在tomcat项目根目录下有个文件images/logo.png,在web环境下怎么获取该文件路径?数据库数据表的设计原则原生的jdbc怎么连接数据库?关系数据库中连接池的机制是什么?关系数据库中的主键和外键有什么关系?关系数据库中第一范式、第二范式和第三范式是什么?Oracle 端口号?MySQL端口号?test1表中有ABC三列,用SQL语句实现:当A列大于B列时,选择A列否则选择B列,当B列大于C列时选择B列 否则选择C列。给定基本信息表baseInfo包括:学号、姓名、性别、年龄、籍贯(主键是学号),分数表scoreInfo包括:学号,科目,分数(主键是学号-科目)Long类型怎么设计的表结构?Boolean类型怎么设计的表结构?请介绍下触发器的原理存储过程里的语句是一条条按顺序执行的吗?如何写分组过滤的SQL语句,比如统计一个班级里面,按省份分组,统计每个省份的学员平均年龄或统计一个班级里面,按省份分组,要求只列出平均年龄大于20岁的省份信息如何解决SQL注入的问题请说说内连接和外连接的写法及区别向一张表插入100万条数据,该如何做?谈谈对数据库事务的理解?事务的边界应该放在哪一层?为什么?谈谈事务的特性ACID谈谈事务的隔离级别存储过程是什么?用过哪些数据库连接池,为什么要用数据库连接池?

前端技术(HTML、CSS、JS、JQuery等)

在js中怎么样验证数字?


使用正则表达式检验正整数

function checkRate(input) {
        var re = /^[1-9]+[0-9]*]*$/;
        var nubmer = document.getElementById(input).value;
        if (!re.test(nubmer)) {
            alert("请输入数字");
            document.getElementById(input).value = "";
            return false;
        }
    }

js中如何给string这个类型加方法?

通过原型链添加方法:


String.prototype.go = function(){//在string大对象上添加方法go
    console.log(this)
}
'sss'.go();//调用自定义的方法

谈谈js的定时器?

js有两种定时器:

  • setTimeout  setTimeout只在指定时间后执行一次
  • setInterval  setInterval以指定时间为周期循环执行
  • 请写几个javascript 里面的对象和对象的函数使用

    
    javascript对象
    - String对象
    length:使用长度属性来计算字符串的长度。
    var txt="Hello world!"
    document.write(txt.length)
    
    indexOf() 方法:使用 indexOf() 来定位字符串中某一个指定的字符首次出现的位置。
    var str="Hello world!"
    document.write(str.indexOf("Hello") + "br /")
    
    match():使用 match() 来查找字符串中特定的字符,并且如果找到的话,则返回这个字符。
    var str="Hello world!"
    document.write(str.match("world") + "br /")
    
    -  Date对象
    Date():返回当日的日期和时间
    document.write(Date());
    
    setFullYear:使用 setFullYear() 设置具体的日期。
    var d = new Date()
    d.setFullYear(1992,10,3)
    
    - Array对象
    for..in:使用 for...in 声明来循环输出数组中的元素。
    
    var x
    var mycars = new Array()
    mycars[0] = "Saab"
    mycars[1] = "Volvo"
    mycars[2] = "BMW"
    
    for (x in mycars)
    {
    document.write(mycars[x] + "br /")
    }
    

    请写几个html元素以及相应控制效果

    
    h1...h6:控制标签字体大小
    p :段落标签,独占一行
    img:展示图片标签
    无序标签:
     ul
        li/li
        li/li
     /ul
     有序标签:
     ol
        li/li
        li/li
     /ol
     a href=""/a:超连接标签
    

    ajax的实现机制

    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。XMLHttpRequest是ajax的核心机制

    由于各浏览器之间存在差异,所以创建一个XMLHttpRequest对象可能需要不同的方法。这个差异主要体现在IE和其它浏览器之间。下面是一个比较标准的创建XMLHttpRequest对象的方法。

    
    示例代码:
    function CreateXmlHttp() {
    
        //非IE浏览器创建XmlHttpRequest对象
        if (window.XmlHttpRequest) {
            xmlhttp = new XmlHttpRequest();
        }
    
        //IE浏览器创建XmlHttpRequest对象
        if (window.ActiveXObject) {
            try {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) {
                try {
                    xmlhttp = new ActiveXObject("msxml2.XMLHTTP");
                }
                catch (ex) { }
            }
        }
    }
    
    function Ustbwuyi() {
    
        var data = document.getElementById("username").value;
        CreateXmlHttp();
        if (!xmlhttp) {
            alert("创建xmlhttp对象异常!");
            return false;
        }
    
        xmlhttp.open("POST", url, false);
    
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                document.getElementById("user1").innerHTML = "数据正在加载...";
                if (xmlhttp.status == 200) {
                    document.write(xmlhttp.responseText);
                }
            }
        }
        xmlhttp.send();
    }
    

    函数首先检查XMLHttpRequest的整体状态并且保证它已经完成(readyStatus=4),即数据已经发送完毕。然后根据服务器的设定询问请求状态,如果一切已经就绪(status=200),那么就执行下面需要的操作。

    对于XmlHttpRequest的两个方法,open和send,其中open方法指定了:

    a、向服务器提交数据的类型,即post还是get。

    b、请求的url地址和传递的参数。

    c、传输方式,false为同步,true为异步。默认为true。

    Send方法用来发送请求。
    知道了XMLHttpRequest的工作流程,我们可以看出,XMLHttpRequest是完全用来向服务器发出一个请求的,它的作用也局限于此,但它的作用是整个ajax实现的关键,因为ajax无非是两个过程,发出请求和响应请求。并且它完全是一种客户端的技术。而XMLHttpRequest正是处理了服务器端和客户端通信的问题所以才会如此的重要。

    ****如何在b.html页面获取a.html元素值

    javascript中如何判断数据类型,返回值分别是什么?

    typeof进行判断 
    返回值:
    number,string,undefined,boolean,object,function

    用jq或者js获取复选框中选中的值

    
    $('input[name="xxxx"]:checked').val();
    

    jQuery中find方法和children方法的使用和区别

    在jQuery中,find方法和children方法都可以用来查找一个元素的后代元素。区别在于children只能找子元素,find可以找所有的后代元素。

    J2EE基础

    Servlet属于线程安全的吗?

    Servlet不是线程安全的。
    当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。所以此时如果Servlet中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。

    在JSP中,只有一行代码:%=A+B %,运行结果是()

    编译会报错,找不到变量A和变量B的存在

    jsp和servlet有什么关系?

    通俗的说jsp是嵌套java代码的html,servlet是嵌套html的java代码,两者在实质上是相同的,任何.jsp文件都回被翻译成java代码然后在机器上执行,但是由于两者在配置和编写方式上的不同。
    jsp一般被用在view层上,用来显示数据
    servlet一般做后台的逻辑上的业务处理用

    iso8859-1如何转换成utf-8?

    • 首先可以把网页的编码、传送编码等等一切编码改为utf-8
    • 通过编码转换的方式,  String s2 = new String(s1.getBytes("iso-8859-1"),"utf-8");

    你如何防止直接敲URL进行访问页面

    可以通过过滤器或者拦截器进行访问的控制,只需要在过滤器或拦截器类中进行判断,比如该用户是否已经登录,没有登录则不让其进行访问,给出提示。

    谈谈Jsp的9大内置对象

    JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

  • request对象  request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

  • response对象  response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。

  • session对象  session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。

  • application对象  application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。

  • out 对象  out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

  • pageContext 对象  pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

  • config 对象 config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。

  • page 对象 page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。

  • exception 对象 exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。

  • 谈谈jsp的4个数据传输域以及他们的区别

    JSP四个域对象:pageContext,servletContext,request,sesssion

    区别主要看它们生命周期的不同: 
    1.简单说 page指当前页面。在一个jsp页面里有效 
    2.request 指从http请求到服务器处理结束,返回响应的整个过程。在这个过程中使用forward方式跳转多个jsp。在这些页面里你都可以使用这个变量。 
    3.Session 有效范围当前会话,从浏览器打开到浏览器关闭这个过程。 
    4.application它的有效范围是整个应用。

    作用域里的变量中的变量会随着生命周期的不同而不同: 
    page里的变量没法从index.jsp传递到test.jsp。只要页面跳转了,它们就不见了。 
    request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。 
    session和application里的变量一直在累加,开始还看不出区别,只要关闭浏览器,再次重启浏览器访问这页,session里的变量就重新计算了。 
    application里的变量一直在累加,除非你重启tomcat,否则它会一直变大。

    谈谈jsp跟Servlet的区别

    JSP与Servlet主要有两方面的不同:编译:JSP修改后可以立即看到结果,不需要编译;而Servelt缺需要编译。转换:JSP是动态网页开发技术,是运行在服务器端的脚本语言,而Servlet是web服务器端编程技术。所以JSP运行时就是转换为Servlet,也就是java程序来执行。

    谈谈Servlet的生命周期

    Servlet生命周期

  • 加载和实例化Servlet 当启动Servlet容器时,容器首先查找一个配置文件web.xml,这个文件中记录了可以提供服务的Servlet。每个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每个自动装入选项的Servlet创建一个实例。所以,每个Servlet类必须有一个公共的无参数的构造器。
  • 初始化 当Servlet被实例化后,Servlet容器将调用每个Servlet的init方法来实例化每个实例,执行完init方法之后,Servlet处于“已初始化”状态。所以说,一旦Servlet被实例化,那么必将调用init方法。通过Servlet在启动后不立即初始化,而是收到请求后进行。在web.xml文件中用 …… 对Servlet进行预先初始化。
  • 请求处理 Servlet 被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个Servlet Request 对象代表。Servlet 给客户端的响应由一个Servlet Response对象代表。对于到达客户机的请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法可以调用其他方法来处理请求。
  • 卸载Servlet 当服务器不再需要Servlet实例或重新装入时,会调用destroy方法,使用这个方法,Servlet可以释放掉所有在init方法申请的资源。一个Servlet实例一旦终止,就不允许再次被调用,只能等待被卸载。
  • 谈谈转发和重定向的区别

    第一个差别点,就是重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向 
    第二个差别点,重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址

    谈谈MVC设计模式的理解

    能够解决web开发中的职责分配问题,使得显示与逻辑分开。

    谈谈cookie跟session的区别

    cookie数据保存在客户端,session数据保存在服务器端。
    一般情况下,服务器会在一定时间内(默认30分钟)保存这个 Session,过了时间限制,就会销毁这个Session。
    如果不设置这个过期时间,那么Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间为若干天之后,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服务器上。

    谈谈你用过的设计模式??

    • 单例模式
    • 工厂模式
    • 代理模式
    • 适配器模式
    • 装饰者模式

    如何在XML文件中输出,,#这些特殊字符

    CDATA部件在CDATA内部的所有内容都会被解析器忽略。如果文本包含了很多的””字符和”&”字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。一个 CDATA 部件以””标记结束:

    在前面的例子中,所有在CDATA部件之间的文本都会被解析器忽略。

    JSP页面中如何处理编码问题

    1、eclipse配置中的Text file encoding(文件编码),这是给java编译器用的,如果想在jsp页面中保存中文字符,必须将其设置为UTF-8格式。
    2.jsp页面中contentType指定了服务器响应给客户端的http内容类型,默认为”text/html“,charset指定了服务器发送给客户端时的内容编码。可以把charset设置成utf-8
    3.pageEncoding是jsp文件本身的编码,可以设置成utf-8

    jsp中有几种注释方式,分别是什么?

    这是HTML/XML的原版注释,会老老实实的发到客户端的,客户端查看源代码可以看到注释内容

    %注释内容 %
    有% %的东西都是写给JSP应用服务器看的,不会发到客户端,。客户端查看源代码不可以看到注释 内容

    //单行注释

    /**
    多行注释
    */

    与Window.location.href的区别?

    在标签对中使用标签可以进行传值。
    动作指令之后的代码是不会执行的。
    使用动作指令跳转的页面,浏览器的地址还是跳转之前的页面地址。 
    window.location.href通过请求地址携带参数,且页面地址会改变。

    在jsp页面怎么获取url里面的请求参数?

    
    %
         String value=request.getParameter("key");
    %
    

    在tomcat项目根目录下有个文件images/logo.png,在web环境下怎么获取该文件路径?

    可以通过如下代码拿到web项目根路径下的文件:

    
    String path = getServletContext().getRealPath("/images/logo.png");
    File file = new File(path);
    

    数据库

    数据表的设计原则

    在实际开发中最为常见的设计范式有三个:

    • 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式;
    • 第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中;
    • 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。总结一下,就是:第一范式(确保每列保持原子性);第二范式(确保表中的每列都和主键相关);第三范式(确保每列都和主键列直接相关,而不是间接相关)。

    原生的jdbc怎么连接数据库?

    使用JDBC的六个固定步骤

    1. 注册数据库驱动
    2. 取得数据库连接对象Connection
    3. 创建SQL执行对象
    4. 执行SQL命令,并返回结果集
    5. 处理结果集
    6. 依次关闭结果集
    
    //案例源码
            String driver = "com.mysql.jdbc.Driver";
            String url = "jdbc:mysql://127.0.0.1:3306/xxx";
            String user = "root";
            String password = "root";
            String sql = "insert into user(name,gender,salary) values(?,?,?)";
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            try {
                //注册数据库驱动
                Class.forName(driver);
                //取得数据库连接
                conn = DriverManager.getConnection(url, user, password);
                //进行预编译,这里进行参数设置
                pstmt = conn.prepareStatement(sql);
                pstmt.setString(1,"xiaozheng");
                pstmt.setString(2,"男");
                pstmt.setFloat(3,8000);
                //进行编译
                rs = pstmt.executeQuery();
                while (rs.next()) {
                    int id = rs.getInt("id");
                    String name = rs.getString("name");
                    String gender = rs.getString("gender");
                    float salary = rs.getFloat("salary");
                    System.out.println(id + ":" + name + ":" + gender + ":"+ salary);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(rs!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                    try {
                        rs.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if(stmt!=null){//轻量级,创建和销毁rs所需要的时间和资源较小
                    try {
                        stmt.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                if(conn!=null){//重量级,创建和销毁rs所需要的时间和资源较小
                    try {
                        conn.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    

    可以发现,如果要使用JDBC连接数据库,上述代码必不可少,数据库连接参数配置和关闭资源都是重复的,因此建议封装成一个工具类,减少重复代码。

    关系数据库中连接池的机制是什么?

    J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。 
    实现方式,返回的Connection是原始Connection的代理,代理Connection的close方法不是真正关连接,而是把它代理的Connection对象还回到连接池中。

    关系数据库中的主键和外键有什么关系?

    定义主键和外键主要是为了维护关系数据库的完整性。

    1. 主键是能确定一条记录的唯一标识,比如,一条用户记录包括身份证号,姓名等。身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号可以是主键。
    2. 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性,一表的外键是另一张表的主键或唯一字段。

    比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    关系数据库中第一范式、第二范式和第三范式是什么?

    三大范式: 
      第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解; 
      第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性; 
      第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    Oracle 端口号?MySQL端口号?

    mysql 默认端口号为:3306 
    oracle 默认端口号为:1521

    test1表中有ABC三列,用SQL语句实现:当A列大于B列时,选择A列否则选择B列,当B列大于C列时选择B列 否则选择C列。

    
    select     
            (CASE WHEN AB THEN A ELSE B END) as A,
            (CASE WHEN BC THEN B ELSE C END) as B
    from test1
    

    给定基本信息表baseInfo包括:学号、姓名、性别、年龄、籍贯(主键是学号),分数表scoreInfo包括:学号,科目,分数(主键是学号-科目)

    1. 查询所有语文成绩大于85分的学生的学号、姓名、性别、年龄、语文分数
    
    select b.stuno,b.stuname,b.stusex,b.age,s.score as 语文成绩
    from
        (select * from baseinfo) b
    inner join
        (select * from scoreinfo)s
    on b.stuno = s.stuno
    where s.subject="语文" and s.score 85
    
    1. 查询所有语文成绩大于85分的学生的学号、姓名、性别、年龄、语文分数、数学分数
    
    SELECT aa.stuno,aa.stuname,aa.stusex,aa.age,aa.yuwen, si.score as math 
    from 
        (select * from scoreinfo) si
    INNER JOIN
        (select b.stuno,b.stuname,b.stusex,b.age,s.score as yuwen
    from
        (select * from baseinfo) b
    inner join
        (select * from scoreinfo)s
    on b.stuno = s.stuno
    where s.subject="语文" and s.score 85) aa
    on aa.stuno = si.stuno
    where si.subject="数学"
    
    1. *查询所有语文成绩大于85分、性别为女的学生的学号、姓名、各科分数

    Long类型怎么设计的表结构?Boolean类型怎么设计的表结构?

    Java中long类型占64位,因此数据库可以采用bigint类型与之对应,都是占用64位的内容空间。
    boolean类型在mysql中可以直接采用int类型表示。

    请介绍下触发器的原理

    触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器触发的执行语句可能只有一个,也可能有多个。

    存储过程里的语句是一条条按顺序执行的吗?

    存储过程里的语句并不是一条条按编写顺序执行。数据库在编译存储过程时会有一个优化的过程,在不改变存储过程最后结果的前提下,可能会对存储过程里的语句有一个顺序的调整。

    如何写分组过滤的SQL语句,比如统计一个班级里面,按省份分组,统计每个省份的学员平均年龄或统计一个班级里面,按省份分组,要求只列出平均年龄大于20岁的省份信息

    
    select s.province,avg(age) from student s group by s.province
    
    select s.province,avg(age) from student s group by s.province having avg(age)20
    

    如何解决SQL注入的问题

    使用预编译对象 PreparedStatement

    请说说内连接和外连接的写法及区别

    
    #内连接
    select * from student s,classes c where s.c_id = c.id
    select * from student s INNER JOIN classes c on s.c_id = c.id
    
    #外连接
    #左外连接
    select * from student s LEFT JOIN classes c on s.c_id = c.id
    #右外连接
    select * from student s RIGHT JOIN classes c on s.c_id = c.id
    

    内连接查询匹配的数据,左外连接以左边表的数据为准,即左边表的数据全部查出,右边表无匹配数据则以空代替。右外连接则相反。

    向一张表插入100万条数据,该如何做?

    
    使用JDBC批处理的方式批量插入数据
    
    示例代码
    @Test
        public void testBatch(){
            SessionFactory factory = HibernateUtil.getSessionFactory();
            Session session = factory.getCurrentSession();
            session.beginTransaction();
            //
            session.doWork(new Work() {
    
                @Override
                public void execute(Connection connection) throws SQLException {
                    PreparedStatement prepareStatement = connection.prepareStatement("insert into teacher(name)values(?)");
                    for(int i=0;i1000;i++){
                        prepareStatement.setString(1, "teacher00"+i);
                        prepareStatement.addBatch();
                        if(i%100==0){
                            prepareStatement.executeBatch();
                        }
                    }
                    prepareStatement.executeBatch();
                }
            });
            //
            session.getTransaction().commit();
    

    谈谈对数据库事务的理解?事务的边界应该放在哪一层?为什么?

    事务简单来说就是为了保证数据的一致性。
    使用事务机制的好处非常明显,例如银行转账之类的交易操作中,事务有着重要的作用。事务的成功取决于事务单元帐户相互依赖的操作行为是否能全部执行成功,只要有一个操作行为失败,整个事务将失败。例如:客户A和客户B的银行账户金额都是10000元人民币,客户A需要把自己帐户中的5000元人民币转到客户B的账户上。这个过程看似简单,实际上涉及了一系列的数据库操作,可以简单地视为两步基本操作,即从客户A帐户的金额中扣除5000元人民币,以及将客户B帐户中金额添加5000元人民币。假设第1步数据库操作成功,而第二步失败的话,将导致整个操作失败,并且客户A帐户金额将被扣除5000元人民币。事务机制可以避免此类情况,以保证整个操作的完成,如果某步操作出错,之前所作的数据库操作将全部失效。

    事务的边界应该放在Service层,因为Service层会涉及很多Dao层的操作,为了保证Dao层操作的一致性,因此事务应该放在此层中。

    谈谈事务的特性ACID

  • 原子性(ATOMICITY):  事务是数据库的逻辑工作单位,事务中包含的各操作要么都完成,要么都不完成
  • 一致性(CONSISTENCY):  事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
  • 隔离性(ISOLATION):  一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(DURABILITY):  指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
  • 谈谈事务的隔离级别

  • Read uncommitted 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。
  • Read committed 读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。
  • Repeatable read 重复读,就是在开始读取数据(事务开启)时,不再允许修改操作
  • Serializable 序列化 Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
  • 存储过程是什么?

    存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快

    用过哪些数据库连接池,为什么要用数据库连接池?

    连接池主要减少数据库连接的创建时间和连接销毁时间
    数据库连接池主要有:C3P0,DBCP,druid

     

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> JavaEE第二阶段面试题总结(1)


     上一篇
    SSM框架相关基础面试题整理 SSM框架相关基础面试题整理
    一、Spring面试题1、Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成。两大核心: ①. IOC/DI(控制反转/依赖注入) :把dao依赖注
    2021-04-05
    下一篇 
    JavaEE第二阶段面试题总结(2) JavaEE第二阶段面试题总结(2)
    目录struts2框架简述struts中的mvc编程模式?谈谈Struts2的工作原理tocken防止重复提交hibernate框架谈谈Hiberante的缓存谈谈Hibernate如何解决懒加载问题spring框架Spring中我们配置b
    2021-04-05