欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 【SSM详细教程】-07-Mybatis运行流程以及核心配置

【SSM详细教程】-07-Mybatis运行流程以及核心配置

2024/10/23 12:17:11 来源:https://blog.csdn.net/yueyehuguang/article/details/143139007  浏览:    关键词:【SSM详细教程】-07-Mybatis运行流程以及核心配置

 精品专题:

01.《C语言从不挂科到高绩点》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12753294.html?spm=1001.2014.3001.5482

02. 《SpringBoot详细教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12789841.html?spm=1001.2014.3001.5482

03.《SpringBoot电脑商城项目》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12752883.html?spm=1001.2014.3001.5482

04.《VUE3.0 核心教程》课程详细笔记

https://blog.csdn.net/yueyehuguang/category_12769996.html?spm=1001.2014.3001.5482

================================

||   持续分享系列教程,关注一下不迷路  ||

||   视频教程:小破站:墨轩大楼             ||

================================

MyBatis 运行流程

我们回到前面那体系结构图,再来理解一下MyBatis的运行流程:

  1. 读取相关的配置文件(mybatis-config.xml、*Mapper.xml)成为一个Configuration对象
  2. 通过Configuration对象构建SqlSessionFactory对象
  3. 由SqlSessionFactory获取SqlSession对象
  4. 通过SqlSession获取相应的Mapper对象(DAO对象)
  5. 通过mybatis提供Mappered Statements来对数据库进行相关操作(CRUD)

一、MyBatis核心配置

在mybatis-config.xml配置文件是MyBatis应用的核心配置,接下来我们一起看一下这个核心配置文件的内容:

configuration 配置

  • properties 可以配置在Java 属性配置文件中
  • settings 修改 MyBatis 在运行时的行为方式
  • typeAliases 为 Java 类型命名一个别名(简称)
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境

- environment 环境变量

- transactionManager 事务管理器

- dataSource 数据源

  • mappers 映射器

1.1 properties用法

        通过外部指定的方式,实现动态配置,比如:今天的案例中,加载数据源所需要的连接数据库的基本信息,可以写在db.properties文件中(该文件放在resources目录下面),如下面所示:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/study?serverTimezone=UTC
user=root
password=root

然后在主配置文件中,使用properties标签,引用这个properties文件,如下所示:

<configuration><!--引入数据源properties文件--><properties resource="db.properties"></properties><environments default="development"><environment id="development"><transactionManager type="JDBC"/><!-- 数据源配置 --><dataSource type="POOLED"><!-- 使用${key}的方式引用properties文件中指定的key对应的值--><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mappers\HeroMapper.xml"></mapper></mappers>
</configuration>

1.2 settings元素

        Mybatis核心配置文件中提供了一个<settings>标签用于进行一些常规的配置:缓存,日志,自动键等。

设置项设置

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置

true | false

true

lazyLoadingEnabled

全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载

true | false

true

autoMappingBehavior

MyBatis对于resultMap自动映射匹配级别

NONE |

PARTIAL |

FULL

PARTIAL

useGeneratedKeys

允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(Derby)。

true | false

False

【案例】:常规配置获取自动生成的键

        通常对于一些包含自动递增的表来说,执行插入操作时可能需要获取自动生成的键,此时可以通过mybatis的settings中其中的useGeneratedKeys来实现,具体步骤如下:

>> 在核心配置文件中添加useGeneratedKeys属性:

 <settings><!--允许自动生成主键:配合映射文件--><setting name="useGeneratedKeys" value="true"/></settings>

>> 在映射文件的<insert>中使用useGeneratedKeys属性和keyProperty属性配置:

<!-- 执行插入时获取自动生成的键,键值会自动设置给对象中的指定属性 -->
<insert id="insertGetKey" useGeneratedKeys="true" keyProperty="id">insert into hero (name,job,level,sex)values (#{name},#{job},#{level},#{sex})
</insert>

>> 对应的Dao中Mapper接口方法:

/** 插入英雄数据,并获取到英雄数据的id**/
Long insertGetKey(Hero hero);

>> 编写测试代码

@Test
public void testInsertGetKey() throws IOException {InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();Hero hero  = new Hero();hero.setName("王昭君");hero.setJob("法师");hero.setLevel(3);hero.setSex("女");// 获取数据操作对象Dao接口HeroMapper mapper = session.getMapper(HeroMapper.class);// 执行插入方法,返回的是影响的数据行数Long line = mapper.insertGetKey(hero);System.out.println("影响的数据行数:"+line);// 自动生成的主键会默认包含在hero对象中System.out.println("用户数据中的id:"+hero.getId());// 提交事务session.commit();}

>> 运行效果:

1.3 typeAliases元素

typeAliases 用来给类设置别名,也就是写一个缩写名字,它仅用于XML配置,目的在于降低冗余的全限定类名的书写:

<typeAliases><package name="com.moxuan.mybatis_basic.entity"/>
</typeAliases>

以上代码的意思指的是将com.softeem.entity包下的所有实体类都默认提供一个别名,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

使用类型别名后,映射文件(XXXMapper.xml)中就可以直接使用类型别名,代码如下:


<select id="findHeroById" resultType="hero">select * from hero where id=#{id}
</select><select id="findAll"  resultType="hero">select * from hero
</select>

MyBatis同时也提供了一些内置数据类型的别名,具体如下:

别名

映射的类型

_byte

byte

_long

long

_short

short

_int

int

_integer

int

_double

double

_float

float

_boolean

boolean

string

String

byte

Byte

long

Long

short

Short

int

Integer

integer

Integer

double

Double

float

Float

boolean

Boolean

date

Date

decimal

BigDecimal

bigdecimal

BigDecimal

object

Object

map

Map

hashmap

HashMap

list

List

arraylist

ArrayList

collection

Collection

iterator

Iterator

上面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。

1.4 plugins元素

Mybatis中主配置文件中的plugins元素可以用来配置一些插件,接下来我们以分页插件为例为大家讲解plugins属性的运用。

Mybatis中需要实现分页操作,可以使用第三方的分页插件(PagerHelper)轻松实现:

PagerHelper官方地址:MyBatis 分页插件 PageHelper ,具体用法如下:

>> 在pom.xml中引入分页插件的依赖

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.0.3</version>
</dependency>

>> 在mybatis-config.xml主配置文件中配置拦截器插件

<!--配置分页插件--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><!--指定数据库方言,可以不用配置,默认识别具体的数据库管理系统--><property name="helperDialect" value="mysql"/><!--pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。--><property name="pageSizeZero" value="true"/><!--reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。--><property name="reasonable" value="true"/></plugin></plugins>

>> 编写测试方法,执行分页

@Test
public void testFindPage() throws IOException {InputStream in = Resources.getResourceAsStream("mybatis-config.xml");// 构建一个SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);// 创建Session 对象,操作数据库SqlSession session = factory.openSession();HeroMapper mapper = session.getMapper(HeroMapper.class);// 执行分页(参数一:第几页, 参数二:每页数据条数)PageHelper.startPage(2,3);List<Hero> heroList = mapper.findAll();for (Hero hero :heroList){System.out.println(hero);}System.out.println("################");// 如果需要更详细分页信息,则可以基于集合创建PageInfo对象PageInfo<Hero> pageInfo = new PageInfo<>(heroList);System.out.println(pageInfo);
}

>> 运行效果:

1.5 环境配置

在日常软件开发中通常存在很多不同“环境”,常见的环境包含:开发环境,测试环境和生产环境

  • 开发环境:项目在本地开发测试中,并未正式上线运行的环境
  • 测试环境:项目处于测试阶段时(一般为测试人员的测试环境)
  • 生产环境:项目版本已发布,并部署到对外的应用服务器为普通用户使用(正式上线运行)
<!--环境配置-->
<environments default="product"><environment id="development"><transactionManager type="JDBC"/><!-- 数据源配置 --><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></dataSource></environment><!--配置另一个环境--><environment id="product"><!--配置事务管理器--><transactionManager type="JDBC"/><!--数据源配置--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=UTC"/><property name="username" value="${jdbc.user}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>
</environments>

切换环境只需要通过设置environments标签中的default指向即可,defualt值为environment的id属性值

二、课后作业

2.1 数据表

DROP TABLE IF EXISTS `equip`;
CREATE TABLE `equip` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`type` varchar(255) DEFAULT NULL,`hero_id` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3;-- ----------------------------
-- Records of equip
-- ----------------------------
INSERT INTO `equip` VALUES ('1', '冷静之靴', '移动', '3');
INSERT INTO `equip` VALUES ('2', '圣杯', '法术', '3');
INSERT INTO `equip` VALUES ('3', '回响之杖', '法术', '3');
INSERT INTO `equip` VALUES ('4', '痛苦面具', '法术', '3');
INSERT INTO `equip` VALUES ('5', '贤者之书', '法术', '3');
INSERT INTO `equip` VALUES ('6', '凝冰之息', '法术', '3');

2.2 需求描述

  1. 搭建Mybatis开发环境,创建好项目
  2. 使用Mybatis实现针对equip的增删改查操作
  3. 查询方法要有根据Id查询指定数据的方法,也要有查询所有数据的方法
  4. 插入方法:需要有普通的插入操作方法,和插入数据返回自动生成主键的方法
  5. 实现分页:显示第3也数据,每页显示两条数据。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com