文章目录
MyBatis:Day 02
一、生命周期和作用域
理解不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
- 一旦创建了 SqlSessionFactory,就不再需要它了;
- 最佳作用域是方法作用域(也就是局部方法变量)。
SqlSessionFactory :相当于数据库连接池
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,最佳实践是在应用运行期间不要重复创建多次;
- 最佳作用域是应用作用域;
- 最简单的就是使用单例模式或者静态单例模式。
SqlSession :相当于连接到连接池的一个请求
- 每个线程都应该有它自己的 SqlSession 实例;
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域;
- 用完之后需要赶紧关闭,否则资源被占用。
二、结果集映射:ResultMap
当属性名和字段名不一致时,会出现读取数据为 null 的情形。
两种解决方法:
- 在写 sql 语句时,将查询到的字段起别名,与属性名一致;
- 使用结果集映射
resultMap
标签。
注意点:
- 第二种方式,记得要把标签
resultType
改为resultMap
,resultMap
标签的名字可以随便起,但要对应;- 第二种方式,
resultMap
标签中的type
为返回值类型、property
为实体类中的属性、column
为数据库中的字段;- 第二种方式,只需要映射属性名和字段名不一致的即可;
resultMap
元素是 MyBatis 中最重要最强大的元素。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
三、日志工厂
如果一个数据库操作出现了异常,此时可以用日志来帮助我们排错。
可以在 MyBatis 核心配置文件中,指定 MyBatis 所用日志的具体实现。
常用的日志有:STDOUT_LOGGING、LOG4J(3.5.9 起废弃)。
1. 标准日志:STDOUT_LOGGING
在 MyBatis 核心配置文件中进行配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
注意:注意字母大小写,不能多空格,严格按照参考文档规范。
日志输出
注意:由日志可以看到,MyBatis 会自动开启事务,但增删改操作需要手动提交事务。
2. LOG4J
由于漏洞影响,IntelliJ 平台彻底停止使用 LOG4J,建议切换到 java.util.logging 作为标准日志框架。
四、分页
MyBatis 实现分页,使用的是 limit
分页,核心还是在写 sql。
举例:查询名字带有“张”的人,并进行分页。
除了自己进行分页,还可以使用 MyBatis 分页插件 PageHelper,点此进入。
五、使用注解开发
-
注解本质上是一个接口,该接口默认继承了
java.lang.annotation.Annotation
接口。 -
面向接口编程的原因:解耦,达到定义(规范、约束)与实现的分离。
-
MyBatis 除了用
Mapper.xml
映射器类映射,还有另一种方法可以完成语句映射:使用 Java 注解来配置。 -
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让本就复杂的 SQL 语句更加混乱不堪。 因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
-
选择何种方式来配置映射,永远不要拘泥于一种方式,可以很轻松地在基于注解和 XML 的语句映射方式间自由移植和切换。
-
注解开发的本质是:反射机制实现;底层:使用了动态代理。
步骤:
- 在接口的方法上添加注解,编写 sql 语句;
- 在核心配置文件中绑定接口;
- 测试。
注意:
- 有了注解,就不需要
Mapper.xml
配置文件了,并且需要在 MyBatis 核心配置文件中绑定接口;- 写注解中的 sql 语句时,注意参数的对应关系:
- 参数有
@Param("x")
注解的,#{x}
从 Param 注解中找对应名字拿参;- 参数是实体类,
#{属性名}
从实体类中依据属性名拿参;- 参数是 Map 集合,
#{键}
从集合中依据键名拿参。- 关于
@Param("")
注解:
- 基本数据类型或 String 类型的参数,需要在参数前加上该注解;
- 引用类型不需要加;
- 如果只有一个基本数据类型,可以不用加,但是最好加上。
六、Lombok
-
Lombok 项目是一个 Java 库,它可以自动插入到编辑器和构建工具中,增强 Java 的性能;
-
不需要再写 getter、setter 或 equals 方法,只要有一个注解,你的类就有一个功能齐全的构建器、自动记录变量等等。
使用步骤:
-
在 IDEA 中安装 Lombok 插件
注意:打开 IDEA 设置,找到
Plugins
上面搜索 Lombok,如果搜得到就可以直接下载。如果搜索不到,进入官网下载安装包,并导入,Lombok 官网点此进入。从 IntelliJ 2020.3 版开始,Lombok 插件将默认集成并包含在 IntelliJ 中。
- 在项目中导入 Lombok 的 jar 包(Maven 项目导入依赖)
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
-
使用 Lombok:在实体类中加注解
常用的注解(下图圈出来的):
@Data
:除了有参构造器,其他都会自动生成;@AllArgsConstructor
:生成有参构造器,注意此时无参构造器会消失;@NoArgsConstructor
:生成无参构造器。
注意:
- MyBatis 分页插件 PageHelper:https://pagehelper.github.io/
- Lombok 官网下载:https://plugins.jetbrains.com/plugin/6317-lombok/versions