mybatis高频面试题
Maven 的依赖范围有哪些?它们分别表示什么含义?
以下范围的依赖仅在特定运行阶段中使用
-
compile:编译、测试、运行。是默认范围
-
test:测试。不会被主代码使用
-
provided:编译、测试。只有在当 JDK 或者一个容器已提供该依赖之后才使用
-
runtime:测试、运行。会被打包
-
system:编译、测试。和provided相似,不推荐使用
compile:编译范围,指 A 在编译时依赖 B,此范围为默认依赖范围。编译范围的依赖会用在 编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
provided:provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用, provided 依赖在编译和测试时需要,在运行时不需要,比如:servlet api 被 tomcat 容器提供。
runtime:runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc 的驱动包。由于运行时需要所以 runtime 范围的依赖会被打包。
test:test 范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用, 比如:junit。由于运行时不需要所以 test范围依赖不会被打包。
system:system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中 JAR 文件的路径,需要指定 systemPath 磁盘路径,system依赖不推荐使用。
Maven中的传递性依赖是什么意思?如何解决依赖冲突?
依赖性传递:在项目中,Maven会自动读取所有直接依赖的POM,并把必要的间接依赖以传递性依赖的形式引入
解决依赖冲突:使用标签来排除不需要的依赖
传递性依赖:不管Maven项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Maven会自动读取当前项目各个直接依赖的POM,将那些必要的间接依赖以传递性依赖的形式引入到当前项目中
解决依赖冲突:使用标签来排除不需要的依赖
依赖冲突:多个依赖包含相同库的不同版本时造成了包版本冲突
Maven核心概念模型是哪些
- 依赖管理模型:Dependency
- 项目对象模型:POM
Mybatis框架执行流程
- 读取MyBatis配置文件mybatis-config.xml
- 加载映射文件mapper.xml
- 定义SQL语句,在上一步的文件中加载
- 创建会话工厂SqlSessionFactory
- 创建会话SqlSession
- 通过Executor操作数据库
- 输入参数和输出结果
#{}
与${}
区别
#{}:占位符号
${}:拼接符号,会引用sql注入,不安全
#{}
表示一个占位符号#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
${}
表示一个拼接符号,会引用sql注入,所以不建议使用${}。${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
- 在sql语句中给列取属性名的别名
- 在sql映射文件中,手动进行表与类,属性与列的映射
mybatis提供了
<resultMap>
标签进行手动映射
编写sql语句完成如下要求
tb_sales表如下:
Year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成这样一个结果:
Year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
SQL语句:
select Year,
sum(if(month = 1,amount,0)) as 'm1',
sum(if(month = 2,amount,0)) as 'm2',
sum(if(month = 3,amount,0)) as 'm3',
sum(if(month = 4,amount,0)) as 'm4'
from tb_sales
group by Year;
SUM()函数:括号内填写列名,对该列中的值进行求和
只能将SUM函数应用于数字列,NULL值也能进行求和但默认为0
IF()函数:括号内有3个参数,判断式、为真值、为假值
IF(condition, value_if_true, value_if_false)
condition:条件表达式,可以是任何返回布尔值(TRUE或FALSE)的表达式。
value_if_true:如果条件表达式为真,则返回的值。
value_if_false:如果条件表达式为假,则返回的值。