主页 > 互联网  > 

MyBatis中的日志和映射器说明

MyBatis中的日志和映射器说明
1.MyBatis中的日志 1.1 什么是日志

​ 在我们编写应用的时候,有一些信息需要及时查看,查看的时候有时需要输出到控制台,有时需要输出到文件。MyBatis也需要日志,一般情况下,使用log4j进行日志管理。

1.2 在MyBatis中使用日志的步骤 1、引入日志的依赖

​ MyBatis默认要引入日志,如果不引入日志就会产生错误,如果引入了日志,但是不对日志进行配置,就会出现警告。

<!-- mvnrepository /artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> 2、日志的级别

log4j在使用的时候需要进行配置,配置的时候一般对日志分为6个级别

级别(从低到高)描述适用场景TRACE提供最详细的程序执行跟踪信息,用于细粒度调试。开发阶段深度排查问题,生产环境通常关闭。DEBUG记录调试信息,帮助开发者了解程序运行细节(如变量值、流程节点)。开发和测试环境,用于定位问题。INFO输出程序运行的关键状态信息(如启动完成、重要操作记录)。生产环境监控运行状态,记录关键流程。WARN提示潜在问题或非预期情况,但不会导致程序中断(如配置缺失、性能下降警告)。需关注但非紧急的问题,提醒运维排查。ERROR记录错误事件,可能导致部分功能失效但程序仍可运行(如数据库连接超时、外部接口异常)。生产环境错误监控,需及时处理。FATAL记录致命错误,导致程序无法继续运行(如内存溢出、系统崩溃)。需立即终止程序并紧急修复的严重问题。

输出目标一般是控制台和文件:

console:控制台file:文件 3、对日志进行配置

1.log4j.appender.console是相关的设置的名字,后面的参数是真正的配置 2.org.apache.log4j.ConsoleAppender:日志的实现类,该类输出到控制台 3.org.apache.log4j.PatternLayout:日志输出布局的实现类 4. [%c]-%m%n:日志输出的格式化

配置代码,配置文件名必须使用log4j.properties,位置放在resources包下

#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/mybatis.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG 2.MyBatis映射器说明 2.1 简介

映射器是 MyBatis 中最重要的文件,文件中包含一组 SQL 语句(例如查询、添加、删除、修改),这些语句称为映射语句或映射 SQL 语句。

映射器由 Java 接口和 XML 文件(或注解)共同组成,它的作用如下。

定义参数类型配置缓存提供 SQL 语句和动态 SQL定义查询结果和 POJO 的映射关系

映射器有以下两种实现方式。

通过 XML 文件方式实现,比如我们在 mybatis-config.xml 文件中描述的 XML 文件,用来生成 mapper。通过注解的方式实现,使用 Configuration 对象注册 Mapper 接口

如果 SQL 语句存在动态 SQL 或者比较复杂,使用注解写在 Java 文件里可读性差,且增加了维护的成本。所以一般建议使用 XML 文件配置的方式,避免重复编写 SQL 语句。

2.2 XML实现映射器

XML 定义映射器分为两个部分:接口和XML。利用映射器实现增删改查会在下文详细介绍,后续会贴上链接地址

mapper文件标签顺序说明:

<!ELEMENT mapper (cache-ref | cache | resultMap* | parameterMap* | sql* | insert* | update* | delete* | select* )+>

!ELEMENT mapper:声明了一个节点,该节点是xml的根节点。

( ):代表节点里应该有哪些子节点。

|:代表子节点没有前后顺序,也可以有或者没有。

*:代表子节点可以没有,也可以有多个

?:代表最多只能有一个。

namespace 用来定义命名空间,该命名空间和定义接口的全限定名一致。

<select> 元素表明这是一条查询语句,属性 id 用来标识这条 SQL。resultType 表示返回的是一个 Student 类型的值。

namespace的前缀必须是包名,后面的命名必须和接口的命名一样。

在 MyBatis 配置文件中添加以下代码。

<package name="org.example.mapper"/>

该语句用来引入 XML 文件,MyBatis 会读取对应 XxxMapper.xml 文件,生成映射器。

2.3 注解实现映射器

使用注解的方式实现映射器,只需要在接口中使用 Java 注解,注入 SQL 即可。如下所示。

public interface StudentMapper { @Select(value = "select * from Student") public List<Website> select(); }

这里我们使用了 @Select 注解,并且注入了和 XML 中相同的 select 语句。

注意:

1.如果使用注解和 XML 文件两种方式同时定义,会报id重复的异常。

2.虽然这里注解的方式看起来比 XML 简单,但是现实中我们遇到的 SQL 会比该例子复杂得多。如果 SQL 语句中有多个表的关联、多个查询条件、级联、条件分支等,显然这条 SQL 就会复杂的多,所以并不建议读者使用这种方式。比如下面这条 SQL。

select * from t_user u left join t_user_role ur on u.id = ur.user_id left join t_role r on ur.role_id = r.id left join t_user_info ui on u.id = ui.user_id left join t_female_health fh on u.id = fh.user_id left join t_male_health mh on u.id = mh.user_id where u.user_name like concat('%', ${userName},'%') and r.role_name like concat('%', ${roleName},'%') and u.sex = 1 and ui.head_image is not null;

如果把以上 SQL 放到 @Select 注解中,无疑会大大降低代码的可读性。如果同时还要考虑使用动态 SQL 或需要加入其他的逻辑,这样就使得这个注解更加复杂了,不利于日后的维护和修改。

此外,XML 可以相互引入,而注解是不可以的,所以在一些比较复杂的场景下,使用 XML 方式会更加灵活和方便。因此大部分的企业都以 XML 为主,本教程也会保持一致,以 XML 方式来创建映射器。当然在一些简单的表和应用中使用注解方式也会比较简单。

这个接口可以在 XML 中定义,将在 mybatis-config.xml 中配置 XML 的语句修改为以下语句即可。

<mapper resource="com/mybatis/mapper/WebsiteMapper2" />

也可以使用 configuration 对象注册这个接口,比如:

configuration.addMapper(WebsiteMapper2.class); 2.4 MyBatis 映射器的主要元素

下面介绍在映射器中可以定义哪些元素,以及它们的作用。

元素名称描述备注mapper映射文件的根节点,只有 namescape 一个属性namescape 作用如下:①用于区分不同的 mapper,全局唯一②绑定DAO接口,即面向接口编程。当 namescape 绑定某一接口后,可以不用写该接口的实现类,MyBatis 会通过接口的完整限定名查找到对应的 mapper 配置来执行 SQL 语句。因此 namescape 的命名必须要跟接口同名。select查询语句,最常用、最复杂的元素之一可以自定义参数,返回结果集等insert插入语句执行后返回一个整数,代表插入的条数update更新语句执行后返回一个整数,代表更新的条数delete删除语句执行后返回一个整数,代表删除的条数parameterMap定义参数映射关系即将被删除的元素,不建议使用sql允许定义一部分的 SQL,然后在各个地方引用它例如,一张表列名,我们可以一次定义,在多个 SQL 语句中使用resultMap用来描述数据库结果集与对象的对应关系,它是最复杂、最强大的元素提供映射规则cache配置给定命名空间的缓存-cache-ref其它命名空间缓存配置的引用- 拓展

关于 MyBatis 的 SQL 映射文件中的 mapper 元素的 namescape 属性有如下要求。

namescape 的命名必须跟某个 DAO 接口同名,同属于 DAO 层,因此代码结构上,映射文件与该接口应放置在同一 package 下(如org.example.mapper),并且习惯上是以 Mapper 结尾(如StudentMapper.java、TeacherMapper.xml)。不同的 mapper 文件中子元素的 id 可以相同,MyBatis 通过 namescape 和子元素的 id 联合区分。接口中的方法与映射文件中的 SQL 语句 id 应一 一对应。
标签:

MyBatis中的日志和映射器说明由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MyBatis中的日志和映射器说明