MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。
1.1、持久化数据持久化
- 持久化就是将程序的数据在持久状态和顺时状态转化的过程
- 内存:断电即失
- 数据库(jdbc),io文件持久化
为什么需要持久化?
- 有一些对象,不能让他丢失
- 内存太贵
Dao层、Service层、Controller层
- 完成持久化工作的代码块
- 层界限十分明显
- 方便
- 传统的JDBC代码太复杂。为了简化、框架。
- 帮助程序猿将数据存入到数据库中
- sql和代码的分离
- 灵活、简单易学
搭建环境->导入MyBatis->编码->测试
新建项目
1. 创建maven工程 2. 删除src文件夹 3. 引入MyBatis依赖:至少包括mybatis启动、mybatis、Junit
编写配置文件
编写mybatis工具类
3、配置解析 3.1、核心配置属性mybatis-config.xml
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器)3.2、环境配置(environments)
MyBatis可以配置成适应多种环境
但每个SqlSessionFactory实例只能选择一种环境
MyBatis默认的事物管理器是JDBC,连接池:POOLED
3.3、属性(properties)
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
优先使用外部配置文件
3.4、别名(typeAliases)//文件路径
- 类型别名是为Java类型设置一个短的名字
- 存在的意义仅在用减少类完全限定名的冗余
方式一:
方式二:使用class文件绑定注册
注意点:
- 接口和其他Mapper配置文件必须同名
- 接口和其他的Mapper配置文件必须在同一个包下
方式三:使用扫描包绑定注册
3.6、生命周期和生命域
SqlSessionFactoryBuilder
- 一旦创建了SqlSessionFactory,就不需要他了
- 局部变量
SqlSessionFactory
- 可以想象为:数据库连接池
- 一旦被创建就应该在应用层的运行期间一直曾存在,没有任何理由丢弃它或重新创建另一个实例
- 他的最佳作用域是应用作用域
- 最简单就是使用单例模式或者静态单例模式
SqlSession
- 连接到连接池的一个请求
- SqlSession的实例不是线程安全的,因此不能被共享,所以他的最佳作用域是请求或方法作用域
- 用完之后需要赶紧关闭,否则资源被占用
- 在sql语句中起别名
- 通过resultMap解决
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TfChBwza-1654095121792)(D:Markdown学习图片resultMap映射.png)]
只转不一样的就可以
5、日志 5.1、日志工厂如果一个数据库操作出错,出现了异常,需要排错,日志可以提供帮助
- SLF4J
- Apache Commons Logging
- Log4j 2
- Log4j(重要)
- JDK logging
在MyBatis中具体使用哪一个日志,由设置决定
5.2、Log4j什么是Log4j?
- Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件
- 我们可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
- 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
-
先导入Log4j的包
-
配置文件
log4j.rootLogger=DEBUG,console,file #控制台输出的相关设置 log4j.appender.console = org.apache.log4j.ConsoleAppender log4j.appender.console.Target = System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout = org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=【%c】-%m%n #文件输出的相关设置 log4j.appender.file = org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/kuang.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=【%p】【%d{yy-MM-dd}】【%c】%m%n #日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG
limit分页
select * from user limit #{startIndex},#{pageSize};
RowBounds分页
先查出全部的,再在java中处理
7、使用注解开发 7.1、 面向接口编程定义与实现的分离
接口本身反映了系统设计人员对系统的冲向理解
关于@Param()注解
- 基本类型的参数或String类型需要加上
- 引用类型不需要加
- 如果只有一个基本类型的话,可以忽略
- 我们在SQL中引用的就是我们这里的@Param()中设定的属性名
#{} 和 ${} 区别
8、Lombok- 插件
- java工具
- 不用写get,set方法了
步骤:
- 在idea中安装Lombok插件
- 导jar包
- 在实体类上加注解
@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。 @Getter 使用方法同上,区别在于生成的是getter方法。 @ToString 注解在类,添加toString方法。 @EqualsAndHashCode 注解在类,生成hashCode和equals方法。 @NoArgsConstructor 注解在类,生成无参的构造方法。 @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。 @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。 @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。 @Slf4j 注解在类,生成log变量,严格意义来说是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);9、一对多
- 关联 - association 【多对一】
- 集合 - collection 【一对多】
- javaType和ofType
动态SQL就是指根据不同的条件生成不同的语句
核心就是拼接sql
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。 如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。 if choose (when, otherwise) trim (where, set) foreachif
SELECT * FROM BLOG WHERe state = ‘ACTIVE’ AND title like #{title}
这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果
choose有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
where 元素只会在子元素返回任何内容的情况下才插入 “WHERe” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
update Author where id=#{id} username=#{username}, password=#{password}, email=#{email}, bio=#{bio}
set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号
SQL片段- 使用sql标签抽取公共部分
- 在需要使用的地方使用include标签引用
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
11、缓存查询:连接数据库,耗费资源 一次查询的结果,给他暂存在一个可以直接取到的地方-->内存:缓存 我们再次查询相同数据的时候,就不用再连接数据库了
Mybatis系统默认定义了两级缓存:一级缓存和二级缓存
一级缓存也叫本地缓存
a
SELECT *
FROM POST P
WHERe ID in
#{item}
## 11、缓存 ```bash 查询:连接数据库,耗费资源 一次查询的结果,给他暂存在一个可以直接取到的地方-->内存:缓存 我们再次查询相同数据的时候,就不用再连接数据库了
Mybatis系统默认定义了两级缓存:一级缓存和二级缓存
一级缓存也叫本地缓存



