面试题---Mybatis

Mybatis

MyBatis中${}取值和#{}取值的区别

{}能够防止SQL注入,因为底层使用PreparedStatement对象,预编译,性能较高

${}不能防止SQL注入,因为底层使用Statement对象,不会预编译而是拼接字符串,性能较低

能使用#{}时尽量使用#{},如果需要动态传入表名或者字段名需要用 ${}比如,像 ORDER BY 时只能使用${}

MyBatis关联查询中,延迟加载和饥饿加载的区别

延迟加载,是先从单表查询,需要使用关联数据的时候才发起关联查询,不用的时候不查询关联的数据,又叫懒加载,饥饿加载,是在查询时将关联的数据立即查询出来加载进内存,不管用不用

MyBatis对象关联查询和集合关联查询怎么做

单个关联对象用associate ,适用于多对一的关联查询,使用javaType来定义实体类型,集合用collection,适用于一对多的关联查询,使用ofType来定义集合的泛型类型

MyBatis一级缓存和二级缓存的区别

缓存,是指将从数据库查询出的数据存放在缓存中,下次使用相同查询时不必再从数据库查询,而是直接从缓存中读取,从而减轻数据库查询的压力,提高性能

mybaits中的一级缓存,是SqlSession级别,默认开启,使用同一个SqlSession发送相同的SQL时命中;它的生命周期和SqlSession一致,当调用SqlSession.close()方法时会释放缓存

mybatis中的二级缓存,是namespace级别,默认不开启,执行同一个namespace的相同statement,发送相同的SQL时命中;它的生命周期是程序结束

当SQL中执行了update()、delete()、insert()操作,则缓存中的数据都会清空

MyBaits的Mapper接口没有实现类为社么可以用@Autowired直接注入

动态代理,赋值给mapper接口引用的对象其实是一个代理对象,这个代理对象是由 JDK 动态代理创建的。在解析mapper的时候,mybatis会通过java反射,获取到接口所有的方法

当调用接口中方法时,将通过接口全限定名+方法名对应找到映射文件中namespace和id匹配的sql,然后将执行结果返回

在MyBatis如何动态修改SQL

使用Mybatis的拦截器可以做到

MyBatis的动态SQL标签有哪些?

if标签:条件判断

choose、when、otherwise标签:选择结构,类似java中的switch

trim标签:对包含的内容加上前缀,后缀

where标签:主要是用来简化SQL语句中where条件判断的,能智能的处理and or,不必担心多余导致语法错误

foreach标签:遍历元素

Mybatis的mapper如何传递多个参数

方式一,可以使用map进行传参,SQL中使用map的key来引用取值

方式二,可以在SQL中使用#{param1},#{param2}...来引用取值,它是根据mapper接口对应方法中形参的顺序进行匹配的,不管接口方法的参数名字叫个啥,SQL都只能使用param1,param2,等来取值

方式三,可以使用@Param注解,给mapper接口方法的参数命名,在SQL中直接使用取的名字来引用

Mybatis,关联对象查询,使用嵌套子查询和JOIN连表有什么区别

嵌套子查询,指的是在查询一个主对象的时候,使用单表查询,在resultmap中额外发送一个子sql查询关联对象,然后映射给主对象

连表join查询,指的是查询一个主对象的时候,使用join连表的方式把主对象和关联对象的数据一次性查出来,用resultmap映射结果

他们的区别,join连表查询只发一条sql就能把数据查询出来,嵌套子查询会有一个n+1的问题,就是说如果主查询出来n条数据,那么会额外发送n条子sql去查询对应的关联对象,加上主查询那1次,也就是n+1次,因此它的性能相对较低的,一般我们会使用join连表查询

为什么要使用连接池

对数据库的操作都需要取得连接,使用完都需要关闭连接,如果每次操作需要打开关闭连接,这样系统性能很低下。连接池就可以动态的管理这些连接的申请,使用和释放,我们操作数据库只需要在连接池里获取连接,使用完放回连接池,这样大大节省了内存,提高效率。

数据库连接池的原理主要分为三部分

  • 第一,连接池的建立,在系统初始化时建立几个连接对象以便使用。

  • 第二,连接池的管理,客户请求连接数据库时,首先查看连接池中是否有空闲连接,如果有直接分配,如果没有就等待,直到超出最大等待时间,抛出异常

  • 第三,连接池的关闭,当系统关闭时,连接池中所有连接关闭

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些可能的 Mybatis-plus 面试题: 1. 什么是 Mybatis-plus? Mybatis-plus 是基于 Mybatis 的增强工具,简化了 Mybatis 的开发流程,提供了许多方便的功能,如自动生成代码、注解支持、通用 CRUD 操作等。 2. Mybatis-plus 的优势是什么? Mybatis-plus 有以下优势: - 简化开发流程,提高开发效率。 - 提供了许多方便的功能,如自动生成代码、注解支持、通用 CRUD 操作等。 - 提供了一些实用的插件,如分页插件、性能分析插件等。 - 支持 Lambda 表达式,可以更方便地编写条件查询。 3. Mybatis-plus 的架构是什么样的? Mybatis-plus 的架构包括以下组件: - Entity:实体类,对应数据库中的表。 - Mapper:数据访问层,与数据库交互的接口。 - Service:业务逻辑层,处理业务逻辑。 - Controller:控制层,接收请求并调用 Service 处理请求。 4. Mybatis-plus 的注解有哪些? Mybatis-plus 支持以下注解: - @TableName:指定实体类对应的数据库表名。 - @TableId:指定实体类的主键属性。 - @TableField:指定实体类属性对应的数据库列名。 - @Version:指定实体类的乐观锁属性。 5. Mybatis-plus 如何实现分页查询? Mybatis-plus 提供了一个分页插件,可以方便地实现分页查询。具体实现步骤如下: - 添加分页插件依赖。 - 在 Mybatis 配置文件中配置分页插件。 - 在 Mapper 接口中添加查询方法,并使用 Page 类作为参数。 - 在 Service 层中调用 Mapper 接口的查询方法,传入 Page 对象。 6. Mybatis-plus 如何实现条件查询? Mybatis-plus 支持 Lambda 表达式,可以更方便地编写条件查询。具体实现步骤如下: - 在实体类中定义查询条件属性。 - 在 Mapper 接口中添加查询方法,并使用 LambdaQueryWrapper 类构建查询条件。 - 在 Service 层中调用 Mapper 接口的查询方法,传入 LambdaQueryWrapper 对象。 7. Mybatis-plus 如何实现自动生成代码? Mybatis-plus 提供了一个代码生成器,可以方便地生成 Entity、Mapper、Service 和 Controller 等代码。具体实现步骤如下: - 添加代码生成器依赖。 - 在配置文件中配置代码生成器相关信息。 - 运行代码生成器,生成代码。 8. Mybatis-plus 如何实现多表关联查询? Mybatis-plus 支持多表关联查询,可以使用 JoinWrapper 类进行关联查询。具体实现步骤如下: - 在 Mapper 接口中添加查询方法,并使用 JoinWrapper 类构建关联查询条件。 - 在 Service 层中调用 Mapper 接口的查询方法,传入 JoinWrapper 对象。 9. Mybatis-plus 如何实现乐观锁? Mybatis-plus 支持乐观锁,可以使用 @Version 注解指定乐观锁属性。具体实现步骤如下: - 在实体类中添加 @Version 注解。 - 在 Mapper 接口中添加更新方法,使用 UpdateWrapper 类构建更新条件。 - 在 Service 层中调用 Mapper 接口的更新方法,传入 UpdateWrapper 对象。 10. Mybatis-plus 如何进行性能优化? Mybatis-plus 的性能优化可以从以下方面入手: - 使用缓存,减少数据库访问次数。 - 合理使用分页插件,避免一次查询过多数据。 - 避免使用大量嵌套查询。 - 使用索引优化查询效率。 - 合理使用数据库连接池,避免频繁创建连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值