栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis基础

1、简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

1.1、持久化

数据持久化

  • 持久化就是将程序的数据在持久状态和顺时状态转化的过程
  • 内存:断电即失
  • 数据库(jdbc),io文件持久化

为什么需要持久化?

  • 有一些对象,不能让他丢失
  • 内存太贵
1.2、持久层

Dao层、Service层、Controller层

  • 完成持久化工作的代码块
  • 层界限十分明显
1.3、为什么需要MyBatis?
  • 方便
  • 传统的JDBC代码太复杂。为了简化、框架。
  • 帮助程序猿将数据存入到数据库中
  • sql和代码的分离
  • 灵活、简单易学
2、第一个MyBatis程序

搭建环境->导入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类型设置一个短的名字
  • 存在的意义仅在用减少类完全限定名的冗余
3.5、映射器(mapper)

方式一:



  

    
    

方式二:使用class文件绑定注册



  
  
  

注意点:

  • 接口和其他Mapper配置文件必须同名
  • 接口和其他的Mapper配置文件必须在同一个包下

方式三:使用扫描包绑定注册



  

3.6、生命周期和生命域

SqlSessionFactoryBuilder

  • 一旦创建了SqlSessionFactory,就不需要他了
  • 局部变量

SqlSessionFactory

  • 可以想象为:数据库连接池
  • 一旦被创建就应该在应用层的运行期间一直曾存在,没有任何理由丢弃它或重新创建另一个实例
  • 他的最佳作用域是应用作用域
  • 最简单就是使用单例模式或者静态单例模式

SqlSession

  • 连接到连接池的一个请求
  • SqlSession的实例不是线程安全的,因此不能被共享,所以他的最佳作用域是请求或方法作用域
  • 用完之后需要赶紧关闭,否则资源被占用
4、解决属性名和字段名不一致的问题
  1. 在sql语句中起别名
  2. 通过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组件
  • 我们可以控制每一条日志的输出格式
  • 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
  • 可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码
  1. 先导入Log4j的包

  2. 配置文件

    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
    
6、分页

limit分页

select * from user limit #{startIndex},#{pageSize};

RowBounds分页

先查出全部的,再在java中处理

7、使用注解开发 7.1、 面向接口编程

定义与实现的分离

接口本身反映了系统设计人员对系统的冲向理解

关于@Param()注解

  • 基本类型的参数或String类型需要加上
  • 引用类型不需要加
  • 如果只有一个基本类型的话,可以忽略
  • 我们在SQL中引用的就是我们这里的@Param()中设定的属性名

#{} 和 ${} 区别

8、Lombok
  • 插件
  • java工具
  • 不用写get,set方法了

步骤:

  1. 在idea中安装Lombok插件
  2. 导jar包
  3. 在实体类上加注解
@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、一对多
  1. 关联 - association 【多对一】
  2. 集合 - collection 【一对多】
  3. javaType和ofType
10、动态SQL

动态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)
foreach
if

  SELECT * FROM BLOG
  WHERe state = ‘ACTIVE’
  
    AND title like #{title}
  

这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有处于 “ACTIVE” 状态的 BLOG 都会返回;如果传入了 “title” 参数,那么就会对 “title” 一列进行模糊查找并返回对应的 BLOG 结果

choose

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。


  SELECT *
  FROM POST P
  WHERe ID in
  
        #{item}
  

11、缓存
查询:连接数据库,耗费资源
	一次查询的结果,给他暂存在一个可以直接取到的地方-->内存:缓存
	我们再次查询相同数据的时候,就不用再连接数据库了

Mybatis系统默认定义了两级缓存:一级缓存和二级缓存

一级缓存也叫本地缓存

a

SELECT *
FROM POST P
WHERe ID in

#{item}

## 11、缓存

```bash
查询:连接数据库,耗费资源
	一次查询的结果,给他暂存在一个可以直接取到的地方-->内存:缓存
	我们再次查询相同数据的时候,就不用再连接数据库了

Mybatis系统默认定义了两级缓存:一级缓存和二级缓存

一级缓存也叫本地缓存

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943831.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号