欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > Mybatis 小结

Mybatis 小结

2025/2/22 2:04:42 来源:https://blog.csdn.net/whs_8792/article/details/144728210  浏览:    关键词:Mybatis 小结

 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的优点:

  1. 灵活性强:Mybatis允许开发人员编写自定义SQL语句,能够根据项目需求进行灵活配置和扩展,同时可以避免框架的约束和限制。
  2. 可读性好:Mybatis使用简洁的XML或注解配置方式,可以清晰地表达SQL语句和数据映射关系,提高代码的可读性和可维护性。
  3. 性能高:Mybatis提供了高效的缓存机制,能够有效地减少数据库操作的次数,并支持批量操作和分页查询等功能,能够提高应用程序的性能。
  4. 易于集成:Mybatis可以与多种数据库和Web框架无缝集成,能够适应不同的应用场景,同时也有完善的文档和社区支持。

 Mybatis的缺点:

  1. 学习成本较高:相比于其他ORM框架,MMybatis的缺点:ybatis需要开发人员熟悉SQL语句的编写和调优,需要一定的学习成本。
  2. 配置较为繁琐:Mybatis的配置文件较多,需要开发人员仔细配置,否则容易出现错误。
  3. SQL语句调试困难:Mybatis将SQL语句和Java代码分离,当SQL语句出现问题时,调试起来相对困难。
  4. 不适合小型项目:对于小型项目而言,Mybatis的优势可能不够明显,反而会增加项目的开发成本和复杂度。


3.#{} 和 ${} 的区别是什么?


#{}使用预编译的方式来处理SQL语句中的参数,将传入的参数值安全的方式替换掉占位符。在SQL语句执行前,会先将#{}替换为一个问号占位符,然后使用PreparedStatement进行预编译,最后将实际的参数值设置到预编译语句中。使用#{}可以有效地防止SQL注入等安全问题,同时也可以避免一些数据类型转换的问题。


${}则是直接将参数值替换到SQL语句中。在SQL语句执行前,会直接将${}替换为对应的参数值,这种方式的好处是可以直接拼接字符串,但也带来了一些安全问题。使用${}时需要开发人员自行保证参数的合法性,否则可能会出现SQL注入等安全问题。

   例如:

SELECT * FROM user WHERE name = '${name}'

如果$name的值是 "admin' OR '1'='1",则该SQL语句会查询出所有用户的数据,而不是仅查询用户名为"admin"的用户数据,造成了安全风险。

4.xml 映射文件中有哪些标签?

  1. CRUD操作标签:包括select、insert、update、delete等标签,用于定义对数据库的增、删、改、查操作。这些标签都包括id、parameterType、resultType等属性,用于指定SQL语句的ID、参数类型和返回结果类型等信息。
  2. 结果集映射标签:包括<resultMap>和<result>标签,用于定义Java对象和数据库表之间的映射关系,可以将查询结果集映射为Java对象的属性。<resultMap>标签用于定义映射规则,<result>标签用于定义单个属性的映射关系。
  3. SQL片段标签:包括<sql>和<include>标签,用于定义可重用的SQL代码片段。<sql>标签用于定义SQL语句的代码片段,可以在其他SQL语句中使用,<include>标签用于将其他XML片段引入到当前XML文件中,可以用于复用其他XML片段中定义的SQL语句。
  4. 动态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接口的工作原理是:

  1. 定义Mapper接口:首先,开发人员需要定义一个Java接口,其中每个方法代表一条SQL语句,方法名与SQL语句的ID一致,方法的参数和返回值类型与SQL语句的参数和返回值类型一致。
  2. 映射Mapper接口:然后,将Mapper接口与SQL语句进行映射,可以使用XML文件或注解的方式进行映射。映射的方式包括指定SQL语句的ID、参数类型、返回值类型等信息。
  3. 使用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语句,从而实现分页查询的功能。具体步骤如下:

  1. 拦截器初始化:插件在MyBatis启动时进行初始化,创建拦截器对象并将其添加到MyBatis的拦截器链中。
  2. 拦截器拦截:当进行分页查询时,拦截器会拦截对应的SQL语句,并在其中添加分页的限制条件,例如使用LIMIT关键字进行分页。
  3. 执行SQL语句:修改后的SQL语句会被传递给MyBatis的执行器,执行器会将SQL语句发送到数据库进行查询,并返回查询结果。
  4. 封装查询结果:查询结果会被封装到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对象中,以便进行分页信息的显示和处理。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词