最后
看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。
注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友
互联网工程师必备的面试1000题
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
如果传入的是基本类型,那么#{}中的变量名称可以随意写
如果传入的参数是pojo类型,那么#{}中的变量名称必须是pojo中的属性.属性名(user.username)
${}拼接符:字符串原样拼接(有sql注入的风险)
如果传入的是基本类型,那么${}中的变量名必须是value
如果传入的参数是pojo类型,那么${}中的变量名称必须是pojo中的属性.属性名(user.username)
注意:使用拼接符有可能造成sql注入,在页面输入的时候可以加入校验,不可输入sql关键字,不可输入空格
注意:如果是取简单数量类型的参数,括号中的值必须为value
例: select * from user where username like ‘%${value}%’
可以这样写来解决sql注入:select * from user where username like ‘%’ #{name}’%’(开发经常使用)
入门
–
注意本程序只是为了理解mybatis的使用,实际开发中可能不这样使用
SqlMapConfig.xml配置:
(并不固定,可以写别的名称)mybatis基本配置
<?xml version="1.0" encoding="UTF-8" ?><!—关联映射–>
经测验映射文件最好和核心配置文件在一个文件夹下
properties(属性)
settings(全局配置参数)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
Mapper配置文件
配表与pojo关系,以及sql
select * from user where id = #{id}
id: sql语句的唯一标识,与dao接口中的方法名一致
parameterType:定义输入到sql中的映射类型(请求参数),#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。id 可以用任意字符代替并不固定
resultType:定义结果映射类型(返回值)。
注意:当返回值是List集合时他的类型就是泛型的类型
mybatis支持别名:
| 别名 | 映射类型 |
| — | — |
| _byte | byte |
| _long | long |
| _short | short |
| _int | int |
| _integer | int |
| _double | double |
| _float | float |
| _boolean | boolean |
| string | String |
| byte | Byte |
| long | Long |
| short | Short |
| int | Integer |
| integer | Integer |
| double | Double |
| float | Float |
| boolean | Boolean |
| date | Date |
| decimal | BigDecimal |
| bigdecimal | BigDecimal |
| map | Map |
动态Sql
If
通过mybatis提供的各种标签方法实现动态拼接sql
原始sql语句:
SELECT * FROM USER WHERE username LIKE ‘%王%’ AND sex= ’2’
Mybatis中简单的sql语句:
SELECT * FROM USER WHERE username LIKE ‘%${username}%’ AND sex=#{sex}
trim
前缀’and’ 被’(’ 替换
prefix:前缀覆盖并增加其内容 不写的话默认替换为空
suffix:后缀覆盖并增加其内容 不写的话默认替换为空
prefixOverrides:前缀判断的条件
suffixOverrides:后缀判断的条件
使用动态sql语句:
where
SELECT * FROM USER
AND username LIKE ‘%${username}%’
AND sex=#{sex}
可以自动去除sql语句where关键字后的and关键字
Foreach
向sql传递数组或List, mybatis使用foreach解析,可以做批量处理
Sql语句:
SELECT * FROM USER WHERE id IN (1,10,16)
使用foreach赋值:
SELECT * FROM USER
#{id}
foreach:循环传入的集合参数
collection:传入的集合的变量名称(要遍历的值)
item:每次循环将循环出的数据放入这个变量中
open:循环开始拼接的字符串
close:循环结束拼接的字符串
separator:循环中拼接的分隔符
批量修改实例:
sql:
UPDATE rc_notify_queue SET queue_status = ‘E’,execute_time=NOW() WHERE notify_queue_Id IN (3,22,11)
UPDATE rc_notify_queue SET queue_status = ‘E’,execute_time=NOW()
#{notify.notifyQueueId}
一个大神朋友写的批量修改:
choose
if标签是与(and)的关系,而 choose 是或(or)的关系。
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。
sql片段
Sql中可将重复的sql提取出来,使用时用include引用即可,最终达到sql重用的目的
将where条件抽取出来:
AND username LIKE ‘%${username}%’
引用:
SELECT * FROM USER
注意:也可在sql标签中也可以只放if标签
_parameter : 参数的引用
关联查询:
多表查询返回的数据是两个表中的数据这样就出现了数据封装的问题
写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
多表查询返回的数据是两个表中的数据这样就出现了数据封装的问题
写在最后
还有一份JAVA核心知识点整理(PDF):JVM,JAVA集合,JAVA多线程并发,JAVA基础,Spring原理,微服务,Netty与RPC,网络,日志,Zookeeper,Kafka,RabbitMQ,Hbase,MongoDB,Cassandra,设计模式,负载均衡,数据库,一致性哈希,JAVA算法,数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算…
[外链图片转存中…(img-ciTUWSyS-1715576819341)]