1.什么是Mybatis?
Mybatis是一种流行的Java对象关系映射(ORM)框架,它将Java对象映射到关系型数据库中的表格。它提供了一种简单的方式来编写SQL语句并将其映射到Java对象,同时避免了很多传统JDBC的冗长代码。在使用Mybatis时,开发人员可以编写简洁的SQL语句,并且可以使用动态SQL和参数映射来进行高效和灵活的数据操作。
除了ORM之外,Mybatis还提供了许多高级功能,如缓存机制、批量操作、分页等等。它可以与多种数据库(如MySQL、Oracle、SQL Server等)和Web框架(如Spring、Spring Boot等)无缝集成,并被广泛应用于各种规模的应用程序中。
2.Mybatis的优缺点?
Mybatis的优点:
- 灵活性强:Mybatis允许开发人员编写自定义SQL语句,能够根据项目需求进行灵活配置和扩展,同时可以避免框架的约束和限制。
- 可读性好:Mybatis使用简洁的XML或注解配置方式,可以清晰地表达SQL语句和数据映射关系,提高代码的可读性和可维护性。
- 性能高:Mybatis提供了高效的缓存机制,能够有效地减少数据库操作的次数,并支持批量操作和分页查询等功能,能够提高应用程序的性能。
- 易于集成:Mybatis可以与多种数据库和Web框架无缝集成,能够适应不同的应用场景,同时也有完善的文档和社区支持。
Mybatis的缺点:
- 学习成本较高:相比于其他ORM框架,MMybatis的缺点:ybatis需要开发人员熟悉SQL语句的编写和调优,需要一定的学习成本。
- 配置较为繁琐:Mybatis的配置文件较多,需要开发人员仔细配置,否则容易出现错误。
- SQL语句调试困难:Mybatis将SQL语句和Java代码分离,当SQL语句出现问题时,调试起来相对困难。
- 不适合小型项目:对于小型项目而言,Mybatis的优势可能不够明显,反而会增加项目的开发成本和复杂度。
3.#{} 和 ${} 的区别是什么?
#{}使用预编译的方式来处理SQL语句中的参数,将传入的参数值以安全的方式替换掉占位符。在SQL语句执行前,会先将#{}替换为一个问号占位符,然后使用PreparedStatement进行预编译,最后将实际的参数值设置到预编译语句中。使用#{}可以有效地防止SQL注入等安全问题,同时也可以避免一些数据类型转换的问题。
${}则是直接将参数值替换到SQL语句中。在SQL语句执行前,会直接将${}替换为对应的参数值,这种方式的好处是可以直接拼接字符串,但也带来了一些安全问题。使用${}时需要开发人员自行保证参数的合法性,否则可能会出现SQL注入等安全问题。
例如:
SELECT * FROM user WHERE name = '${name}'
如果$name的值是 "admin' OR '1'='1",则该SQL语句会查询出所有用户的数据,而不是仅查询用户名为"admin"的用户数据,造成了安全风险。
4.xml 映射文件中有哪些标签?
- CRUD操作标签:包括select、insert、update、delete等标签,用于定义对数据库的增、删、改、查操作。这些标签都包括id、parameterType、resultType等属性,用于指定SQL语句的ID、参数类型和返回结果类型等信息。
- 结果集映射标签:包括<resultMap>和<result>标签,用于定义Java对象和数据库表之间的映射关系,可以将查询结果集映射为Java对象的属性。<resultMap>标签用于定义映射规则,<result>标签用于定义单个属性的映射关系。
- SQL片段标签:包括<sql>和<include>标签,用于定义可重用的SQL代码片段。<sql>标签用于定义SQL语句的代码片段,可以在其他SQL语句中使用,<include>标签用于将其他XML片段引入到当前XML文件中,可以用于复用其他XML片段中定义的SQL语句。
- 动态SQL标签:包括<if>、<choose>、<when>、<otherwise>、<where>、<set>、<foreach>和<bind>等标签,用于动态生成SQL语句中的条件判断、循环、赋值等操作。这些标签可以根据参数值动态生成SQL语句,提高SQL语句的复用性和可维护性。
5.模糊查询 like 语句该怎么写?
下面是两种常见的模糊查询方式:
1.使用占位符(%)进行模糊查询
SQL语句示例:
SELECT * FROM table WHERE column LIKE '%keyword%';
XML映射文件示例:
<select id="selectByKeyword" parameterType="java.lang.String" resultType="com.example.model.Table">SELECT * FROM table WHERE column LIKE CONCAT('%',#{keyword},'%')
</select>
在XML映射文件和注解中,可以使用 CONCAT函数 将占位符与参数进行拼接,生成完整的LIKE语句。
2.使用$符号进行模糊查询
SQL语句示例:
SELECT * FROM table WHERE column LIKE '%${keyword}%';
XML映射文件示例:
<select id="selectByKeyword" parameterType="java.lang.String" resultType="com.example.model.Table">SELECT * FROM table WHERE column LIKE '%${keyword}%'
</select>
在XML映射文件和注解中,可以使用${}占位符将参数直接拼接到SQL语句中,生成完整的LIKE语句。需要注意的是,使用${}方式进行模糊查询存在SQL注入的风险,不建议在生产环境中使用。
6.Mapper 接口的工作原理是什么?Mapper 接口里的方法,参数不同时,方法能重载吗?
Mapper接口是Mybatis提供的一种编写SQL映射的方式,可以将SQL语句与Java方法进行关联,使得Java开发人员可以使用面向对象的方式来编写数据访问代码。Mapper接口的工作原理是:
- 定义Mapper接口:首先,开发人员需要定义一个Java接口,其中每个方法代表一条SQL语句,方法名与SQL语句的ID一致,方法的参数和返回值类型与SQL语句的参数和返回值类型一致。
- 映射Mapper接口:然后,将Mapper接口与SQL语句进行映射,可以使用XML文件或注解的方式进行映射。映射的方式包括指定SQL语句的ID、参数类型、返回值类型等信息。
- 使用Mapper接口:最后,在Java代码中使用Mapper接口来进行数据访问,通过Mybatis框架将Mapper接口中的方法与SQL语句进行绑定,实现对数据库的访问操作。
至于Mapper接口中的方法重载问题,答案是:不可以。在Mapper接口中,每个方法名对应着一个唯一的SQL语句ID,方法名相同会造成冲突,因此Mapper接口中的方法不允许重载。如果需要执行不同的SQL语句,可以使用不同的方法名来实现。
7.MyBatis 是如何进行分页的?分页插件的原理是什么?
1.MyBatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页;2.MyBatis可以使用SQL语句中的LIMIT关键字实现简单的分页,但是对于大数据量的分页查询,需要使用更高效的方法。
3.MyBatis提供了一种基于拦截器的分页插件来优化分页查询。
分页插件的原理是在MyBatis执行SQL语句之前,对其进行拦截并修改SQL语句,从而实现分页查询的功能。具体步骤如下:
- 拦截器初始化:插件在MyBatis启动时进行初始化,创建拦截器对象并将其添加到MyBatis的拦截器链中。
- 拦截器拦截:当进行分页查询时,拦截器会拦截对应的SQL语句,并在其中添加分页的限制条件,例如使用LIMIT关键字进行分页。
- 执行SQL语句:修改后的SQL语句会被传递给MyBatis的执行器,执行器会将SQL语句发送到数据库进行查询,并返回查询结果。
- 封装查询结果:查询结果会被封装到MyBatis的结果对象中,并返回给调用方。
目前比较流行的MyBatis分页插件是PageHelper,其基于拦截器的原理,在拦截器中实现了分页查询的逻辑,并提供了丰富的配置选项和API,可以方便地实现各种复杂的分页查询需求。使用PageHelper进行分页查询的示例代码如下:
// 指定分页查询的页码和每页记录数 PageHelper.startPage(pageNum, pageSize); // 执行查询操作,返回分页查询结果 List<User> userList = userDao.selectUserList(); // 封装分页查询结果 PageInfo<User> pageInfo = new PageInfo<>(userList);
在这段代码中,我们使用了PageHelper的startPage方法来指定分页查询的页码和每页记录数,然后执行普通的查询操作,PageHelper会自动拦截并修改SQL语句,实现分页查询的功能。最后,我们将查询结果封装到PageInfo对象中,以便进行分页信息的显示和处理。