面试题(三)mybatis

发布时间:2024年01月22日

1、动态sql标签

  • if标签(逻辑判断)
  • where标签(SQL判断)
  • choose,when,otherwise(Java中的switch)
  • set (sql修改)
  • trim(截断 添加)
  • bind(模糊查询)
  • foreach(循环)
  • sql (复用)

2、mybatis是如何实现缓存的?什么是一级缓存,什么是二级缓存?

把经常访问但是不经常修改的数据存储在缓存内容中,减少与数据库交互,从而达到提高效率的目的

①、一级缓存

默认存在,无法关闭

缓存的数据存储在SQLSession对象中(类似Map集合,键对应的sql语句,值就是语句对应的结果)

不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

②、二级缓存

是把缓存的数据存储在SQLSessionFactory上面(对象内部)

二级缓存的数据,所有的session可以共用

二级缓存默认关闭,使用的需要配置

3、mybatis是如何做分页的?

1、数组分页

先查询出所有数据,再使用subList()方法进行数据分页,不实用,还是会占用大量内存

2、SQL分页

SELECT * FROM table_name LIMIT #{startIndex}, #{pageSize};

3、RowRounds分页

RowBounds 是 MyBatis 提供的一个分页辅助类,它允许你直接在 SQL 映射文件中实现分页

RowBounds rowBounds = new RowBounds((currPage - 1) * pageSize, pageSize);
List<User> list = sqlSession.selectList("com.eric.entity.UserMapper.getAll", null, rowBounds);

4、分页插件

MyBatis 分页插件是另一种实现分页的方式,它通过拦截器拦截 SQL 语句,然后动态地添加 limit 子句来实现分页。

PageHelper.startPage(pageNo, pageSize);
List<User> page = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(page);

5、可以使用limit进行分页,这是数据库自带的分页方式

4、什么是内置对象

在某种编程语言或框架中,已经预先定义并且可以直接使用的对象。

内置对象的特点和优势:

1、方便性:内置对象提供了许多常见的功能和操作,可以直接使用,无需自己编写复杂的代码。

2、高效性:内置对象通常经过优化,性能较好,可以提高程序的运行效率。

3、可复用性:内置对象可以被多个程序或模块复用,减少了代码的重复编写。

4、可维护性:内置对象由语言或框架提供,维护和更新由开发者社区或团队负责,可以保证其稳定性和可靠性。

5、为什么dao层接口不能方法重载

因为mybatis中,dao层的方法时通过动态代理来实现的,方法名会被作为id,id具有唯一性,所以不能进行方法重载

6、为什么mybatis是个半自动化的框架

mybatis并不完全自动进行数据访问,需要开发者自己写sql语句

7、mybatis如何做模糊查询(5种方法在代码里)

<!--	模糊查询-->
<select id="" parameterType="String" resultType="Teacher">
-- 	select * from teacher where tname like '#{v}%';
-- 有问题,''会把#{v}%当成一个字符串,没法传递数据

	select * from teacher where tname like #{v}
--1	从view层就接受%,这里就不用改,不推荐
	select * from teacher where tname like concat{#{v,'%'}
--2	concat进行字符串拼接

	select * from teacher where tname like ${v}%
--3 	${}是纯字符串拼接,不能防止sql注入,不能用啊,用来理解${},#{}的区别

	select * from teacher where tname like #{v}"%"
--4 	#{v}最后会被翻译成'张',后面是"%",这个是单双引号交替出现,手册上找不到但是好用

<bind name="x" value="_parameter+'%'"/>
    select * from teacher where tname like #{x}
--5 	bind标签,官方推荐,bind是用来定义变量的
</select>

8、mybatis是如何获取自动生成的主键的

<!--	把获取的主键的值放入我们设置的属性 useGeneratedKeys原本是false的,要改为true,keyProperty是-->
	<insert id="AddTeacher" parameterType="Teacher" useGeneratedKeys="true" keyProperty="tid">
		insert into Teacher(tname,tsex,tbirthday,taddress,temail,tmoney)
		values(#{tname},#{tsex},#{tbirthday},#{taddress},#{temail},#{tmoney})
	</insert>

9、mybatis出传递多参的方式

<!--	传多参最好用的javabean-->
	<select id="selteacherFenye" resultType="Teacher" parameterType="map">
		select * from teacher limit #{curpage},#{sp}
	</select>

<!--	传多参,arg是从0开始,param是从1开始,但是慎用-->
	<select id="selteacherarg" resultType="Teacher">
		select * from teacher where tsex = #{arg0} and tid = #{arg1}
	</select>
	<select id="selteacherparam" resultType="Teacher">
		select * from teacher where tsex = #{param1} and tid = #{param2}
	</select>

10、mybatis解决了JDBC什么问题(4)

硬编码

SQL参数固定(动态sql)

代码重复度高

底层技术

11、mybatis怎么实现一对一,一对多查询

一对多可以通过 <resultMap> 标签中的 <collection> 子标签来完成

<resultMap id="userAccountResultMap" type="User">
  <id column="id" property="id" />
  <result column="username" property="username" />
  <result column="email" property="email" />
  <!-- 一对多关联查询 -->
  <collection property="accounts" ofType="Account" column="id" select="selectAccounts" />
</resultMap>

<select id="selectUser" resultMap="userAccountResultMap">
  SELECT * FROM user WHERE id = #{id}
</select>

<select id="selectAccounts" resultType="Account">
  SELECT * FROM account WHERE user_id = #{id}
</select>

一对一查询可以通过 <resultMap> 标签中的 <association> 子标签来完成。

<resultMap id="userResultMap" type="User">
  <id column="id" property="id" />
  <result column="username" property="username" />
  <result column="email" property="email" />
  <!-- 一对一关联查询 -->
  <association property="address" column="id" select="selectAddress" />
</resultMap>

<select id="selectUser" resultMap="userResultMap">
  SELECT * FROM user WHERE id = #{id}
</select>

<select id="selectAddress" resultType="Address">
  SELECT * FROM address WHERE user_id = #{id}
</select>
文章来源:https://blog.csdn.net/qq_64669006/article/details/135756402
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。