【Mybatis 框架(自学)】Day04--2022/3/12

生命周期和作用域

重点!讲的是SqlSessionFactoryBuilde、SqlSessionFactory、SqlSession

生命周期和作用域,是至关重要的,因为错误的使用会导致非常严重的并发问题

SqlSessionFactoryBuilder:

  • 一旦创建SqlSessionFactory,就不需要了
  • 所以得放在局部变量当中

SqlSessionFactory:

  • 可以将它看作是:数据库连接池
  • SqlSessionFactory一旦被创建了,就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
  • 所以它的最佳作用域是:应用作用域(与程序共同开启和结束)
  • 因此最简单的就是使用单例模式 or 静态单例模式

SqlSession:

  • 它是连接到连接池的一个请求,请求完即关闭,否则资源被占用
  • SqlSession的实例不是线程安全的,因此不能被共享,所以它的作用域为:请求或方法作用域

解决属性名和字段名不一致的问题(ResultMap)

<!--在日常操作中,数据库表名与实体类名可能不是一一对应的,那么则需要ResultMap来解决-->
public Class Student{
    //学生id:数据库中字段为id
    private Integer id;
    //学生name:数据库中字段为name
    private String name;
    //学生gender:数据库中字段为gender
    private String gender;
    //学生num:数据库中字段为phone
    private Stirng num;
   
    //构造函数省略
    //Getter()与Setter()方法省略
    //toString()方法省略
    //......
}
<!--由于实体类当中的电话字段与数据库表不对应,所以要用到ResultMap,具体操作如下-->
<resultMap id="自定义" type="实体类">
	<id property="实体类的属性" colunm="数据库中的字段"></id>
    <result property="实体类的属性" colunm="数据库中的字段"></result>
    <result property="实体类的属性" colunm="数据库中的字段"></result>
    <!--............................................................-->
</resultMap>

<!--ResultMap可以算是直接将实体类映射到数据库当中-->
<!--property表示实体类当中的属性,colunm表示数据库中的字段-->

日志工厂

如果一个数据库操作出现异常,避免长时间的排查,则需要用到日志

在Mybatis的

logImpl属性:指定Mybatis所用日志的具体实现,未指定时将自动查找

  • SLF4J
  • LOG4J【掌握】
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING 【掌握】
  • STDOUT_LOGGING
  • NO_LOGGING

STDOUT_LOGGING:标准日志输出

<settings>
   <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

Opening JDBC Connection		//开启JDBC连接
Created connection 2130772866.		//创建连接
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7f010382]		//自动提交事务为False
==>  Preparing: select * from tbstudent where id= ?		//预处理Sql语句
==> Parameters: 3(Integer)
<==    Columns: id, name, gender, phone
<==        Row: 3, 学生3, 男, 110
<==      Total: 1
Student{id=3, name='学生3', gender='男', phone='110'}
Resetting autocommit to true on JDBC Connection 		[com.mysql.cj.jdbc.ConnectionImpl@7f010382]			//自动提交事务为True
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@7f010382]	  //关闭JDBC连接
Returned connection 2130772866 to pool.			//将连接返回线程池

LOG4J

什么是LOG4J?

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
  • 我们也可以控制每一条日志的输出格式
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
  • 也可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

引入LOG4J

<!--先导入LOG4J的包-->
<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
</dependency>
<!--配置LOG4J-->
<Settings>
	<setting name="logImpl" value="LOG4J"></setting>
</Settings>
#在(ClassPath-类路径下)resources文件夹里建立log4j.properties



#将等级为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/kuang.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

关于Log4j的简单使用

1.在要使用Log4j的类中导包

2.创建日志对象,参数为当前的class类

//创建日志对象,提升作用域(因为是对StudentDaoTest的记录)
    static Logger logger = Logger.getLogger(StudentDaoTest.class);

3.日志级别

//常用的
logger.info("info:进入了loggerTest");
logger.debug("debug:进入了loggerTest");
logger.error("error:进入了loggerTest");
posted @   VVS,冷漠的心  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

囚鸟该如何超越今生?

点击右上角即可分享
微信分享提示