第一週考試題
- 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的類型與接口中方法的返回值類型一致