前言:
小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。
这个Mybatis基础学习系列是用来记录我学习Mybatis框架基础知识的全过程 (这个系列是参照B站狂神的Mybatis最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!)
之后我将尽量以一天一更的速度更新这个系列,还没有学习Mybatis3框架的小伙伴可以参照我的博客学习一下;当然学习过的小伙伴,也可以顺便跟我一起复习一下基础。最后,希望能够和大家一同进步吧!加油吧!少年们!
特别提醒:如果对Mybatis基础学习系列感兴趣,可以阅读本系列往期博客:
第一篇:Mybatis基础学习之初识Mybatis
第二篇:Mybatis基础学习之第一个Mybatis程序
第三篇:Mybatis基础学习之CRUD增删改查
第四篇:Mybatis基础学习之万能的Map和模糊查询
由于Mybatis基础学习之配置解析的内容比较多,所以这里我将其拆分为上下两篇来发布。上篇主要介绍Mybatis核心配置中的环境配置、事务管理器、数据源、属性和类型别名等内容;下篇主要介绍设置、其他配置和映射器,以及Mybatis的生命周期等。
上篇博客地址链接:Mybatis基础学习之配置解析(上篇)
5.7 设置(setting)今天我们来到了Mybatis基础学习的第五站:配置解析(下篇),主要内容就是能。废话不多说,让我们开始今天的学习内容吧。
5.7.1 常用设置的含义及默认值这是MyBatis中极为重要的调整设置,它们会改变MyBatis的运行时行为
| 设置名 | 描述 | 有效值 | 默认值 |
|---|---|---|---|
| cacheEnabled | 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 | true|false | true |
| lazyLoadingEnabled | ==延迟加载的全局开关。==当开启后,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态 | true|false | false |
| useColumnLabel | ==使用列标签代替列名。==实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察 | true|false | true |
| useGeneratedKeys | ==允许JDBC支持自动生成主键,需要数据库驱动支持。==如果设置为true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如Derby) | true|false | false |
| autoMappingBehavior | 指定MyBatis应如何映射列到字段或属性。NONE表示关闭自动映射;PARTIAL只会自动映射到没有定义嵌套结果映射的字段;FULL会自动映射任何复杂的结果集 | NONE|PARTIAL|FULL | PARTIAL |
| mapUnderscoreToCamelCase | 是否开启驼峰命名自动映射,即从经典数据库列名last_name映射到经典Java属性名LastName | true|false | false |
| logImpl | 指定MyBatis所用日志的具体实现,未指定时将自动查找 | SLF4J|LOG4J|…NO_LOGGING | 未设置 |
| localCacheScope | MyBatis利用本地缓存机制(Local Cache)防止循环引用和加速重复的嵌套查询。默认值为Session:会缓存一个会话中执行的所有查询;若设置为Statement:本地缓存将仅用于执行语句,对相同SqlSession的不同查询将不会进行缓存 | Session|Statement | Session |
| jdbcTypeForNull | 当没有为参数指定特定的JDBC类型时,空值的默认JDBC类型。某些数据库驱动需要指定列的JDBC类型,多数情况直接使用一般类型即可,比如Null、Varchar、Other | JdbcType常量,常用值:Null、Varchar或Other | Other |
| lazyLoadTriggerMethods | 指定对象的哪些方法触发一次延迟加载 | 用逗号分隔的方法列表 | equals,clone,hashCode,toString |
特别提醒:设置名为logImpl的有效值主要包括SLF4J|LOG4J|LOG4J2|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING|NO_LOGGING
5.7.2 配置完整setting元素实例5.8 其他配置
-
typeHandler(类型处理器)
-
objectFactory(对象工厂)
-
plugins(插件)
MyBatis Generator Core:会自动生成增删改查过程(逆向工程),但是可有时能会出现一些问题
MyBatis Plus:MyBatis的增强工具(为简化而生)通用Mapper
- 什么是MapperRegistry?
1.使用相对于类路径的资源引用MapperRegistry:注册绑定Mapper配置文件
- 使用相对于类路径的资源引用 (即使用resource资源路径绑定注册),推荐使用!
2.使用完全限定资源定位符
- 使用完全限定资源定位符 (即使用URL链接绑定注册) ,不推荐使用,url路径容易出错!
3.使用映射器接口实现类的完全限定名
- 使用映射器接口实现类的完全限定名 (即使用class文件绑定注册),可以使用,工作中用的会很多,但可能会受mapper配置文件存放位置的影响!
4.将包内的映射器接口实现全部注册为映射器
- 将包内的映射器接口实现全部注册为映射器 (即扫描package包绑定注册)
5.9.2 使用相对于类路径的资源引用
1.设置mapper配置文件存放位置 2.编写 mybatis-config.xml 配置文件 2-1使用resources/mapper/UserMapper.xml路径简单理解就是使用resource资源路径绑定注册
2-2 使用mapper/UserMapper.xml路径
3.编写 UserMapper.xml 映射文件
4.编写 UserDaoTest 测试类
public class UserDaoTest {
@Test
public void test(){
//获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
//使用getMapper方法来获取接口对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用getUserList方法,查询所有用户
List userList = userMapper.getUserList();
//遍历数组
for (User user : userList) {
System.out.println(user);
}
}catch(Exception e){
e.printStackTrace();
}finally {
//关闭sqlSession
sqlSession.close();
}
}
}
5.测试结果
5-1.使用 resources/mapper/UserMapper.xml 路径
报错:通过resources/mapper/UserMapper.xml路径找不到资源
结论:因此,这个路径格式显然不正确
5-2.使用mapper/UserMapper.xml路径结果:查询用户列表信息成功!
结论:因此,在使用相对于类路径的资源引用时要注意路径绑定是否正确!
5.9.3 使用映射器接口实现类的完全限定名1.设置mapper配置文件存放位置 1-1 存放在resources文件目录下 1-2 存放在dao文件目录下 2.编写 mybatis-config.xml 配置文件简单理解就是使用class文件绑定注册
3.编写mapper配置文件
4.编写 UserDaoTest 测试类
public class UserDaoTest {
@Test
public void test(){
// 获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
// 使用getMapper方法来获取接口对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用getUserList方法,查询所有用户
List userList = userMapper.getUserList();
// 遍历数组
for (User user : userList) {
System.out.println(user);
}
} catch(Exception e){
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
}
}
}
5.测试结果
5-1 存放在resources文件目录下
报错:无效的绑定语句,未找到com.kuang.dao. usermaper . getuserlist
5-2 存放在dao文件目录下 6.测试结论在使用映射器接口实现类的完全限定名(即使用class文件绑定注册)的情况下,不建议将mapper配置文件存放在resource目录下(即mapper接口与配置文件不在同一位置),因此mapper配置文件应该与mapper接口应该在同一位置 (即存放在同一文件目录下)
简单总结,即为两点:
- 接口与它的Mapper配置文件必须同名!
- 接口与它的Mapper配置文件必须在同一个包下!
1.设置mapper配置文件存放位置 2.编写 mybatis-config.xml 配置文件简单理解就是扫描package包进行绑定注册
3.编写mapper配置文件
4.编写 UserDaoTest 测试类
public class UserDaoTest {
@Test
public void test(){
// 获得SqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession();
try {
// 使用getMapper方法来获取接口对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 调用getUserList方法,查询所有用户
List userList = userMapper.getUserList();
// 遍历数组
for (User user : userList) {
System.out.println(user);
}
} catch(Exception e){
e.printStackTrace();
} finally {
// 关闭sqlSession
sqlSession.close();
}
}
}
5.测试结果
6.拓展测试
6-1 修改接口名称
- 将UserMapper接口改为UserDao接口,使mapper接口与配置文件不同名
报错:无效的绑定语句,未找到com.kuang.dao. usermaper . getuserlist
6-3 测试结论7.测试总结因此在使用将包内的映射器接口实现全部注册为映射器时(即使用package包名绑定注册),需要注意mapper接口与mapper配置文件名称应保持一致!
- 接口与它的Mapper配置文件必须同名!
- 接口与它的Mapper配置文件必须在同一个包下!
5.10.1 Mybatis的生命周期执行流程图 5.10.2 简单解析生命周期各部分 1.简单解析SqlSessionFactoryBuilder生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题!
SqlSessionFactoryBuilder一旦创建了SqlSessionFactory,就不再需要它了,并且它属于局部变量
2.简单解析SqlSessionFactorySqlSessionFactory相当于数据库连接池,一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
SqlSessionFactory最佳实践是应用的运行期间不要重复创建多次,因此其最佳作用域是应用作用域。最简单的就是使用单例模式或者静态单例模式。
3.简单解析SqlSessionSqlSession表示连接到连接池的一个请求。SqlSession的实例不是线程安全的,因此是不能被共享的。所以它的最佳作用域是请求或者方法作用域
注意:用完之后要赶紧关闭,否则资源被占用!
4.SqlSessionFactory和SqlSession联系注意:这里面的每一个Mapper,就代表一个具体的业务
好了,今天的有关 配置解析(下篇) 的学习就到此结束啦。欢迎小伙伴们积极学习和讨论,喜欢的可以给蜗牛君点个关注,顺便来个一键三连。我们下期见,拜拜啦!
参考视频链接:https://www.bilibili.com/video/BV1NE411Q7Nx?spm_id_from=333.999.0.0(【狂神说Java】Mybatis最新完整教程IDEA版通俗易懂)



