【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");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?