第一週考試題整理

第一週考試題

  1. Mybatis常用的動態SQL的標籤有哪些?

我的答案:(滿分10分,得分10分)

<where>

<if></if>

<where>

 

<where>

<when></when>

<otherwise></otherwise>

<where>

 

<set><set>

 

<forEach></forEach>

 

答案解析:

if,choose,when,otherwise,trim,set,where,foreach

 

個人批註:我沒有寫全,而且第二個是choose when otherwise ,我卻把choose寫成了where, trim也沒有寫,set用於更新一般後面會跟where條件,我也沒寫...

 

2.Mybatis的Xml映射文件中,不同Xml映射文件,id是否可以重複?

我的答案:(滿分10分,得分2分)

不同的xml映射文件的id可以重複,相同的xml映射文件不可以重複

答案解析:

不同的Xml映射文件,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複.

(不管是什麼id,即使不是同種類型,譬如說查詢的id跟更新的id一樣也不行.反正就是所有id都不能重複,因爲id就是一個標識)

 

 

個人批註:

問題的意思應該是在不使用mapper接口編程的時候,如果在測試的時候寫的是namespace+id,那麼不同Xml映射文件id可以重複.如果沒有配置namespace,也就是說在測試的時候沒有寫namespace,直接寫id,那麼不同映射文件的id是不可以重複的.

詳解:

1.首先,一個mapper.xml文件中只能有一個<mapper></mapper>,必須配置namespace,不管對不對,不配置namespace或者namespace爲空,都會直接報錯!

不同xml映射文件namespace的值不能一樣.有一樣的會直接報錯!

2.如果使用mapper接口編程,一定要配置namespace,指向相應的mapper接口文件.這時候不同Xml映射文件id是可以重複的.當然同一個xml映射文件中的id是肯定不能重複的.

3.沒有配置namespace是指隨便配置一個namespace,隨便配置什麼都行,(經過測試,namespace不能爲空,會直接報錯,可以隨便寫,但是不能不寫.).

4如果在測試的時候寫的是namespace+id,那麼不同Xml映射文件id可以重複.如果沒有配置namespace,也就是說在測試的時候沒有寫namespace,直接寫id,那麼不同映射文件的id是不可以重複的.

 

接下來是一個沒有配置namespace(也就是說在測試的時候,不寫namespace,直接寫id),id重複會報錯的例子.

(EmployeeMapper.xml跟EmployeeMapper2.xml中的namespace是不一樣的,但是裏面的id是一樣的.)

EmployeeMapper.xml

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="test">

<select id="selectAllEmployee" resultType="Employee">
        /*查詢全部*/
     select id,name,age,birthday,salary from t_employee     
</select>
</mapper>

EmployeeMapper2.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="test2">

    
<select id="selectAllEmployee" resultType="Employee">
          /*查詢全部*/
            select id,name,age,birthday,salary from t_employee
        
</select>
</mapper>

 

MabatisTest.java

package com.xiongluoluo.test;

import com.xiongluoluo.bean.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
  * Created by Administrator on 2019/12/21 0021.
  */
public class MybatisTest {
    @Test
    public void testSelectAllEmployee(){
        String resource = "mybatis-config.xml";
        try {
            InputStream is = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            List<Employee> list = sqlSession.selectList("test.selectAllEmployee");

           //如果這裏用的是namespace+id那麼就不會報錯.
           //如果這裏直接寫的id那麼就會報錯.因爲在不同的映射文件裏有相同的id.

            for(Employee employee : list){
                System.out.println(employee);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

 

 

3.當實體類中的屬性和表中的字段名不一樣,如何實現對象的封裝

我的答案:(滿分10分,得分10分)

1.起別名

2.通過ResultMap完成實體類的屬性名和表中字段名的一一對應

 

答案解析:

1. 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致

2.通過<resultMap>來映射字段名和實體類屬性名的一一對應的關係

 

個人批註:兩種方式其實本質是相同的,不過就是一個寫了一個resultMap,到插入語句執行的時候其實跟起別名的方式沒什麼區別.只是起別名的方式直接就起了別名.而resultMap是先寫了一下,然後運行的時候其實是一樣的.就是一個是顯式封裝,一個是隱式封裝而已.

 

4.ResultMap和ResultType的差別?

我的答案:(滿分10分,得分8分)

ResultMap:是結果集,是實體類中的屬性名,與表中的字段名的一一對應

ResultType:是對應方法的返回結果類型

 

答案解析:

兩者都是表示查詢結果集與java對象之間的一種關係,處理查詢結果映射到java對象.

resultMap:表示將查詢結果集中的列一一映射到bean對象的各個屬性.

ResultType:表示的是bean中的對象類,此時可以省略掉resultMap標籤的映射,但是必須保證查詢結果集中的屬性和bean對象類中的屬性是一一對應的,此時大小寫不敏感,但是有限制. 

 

5.JDBC編程有哪些不足之處,MyBatis是如何解決這些問題的?

 

我的答案:(滿分10分,得分7分)

jdbc需要寫實體類的Dao,以及實現類

mybatis通過實體類的mapper,以及mapper.xml反射文件,可以完成實現類的功能,和數據庫進行交互,便於修改維護

 

答案解析:

1.數據庫接創建,釋放頻繁造成系統資源浪費從而影響系統性能,如果使用數據庫接池可解決此問題.

解決:在SqlMapConfig.xml中配置數據接池,使用連接池管理數據庫連接

2.Sql語句寫在代碼中造成代碼不易維護,實際應用sql變化的可能較大,sql變動需要改變java代碼

解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離.

3.向sql語句傳參麻煩,因爲sql語句的where條件不一定,可能多也可能少,佔位符需要和參數一一對應.

解決:Mybatis自動將java對象映射至sql語句.

4.對結果集解析麻煩,sql變化導致解析代碼變化,且解析前需要遍歷,如果能將數據庫記錄封裝成pojo對象(---POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,是爲了避免和EJB混淆所創造的簡稱---)解析比較方便.

解決:Mybatis自動將sql執行結果映射至java對象. 

 

6.常用的動態sql語句標籤有哪些?

 

我的答案:(滿分10分,得分8分)

<select></select>

<insert></insert>

<delete></delete>

<update></update>

答案解析:

if,choose,when,otherwise,trim,set,where,foreach 

 

7.什麼是Maven本地倉庫?Maven到底有哪些倉庫?它們有什麼關係?

我的答案:(滿分10分,得分10分)

maven本地倉庫:默認的本地倉庫是在C盤,我們可以修改本地倉庫的位置,本地倉庫中存放着我們使用過程中下載的jar包

 

Maven有本地倉庫,遠程倉庫,遠程倉庫裏面還有私服

本地倉庫就是計算機上存放着從遠程倉庫或者私服中下載下來的jar包,當需要某個jar包時,會先去本地倉庫查看是否存在該jar包,如果本地倉庫中存在該jar包就直接使用,如果不存在纔會去遠程倉庫或者私服那去下載對應的jar包

遠程倉庫裏面幾乎包含了所有jar包,我們可以通過它下載所需的jar包

私服,像阿里雲,裏面存放了大量的jar包,平時我們從阿里雲下載jar包比遠程倉庫下載的速度快

 

答案解析:

本地倉庫路徑配置(????這什麼鬼)

所以本地倉庫就是相當於加了一次jar包緩存,先到這裏來查,如果這裏查不到,那麼就去私服上找,如果私服也找不到,那麼去中央倉庫去找,找到jar後,會把jar的信息同步到私服和本地倉庫中.

私服,就是公司內部局域網的一臺服務器而已.

中央倉庫:該倉庫存儲了互聯網上的jar,由Maven團隊維護.

 

 

8.maven項目中servlet和jsp的依賴範圍是哪個?它有什麼作用?

我的答案:(滿分10分,得分10分)

provide

提供型依賴,在編譯時和測試時需要,在運行時不需要,需要打包

 

答案解析:

provided:編譯期有效,運行期不需要提供,不會打入包中。

 

 

9.Maven座標是三個要素

我的答案:(滿分10分,得分10分)

GroupId:例如com.ujiuye

A:項目名,例如mybatis1

Version:版本,X.X.X,一般寫成1.0.0,最後一個X代表調試了某個小bug,中間的代表修改了某個方法,第一個表示改動很大,甚至沒什麼關係

答案解析:

groupID,artifactId,version

 

 

10.Mybatis使用mapper接口開發,需要遵循的一些約束條件

我的答案:(滿分10分,得分6分)

有一個mapper接口,還有一個對應的Mapper.xml文件

Mapper.xml文件中配置的與mapper接口名,以及實體類中的屬性名,表中的字段名都需要一一對應

在mybatis-config.xml核心配置文件中需要配置<mapper></mapper>指向mapper.xml

 

答案解析:

(全限定名有絕對路徑的意思,比如一個文件file的存放路徑,其絕對路徑可能是/usr/local/sbin/file; 這個名詞也用在其他地方,比如Java類包的定名:com.linux.struct.sort.bubblesort,從最原始最上層的地方援引到具體的對象,這就是全限定名了)

 

1.映射文件的namespace爲mapper接口的全限定名

2.SQL語句的id爲接口中的方法名

3.parameterType的類型與接口中方法的參數類型一致

4.resultType/resultMap的類型與接口中方法的返回值類型一致

 

發佈了156 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章