今天是2021年4月19号,学习和了解Mybatis框架;
学习一个新东西,尽量要做到三点:是什么?是用来干什么的?有什么用?
学习框架可以使用对比学习,使用这个框架和不使用这个框架有什么区别?
mybatis Spring SpringMVC SpringBoot
1.是什么?
持久层框架
数据持久化:将数据保存到数据库中,以便用户下次再运行时可以再次使用到这些数据;
Dao层:完成持久化工作的代码块
Service层:业务层
Controller层:控制层
持久层:完成持久化工作的代码块
2.为什么用mybatis框架?
没有用mybatis之前是使用MySQL来完成数据持久化的;(如何完成?有何弊端?如何改进优化?)
mybatis的的好处:方便,简化,框架,自动化(如何实现?)
不使用mybatis开发的时候也是可以的。mybatis不是一种唯一完成持久化的框架;
3、mybatis的特点是什么?
与MySQL实现相比,mybatis有什么特点?
4、我的第一个mybatis程序
学习框架的思路:搭建环境----》导入mybatis----》编写代码-----》测试
4.1搭建环境:
MySQL数据库:创建一个数据库 创建一个数据表user并且插入数据
4.2新建项目
新建一个普通的maven项目
删除src目录
创建一个模块
新建一个xml文件
新建一个工具类来读取配置文件,获取SQLSessionFactory对象
4.3编写代码
pojo实体类User:属性 get set方法 无参有参构造方法
Dao接口:UserDao 也就是等价于UserMapper,来获取用户
(旧方法实现方法)Dao接口实现类:MySQL是通过实现接口的来操作数据库中的数据的
(新方法实现方法)Dao Mapper文件:UserMapper.xml,通过namespace来唯一绑定一个接口,id对应接口中的方法,resultType对应返回的数据类型;
4.4测试
注意点:每个Mapper.xml都需要在Mybatis核心配置文件中注册;
maven过滤配置,将xml文件也生成到target中;
Junit测试:获取sqlSession对象 执行SQL 关闭sqlSession对象
执行SQL的方式一:通过mapper对象来获取
可能遇到的问题:配置文件没有注册、绑定接口错误、方法名不对、返回类型不对、maven导出资源;
5.CRUD
5.1namespace---中的包名要和接口的包名一致
5.2select---查询语句,id对于namespace中的方法名;resultType对于SQL语句的返回值; parameterType---参数类型
5.3insert-----id对应方法 parameterType对应类名 记得提交事务
5.4update---id对应方法名 parameterType对应类名 记得提交事务
5.5delete----id对应方法名
5.6三种传参方式---map传递参数(多个参数) 、对象传递参数、 int传递参数(可以省略)
5.7多个参数用map或者注解
5.8模糊查询怎么写?在java代码传递参数时用通配符%% 在SQL拼接中使用通配符;
6.配置解析
6.1核心配置文件
mybatis-config.xml配置MyBatis 行为的设置和属性信息
6.2环境变量environments,default--设置使用的环境 ,默认的事务管理器是jdbc,连接池是pooled
6.3属性properties,通过属性来实现引用配置文件;
第一步:编写一个外部配置文件db.porperties
第二步:在核心xml文件中引入
可以直接引入外部文件db.porperties 可以在标签中增加属性 外部配置文件优先级高
6.4类型别名typeAliases
有两种方式起别名的方式;
6.5.设置setting
6.6.其他配置
typeHandler
6.7.映射器mappers
MapperRegister:注册绑定我们的Mapper文件
Mapper文件就是**Mapper.xml文件;
有三种方式的绑定方式;
6.8.生命周期和作用域
三个对象:
SqlSessionFactoryBuilder:是一个局部变量,用来创造一个SqlSessionFactory,创造玩就可以回收了;
SqlSessionFactory:相当于是一个连接池,一次运行程序就一个对象,是全局变量;
SqlSession:相当于是一个连接,有连接和关闭的动作,一个SqlSession对应多个mapper,一个mapper就是一个业务;
7.解决属性名和字段不一致的问题
7.1如有一个关系 user(id,name,pwd)
有一个实体类有属性 id name password 【注意pwd password】
方式一:起别名 sql语句的as用法 pwd as password
输出结果的password是为null的,考虑一下为什么为null?因为属性跟字段不一致;
7.2resultMap 结果集映射
id name pwd
| | |
id name password
有一个resultMap标签,可以完成数据表的列和对象的属性一一对应;
8.日志
8.1日志工厂
如果一个数据库操作出现错误,要进行检查和排除就需要使用到日志;
日志的设置在settings标签中进行设置;
<setting name=" " value=" "/>
在mybatis核心文件中配置我的日志;
标准的日子工厂实现 STDOUT_LOGGING;
8.2 LOG4J 日志的实现
8.2.1什么是LOG4J ?
可以控制日志的输出目的,也可以控制日志输出的格式,还可以控制日志的生成过程,可以通过配置文件灵活的进行配置?
【配置文件的重要性 配置文件在框架的使用中占据着很重要的地位,它是如何控制程序的一些参数的?】
8.2.2LOG4J 的使用
导包:需要使用maven仓库来导入LOG4J的包;
配置文件log4j.porperties来设置属性信息;
配置log4j为日志的实现,使用setting标签;
log4j的使用,测试运行;
简单使用:导包---》生成日志对象---》使用日志级别输出 info debug error
日志的作用?用来排除错误;
9.分页
【思考】为什么要分页?
当数据量比较大时,对数据进行分页显示,可以减少每次对数据量的处理;
9.1使用limit分页:select * from user limit 0,2;显示第一和第二个数据;
9.2使用mybatis实现分页:
接口:
Mapper.xml:
测试:
9.3RowBounds类分页
9.4mybatis分页插件pagehelper
10.使用注解开发
10.1什么是面向接口编程?
注解的底层主要是应用了反射;
注解在接口上实现
需要在核心配置文件中绑定接口
测试
本质是反射机制实现,底层是动态代理;
设计模式的重要性,要求能够手写出设计模式的流程图;
10.2mybatis的执行流程【通过查看源码得出的结果】
第一步:编写一个配置文件,通过resource获取价值全局配置文件
第二步:实例化SqlSessFactorBuilder构造器
第三步:解析文件流 XMLConfigBuilder
第四步:Configuration所有配置信息
第五步:SQLSessionFactor实例化
第六步:execute执行器
第七步:创建sqlSession
第八步:实现CRUD
第九步:查看是否执行成功
第十步:提交事务
10.3使用注解来CRUD
我们可以在创建sqlSession对象的时候设置自动提交注解;
11.Lombok
11.1是什么?
java library 、plug 、build tool
11.2使用步骤
在idea中安装lombok插件
在项目中导入lombokjar包(maven依赖)
使用:不用写get和set方法了 只需要添加一些注解就可以了
@Data:无参构造方法 get set toString hashcode equal
12.多对一的处理
12.1什么是多对一?什么是一对多?
多对一:多个学生对应一个老师 【关联】
一对多:一个老师有多个学生 【集合】
12.2新建一个项目
导入lombok
新建实体类 Teacher 和Student
建立Mapper接口
建立Mapper,xml文件
在核心配置文件中注册绑定我们的Mapper接口或者文件
测试查询是否能够成功
12.3查询所有学生的信息,以及对应的老师的信息
按照查询嵌套处理、子查询的实现
按照结果嵌套处理
13.一对多的处理
比如:一个老师有多个学生
需求:查询老师的基本信息,以及老师拥有的学生信息。
方式一:按结果嵌套查询
方式二:按子结果嵌套查询
小结:
多对一用关联
一对多用集合
JavaType & ofType
javaType用指定实体类中属性的类型
ofType 用来指定映射到list或者集合中的pojo类型,泛型中的介绍类型;
面试高频考点:
MySQL引擎
InnoDB底层原理
索引
索引优化
14.动态SQL
14.1什么是动态SQL?
根据不同的条件生成不同的SQL语句
14.2搭建环境
14.2.1创建一个基础工程
导包
编写配置文件
编写实体类
实现实体类对应的Mapper接口,和Mapper.xml文件
14.3----if
表示判断
14.4----trim
14.5---choose语句
和java语法中的switch语句一样,从中选择一项
14.6---where标签
15缓存Cache
15.1什么是缓存?
15.2为什么使用缓存?
15.3什么样的数据能使用可以使用缓存?
【建议使用】经常查询并且不经常改变的数据
【不建议使用】
15.4mybatis的缓存
一级缓存:自动开启的
二级缓存:手动配置
缓存的策略:LRU FIFO
15.5一级缓存---本地缓存
也是sqlSession级别的,只在一次sqlSession中有效,是自动开启的;
在同一个sqlSession里面,两次查询只需要执行一次sql语句,第二次只需从缓存中取数据;
如果在同一次sqlSession中有增删改操作时,缓存会变自动更新;
15.6二级缓存----全局缓存
开启二级缓存,只要在核心配置中添加一个cache标签;
默认的清除策略是LUR;
二级缓存是一个全局的缓存,一个namespace对应一个二级缓存,当一级缓存关闭时,会将数据存入到二级缓存中;新的会话关闭时,会从二级缓存中查找数据;
15.7缓存的原理
15.8自定义缓存--ehcache
导包
在cache中加入type属性,值为ehcache;
在resource目录中新建 ehcache.xml文件
16.mybatis的总结
17.聊聊spring