首页
学习
活动
专区
工具
TVP
发布

MyBatis学习笔记

引言

介绍: 数据持久层框架(DAO将数据持久化到数据库),实现DAO层的代码。对JDBC代码的封装。

特点:

封装通用功能,简化代码,提高开发效率(获得conn,绑定参数,发送sql,处理异常,处理结果集)

sql放在配置文件中,提高sql可维护性。

自带连接池功能

自带缓存(提高查询效率)

搭建环境

导入MyBatis相关jar包(注意还要oracle数据库的驱动jar包)

引入配置文件(mybatis-config.xml)(放在src目录下)

初始化mybatis-config.xml文件的配置

搭建环境所需文件:https://gitee.com/sixiaojie/codes/u82xe47s63ofjycnbrv0q22

书写DAO接口

.xxxMapper.xml文件作为DAO的实现类

在mybatis-config中注册XxxMapper.xml文件

调用Mybatis实现类中的方法:

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

SqlSession session = factory.openSession();

PersonDAO personDao = sessoin.getMapper(PersonDAO.class);

person.XXX();

session.commit();

session.close();

is.close();

工具类:https://gitee.com/sixiaojie/codes/c0k45udvsxzr1lyot3e7f69

如何使用MyBatis充当DAO实现类

需求: 使用MyBatis实现DAO的方式,添加一个person信息 ?

1.写DAO接口

2.书写Mapper文件(DAO的实现类)[sql+参数]

属性:

id: 实现的接口的方法名

parameterType: 参数类型(实体的全类名)

sql语中绑定参数: #

3.注册管理mapper文件[在mybatis-config中配置]

MyBatis使用的API

单表操作

修改

书写PersonDAO接口,声明修改的方法

在Mapper通过标签实现方法

注册mapper文件。[一个接口,对应一个mapper文件,注册一次]

删除

定义dao接口的方法

书写mapper文件标签

注册mapper文件。

限定参数绑定的名字

定义接口方法

Mapper文件

查询

查询单个

书写DAO接口方法

mapper文件实现该方法(sql 参数 对查询结果映射实体对象)

核心: sql 参数

映射核心思想:

如果查询结果的列名和要封装的实体的属性名一样,将查询结果自动封装实体对象。

注册mapper文件

ResultType的作用

作用: 映射查询结果的列封装成实体的属性

要求: 查询结果的列名必须和实体的属性名一致

表列名和实体属性名不一致

通过sql 的as关键字,其别名方式,使查询结果的列名和实体的属性名一致。

查询多个

只需要明确单行数据映射的实体类型,

MyBatis会自动讲每个数据封装的每个实体放入list集合中。

书写DAO接口方法

书写mapper文件中的标签

注册mapper文件

多个参数(基本,包装,String)

方案一:

方案二:

绑定参数通过#

MyBatis的Mapper文件的sql书写 >或者

问题: 会发生转义

解决: 替换成转义字符

实体简化(别名)

简化实体的权限定名的书写

方案:

Mybatis参数绑定的底层原理

插入优化

JDBC的实现思路

MyBatis插入数据绑定id

查询关系映射

需求: 将查询结果映射成实体对象。[MyBatis自动完成]

方案1:

方案二:

关联关系操作

一对多

实例需求: 员工(多)和部门(1)

(站在员工): 一个员工对应一个部门(1对1)

(站在部门): 一个部门对应多个员工(1对多)

表设计

核心思想:

表示表与表之间的关系。

1个员工对应1个部门,1个部门对应多个员工

实体设计

DAO(MyBatis如何查询两张表信息)

使用ResultMap映射1对1的关系。

特点: 如果关系属性是1----

需求2:

ReusultMap映射集合关系属性

1对1关系

库表设计

表示1对1的关系

实体设计

DAO设计

需求: 根据学生id查看学生信息(名字,年龄,手机号,使用的电脑编号,电脑名称)?

DAO接口设计

Mapper文件

多对多

需求:

库表设计

设计原则:

实体设计

DAO设计

MyBatis高级特性

动态sql复用sql语句

案例: 复用sql的列名:

(Where+if)动态sql简化查询

封装查询参数

DAO的简化

Mapper的selectwhere条件设计

where标签+if标签

调用DAO:

update+if 动态修改

动态sql删除

DAO接口的方法

Mapper文件

trim

缓存

现有数据查询的问题?

数据库的数据,来源于数据库的物理硬盘(150M/s~450M/s),速度慢?

数据获取,每次都要经过DB-->Tomcat的网络传输。,网络传输IO,降低速度?

解决思路

内存,读取速度(10000M/s),速度快于物理硬盘。

将数据临时存放在tomcat本地,再次获取数据,无需通过网络从DB传输给java。

缓存

缓存核心架构:

一级缓存

概念: SqlSession级别的缓存

核心思想:

特点:

每个sqlSession会有独立的缓存空间。

SqlSession查询数据,默认放入缓存中。

第二次查询,sqlSession直接从缓存中获得数据,不会发送sql语句。

生命周期: 一个事务过程。【sqlSession.commit().一级缓存就会被清空】

应用

没什么用

二级缓存

工作机制:

二级缓存的使用步骤

二级缓存MyBatis默认自动开启了

被缓存的数据对象类型要可序列化

在使用二级缓存的查询sql所在的Mapper中添加

缓存的使用

深入二级缓存

缓存实现原理

MyBatis二级缓存划分规则:

MyBatis缓存的源码实现?

每个namesapce对应的缓存源码实现?

缓存的应用场景

原则:该数据的查询次数远远多于修改的次数

比如:

注意:

Ehcache缓存整合

简介

Ehcache集成MyBatis(替换mybatis自带的缓存)

配置文件[了解]

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181120G0XB3F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券