第一周考试题整理

第一周考试题

  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的类型与接口中方法的返回值类型一致

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值