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