1、Maven项目依赖中作用范围scope?
当一个Maven工程添加了对某个jar包的依赖后,这个被依赖的jar包可以对应下面几个可选的范围,
默认是compile。
依赖范围 |
编译(main) |
测试(test) |
部署 |
示例 |
compile |
√ |
√ |
√ |
log4j |
provided |
√ |
√ |
× |
servlet-api lombok |
test |
× |
√ |
× |
junit |
runtime |
× |
√ |
√ |
JDBC驱动类 |
system |
√ |
√ |
× |
和provided相似,很少用 |
import |
× |
× |
× |
只能与dependencyManagement配合使用;学习SpringBoot时会使用 |
2、Maven项目之间的三种关系及其特征?
- 依赖关系(兄弟关系、朋友关系):
- 项目A依赖项目B,项目A可以访问项目B中某些依赖,避免重复提供
- 缺点:但是只有范围为compile时可以访问
- 继承关系(父子关系,并列关系):
- 使用继承时,需要定义父项目和子项目
- 继承关系是单向关系:子项目指定父项目,父项目不用指定子项目
- 父项目的所有的依赖(compile、test、provided等)子项目都可以自动使用
- 父项目中可以通过dependencyManagement来管理依赖,子项目如果需要必须手动声明
- 缺点:彼此间是并列关系,父项目、子项目需要分别逐个手动进行clean、compile操作
- 聚合关系(父子关系,包含关系):
- 首先是继承关系,并且比继承关系更进一步
- 在聚合关系中, 子项目明确父项目, 但是父项目明确子项目,是双向关系
- 其实是一个大项目包含多个子项目,对父项目进行clear、compile等命令,
是对所有子项目进行clear、compile命令。但是如果对一个子项目进行maven操作,不影响其他子项目
3、如何理解框架framework?
- 生活案例:不需要自己盖房,直接购买毛坯房即可,自己来装修,质量户型有保证,还节省了建房的时间。
在开发过程中使用的框架就好比毛坯房。
- 框架= jar(大量最佳实践基础上的对特定问题的固定解决方案进行封装并提供相应的API)
+ 配置文件(个性化定制,配置变化的内容,比如数据库连接参数、端口号、接口的具体实现类等)
- 作用1:可以保证减少开发时间、降低开发难度,并且还保证设计质量。好比和世界上最优秀的软件工程师是
一个项目的,并且他们完成的还是基础、全局的工作。想想是不是很嗨的一件事情。
- 作用2:框架还有一个作用是约束,统一了代码流程和风格。同样的技术解决同样的问题会产生不同流程和
风格的解决方案,而采用一种框架其实就是限制用户必须使用其规定的方案来实现,可降低程序员
之间沟通以及日后维护的成本。
- 常用的基于JavaEE的三大开源框架,已经从SSH、SSH2过渡到了SSM:SpringMVC、Spring、MyBatis。
- 总之,框架是一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用
封装好的API可以省去很多代码编写,从而提高工作效率和开发速度,并统一了风格(这一点不要忽略掉)。
4、如何理解ORM
- JDBC的缺点:需要手动的完成面向对象的Java语言、面向关系的数据库之间数据的转换,代码繁琐无技术含量,
影响了开发效率(查询时需要手动的将结果集ResultSet的列数据转换为Java对象的属性;
而添加操作时需要手动将Java对象的属性转换为数据库表的列字段)。
- 关于面向对象的Java语言、面向关系的数据库之间数据的转换必须要做,问题在于这个转换是否可以不由开
发者来做。可以的。ORM框架就是专门来做这个问题的,相当于在面向对象语言和关系数据库之间搭建
一个桥梁。
- ORM,Object-Relationl Mapping,对象关系映射,它的作用是在关系型数据库和对象之间作一个映射,
这样我们在具体的操作数据库的时候,只要像平时操作对象一样操作它就可以了,
ORM框架会根据映射完成对数据库的操作,就不需要再去和复杂的SQL语句打交道了。
Hibernate是一个全自动的ORM框架。因为Hibernate创建了Java对象和数据库表之间的完整映射,
可以完全以面向对象的思想来操作数据库,程序员不需要手写SQL语句。MyBatis中还需要手写SQL语句,
所以是半自动化的。但是最终MyBatis却战胜了Hibernate,主要还是因为MyBatis可以更加精确的定义SQL,
更加灵活,也便于优化性能。

5、MyBatis中#{}和${}的区别是什么?
- #{}是预编译处理,${}是字符串替换。
- Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
- Mybatis在处理${}时,就是把${}替换成变量的值。
- 使用#{}可以有效的防止SQL注入,提高系统安全性。
6、MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办
- 方法1:启用驼峰命名。前提,属性名和字段名虽然不同,但是满足驼峰命名规则。比如字段名是emp_name、
house_type_id,但是属性名是empName、HouseTypeId。
<settings>
<!-- 将xxx_xxx这样的列名自动映射到xxXxx这样驼峰式命名的属性名 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
- 方法2:起别名。数据库表的字段的别名就起为实体类中对应属性名。
select emp_id as empId,emp_name as empName,emp_sal as salary from t_emp<br>|
- 方法3:进行ResultMap映射。一次性定义,重复使用,避免重复起别名。
<resultMap id="employeeMap" type="com.atguigu.mybatis.entity.Employee">
<!-- 使用id标签设置主键列和主键属性之间的对应关系 --><br>
<!-- column属性用于指定字段名;property属性用于指定Java实体类属性名 -->
<id column="emp_id" property="empId"/>
<!-- 使用result标签设置普通字段和Java实体类属性之间的关系 -->
<resul