Java-面试题(待修改)

目录

1.linux

2.mybatis 

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

 MyBatis编程步骤是什么样的?

请说说MyBatis的工作原理

为什么需要预编译

 Mybatis都有哪些Executor执行器?它们之间的区别是什么?

17. #{}和${}的区别

 模糊查询like语句该怎么写

3.数据库 

优化数据库的方法

31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)

32、数据库中的事务是什么?

SQL 注入漏洞产生的原因?如何防止?


1.linux

(106条消息) Linux 常用操作命令大全(最后更新时间:2022年1月)_linux常用命令_Engineer-Yao的博客-CSDN博客

2.mybatis 

为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?


Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根
据对象关系模型直接获取,所以它是全自动的。
而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动
ORM映射工具。
————————————————

 MyBatis编程步骤是什么样的?


1、 创建SqlSessionFactory
2、 通过SqlSessionFactory创建SqlSession
3、 通过sqlsession执行数据库操作
4、 调用session.commit()提交事务
5、 调用session.close()关闭会话
————————————————


请说说MyBatis的工作原理

1.读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运
行环境等信息,例如数据库连接信息。
2.加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在
MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文
件,每个文件对应数据库中的一张表。
3.构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。
4.创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
5.Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession
传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
6.MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参
数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
7.输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类
型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
8.输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类型和 POJO 类
型。输出结果映射过程类似于 JDBC 对结果集的解析过程。
————————————————
 

为什么需要预编译


定义:
SQL 预编译指的是数据库驱动在发送 SQL 语句和参数给 DBMS 之前对 SQL 语句进行编译,
这样 DBMS 执行 SQL 时,就不需要重新编译。

为什么需要预编译


JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译。预编译阶段可以优
化 SQL 的执行。预编译之后的 SQL 多数情况下可以直接执行,DBMS 不需要再次编译,

复杂的SQL,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。同时预编译
语句对象可以重复利用。把一个 SQL 预编译后产生的 PreparedStatement 对象缓存下来,
下次对于同一个SQL,可以直接使用这个缓存的 PreparedState 对象。Mybatis默认情况下,
将对所有的 SQL 进行预编译。
还有一个重要的原因,复制SQL注入
————————————————


 Mybatis都有哪些Executor执行器?它们之间的区别是什么?


Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor。
SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭
Statement对象。
ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存
在就创建,用完后,不关闭Statement对象,而是放置于Map<String, Statement>内,供下一次
使用。简言之,就是重复使用Statement对象。
BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批
处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个
Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相
同。
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内。
————————————————


17. #{}和${}的区别


#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。
Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用
PreparedStatement的set方法来赋值。
#{} 可以有效的防止SQL注入,提高系统安全性;${} 不能防止SQL 注入
#{} 的变量替换是在DBMS 中;${} 的变量替换是在 DBMS 外
————————————————


 模糊查询like语句该怎么写


1 ’%${question}%’ 可能引起SQL注入,不推荐
2 “%”#{question}“%” 注意:因为#{…}解析成sql语句时候,会在变量外侧自动加单引号’ ',所以
这里 % 需要使用双引号" ",不能使用单引号 ’ ',不然会查不到任何结果。
3 CONCAT(’%’,#{question},’%’) 使用CONCAT()函数,(推荐)
4 使用bind标签(不推荐)
————————————————
(106条消息) 【2022最新Java面试宝典】—— MyBatis面试题(37道含答案)_java mybatis面试_超级码里喵的博客-CSDN博客

3.数据库 

优化数据库的方法

1、选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置 NOTNULL, 例如’ 省份’、’ 性别’ 最好适用 ENUM
2、使用连接(JOIN)来代替子查询
3、适用联合(UNION)来代替手动创建的临时表
4、事务处理
5、锁定表、优化事务处理
6、适用外键, 优化锁定表
7、建立索引
8、优化查询语句
————————————————
 

31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)


索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分), 它们包含着对数据表里所有记录的引用指针。
普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度。
普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值, 在为
这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一索引。也就是说, 唯一索引可以保证数据记录的唯一性。
主键, 是一种特殊的唯一索引, 在一张表中只能定义一个主键索引, 主键用于唯一标识一条记录, 使用关键字 PRIMARY KEY 来创建。

索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度, 但是会降低插入、删除、更新表的速度, 因为在执行这些写操作时, 还要操作索引文件。
————————————————
 

32、数据库中的事务是什么?


事务( transaction) 是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功, 则认为
事务成功, 即使只有一个操作失败, 事务也不成功。如果所有操作完成, 事务则提交, 其修改将作用
于所有其他数据库进程。如果一个操作失败, 则事务将回滚, 该事务所有操作的影响都将取消。


事务特性:
1、原子性: 即不可分割性, 事务要么全部被执行, 要么就全部不被执行。
2、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状 态
3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何 其他事务,
4、持久性。事务正确提交后, 其结果将永久保存在数据库中, 即使在事务提交后有了其他故障, 事务的处理结果也会得到保存。或者这样理解:事务就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组, 如果任何一个语句操作失败那么整个操作就被失败, 以后操作就会回滚到操作前状态, 或者是上有个节点。为了确保要么执行, 要么不执行, 就可以使用事务。要将有组语句作为事务考虑, 就需要通过 ACID 测试, 即原子性, 一致性, 隔离性和持久性。

SQL 注入漏洞产生的原因?如何防止?

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

(1) 参数化SQL:在设计与数据库连接并访问数据时,在需要填入数值或者数据的地方,使用参数(Parameter)来给值,用@来表示参数。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。

(2)字符串过滤

(3)使用正则表达式过滤传入的参数

(4)前端js防范SQL注入

(5)在数据库中限制用户权限,drop/create/truncate等权限谨慎grant

(6)多使用数据库自带的安全参数。如在SQLServer数据库中提供了Parameter这个集合,这个集合提供类型检查和长度验证的功能。如果管理员采用了 Parameter这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。因为此时数据库只把它当作普通的字符来处理。
————————————————

37、解释 MySQL 外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中, 即内连接只连接匹配的行。


外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行, 这三种情况依次称之为左外连接, 右外连接, 和全外连接。

左外连接, 也称左连接,左表为主表, 左表中的所有记录都会出现在结果集中, 对于那些在右表中并没有匹配的记录, 仍然要显示, 右边对应的那些字段值以NULL 来填充。

右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,
————————————————
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值