MyBatis

Mybatis

        环境: jdk1.8、mysql5.7、maven、idea

        基础知识:JDBC、mysql、java基础、maven、junit

基础概念:

  • MyBatis 是一款优秀的持久层框架
  • 它支持定制化 SQL、存储过程以及高级映射。(方便使用数 据库)
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及 获取结果集。
  • MyBatis 可以使用简单的 XML 或注解来配置和映射原生信 息,将接口和 Java 的 POJO(Plain Ordinary Java Object, 普通的 Java对象)映射成数据库中的记录。
  • 每个MyBatis应用程序主要都是使用SqlSessionFactory实例 的,一个SqlSessionFactory实例可以通过
  • SqlSessionFactoryBuilder获得。 SqlSessionFactoryBuilder可以从一个xml配置文件或者一 个预定义的配置类的实例获得。

特点:

  • 简单易学:本身就很小且简单。没有任何第三方依赖,最简 单安装只要两个jar文件+配置几个sql映射文件。易于学习, 易于使用,通过文档和源代码,可以比较完全的掌握它的设 计思路和实现。
  • 灵活:mybatis不会对应用程序或者数据库的现有设计强加 任何影响。 sql写在xml里,便于统一管理和优化。通过sql 语句可以满足操作数据库的所有需求。
  • 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和 数据访问逻辑分离,使系统的设计更清晰,更易维护,更易 单元测试。sql和代码的分离,提高了可维护性。
  • 提供映射标签,支持对象与数据库的orm字段关系映射 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

什么是ORM

  • ORM(Object Relational Mapping,对象关系映射)是一种为 了解决面向对象与关系数据库存在的互不匹配的技术。
  • ORM通过使用描述对象和数据库之间映射的元数据,将程序中的 对象自动持久化到关系数据库中。简单来说,ORM就是将数据从 一种形式转换为另一种形式。ORM的方法论基于三个核心原则: 简单、对象关系映射(Object Relational Mapping,简称 ORM)模式有时也称为基于事实的建模,因为它把相关数据描述 为基本事实。

常见的ORM框架有:

  • Hibernate:是一个开放源代码的对象关系映射框架,它对JDBC 进行了非常轻量级的对象封装,将POJO与数据库表建立映射关 系,是一个全自动的ORM框架。
  • MyBatis:SQL和代码分离,提高了可维护性,提供映射标签, 支持对象与数据库的ORM字段关系映射,支持对象关系组建维 护,支持XML标签,编写动态SQL。
  • Spring Data JPA:是一组规范,不是框架,默认实现框架是 Hibernate。

1、学习使用

        官方文档:https://mybatis.org/mybatis-3/zh/index.html

        安装:maven仓库地址,依赖

2、持久化

        将程序数据在持久状态和瞬时状态转换的机制

        即把数据(如内存中的对象)保存到可永久保存的存储设备中 (如硬盘)。 持久化的主要应用就是将内存中的对象存储在数据库中、或者磁 盘、xml数据文件中..

3、持久层

        什么是持久层?

                完成持久化工作的代码块 --》 dao层就是持久层

4、为什么需要mybatis

        传统的jdbc,有很多的重复代码块,比如:数据取出时的封装、 获取数据库连接...通过框架可以减少重复代码,提高效率。

Mybatis的第一个程序

1,创建一个maven项目,作为父工程

在pom.xml中,引入mybatis依赖

2,创建子工程

3,编写Mybatis的核心配置文件

修改数据源

4,编写Mybatis工具类

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例 为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预 先配置的 Configuration 实例来构建出 SqlSessionFactory 实 例。 从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议 使用类路径下的资源文件进行配置。 从 SqlSessionFactory 中获取 SqlSession 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令 所需的所有方法。 你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。

5、创建实体类

6、编写Mapper接口

7、编写Mapper.xml配置文件,代替实现类

8、编写测试类

9、启动测试

遇到的问题

1,UserMapper.xml无法加载

        在pom.xml配置build信息

Mybatis的CRUD

mapper中代码

mapper.xm

mapper.xml中传参的时候,使用${} 和#{}的区别 ? #{}会将参数以预编译的方式参与sql语句。sql语句中的参数会先 编译成? 然后再绑定参数

测试方法

问题注意:

1,mapper.xml中的标签别写错 2,mapper中的namespace对应的地址,是接口的地址 3,config.xml中的mapper地址是 mapper.xml的地址

Map的使用

map传递参数,直接在sql取出key即可 对象传递参数,直接在sql中取出对象的属性 map一般什么时候使用: 普通状态下,修改信息需要传入一个User对象,如果这个对象的 字段很多,对应的XML中也要写很多字段,这样会比较麻烦 所以可以使用map来存放一个规定的个数的字段

查询使用MAP

注解方式也能传入map作为参数

模糊查询

配置解析

configuration(配置)

环境配置(environments)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射 应用于多种数据库之中, 现实情况下有多种理由需要这么做。 例如,开发、测试和生产环境需要有不同的配置;或者想在具有 相同 Schema 的多个生产数据库中使用相同的 SQL 映射。 不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境

事务管理器(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type=" [JDBC|MANAGED]"):

JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依 赖从数据源获得的连接来管理事务作用域。 MANAGED – 这个配置几乎没做什么。它从不提交或回滚一 个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一 些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。

数据源(dataSource)

dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连 接对象的资源。 POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对 象组织起来,避免了创建新的连接实例时所必需的初始化和认证 时间。 这种处理方式很流行,能使并发 Web 应用快速响应请 求。

属性(properties)

这些属性可以在外部进行配置,并可以进行动态替换。 简单来说就是可以在外面配置一个外部的引入文件 db.properties,通过properties可以引入xml进行读取

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 在config.xml中,properties标签后,定义此标签 第一种用法: 表示的意思是:将pojo下的User整个类的全类名取别名为user

取了别名以后,在mapper.xml中,查询语句中的返回类型直接使 用别名即可

第二种用法: 给整个实体类的包取别名,只需要指定包名即可,mapper.xml 中sql语句返回结果的时候,只需要返回对应类型的类名,把类名 改为小写就好了,比如 User类 返回类型为user

总结: 实体类少的时候用第一种,多的时候用第二种 第一种用法,可以随意取名。 第二种不行,可以在实体类上使用注解的方式,修改任意别名

加了注解以后,返回类型可以是别名

映射器(mappers)

告诉 MyBatis 到哪里去找映射文件 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来 定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里 去找到这些语句。 使用方式一: 使用resouce方式 【推荐】

注意: 1,接口和它的Mapper配置文件必须同名 2,接口和它的mapper配置文件必须在同一个包下 第三种方式:将包中的映射器接口全部注册为映射器

作用域(Scope)和生命周期

SqlSessionFactoryBuilder 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也 就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要一直保留着它,以保 证所有的 XML 解析资源可以被释放给更重要的事情。 总结:

1,一旦创建了sqlsessionFactory,就用不到了 2,局部变量 SqlSessionFactory SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存 在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复 创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习 惯”。 因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例 模式。 总结: 1,可以看成是数据库连接池 2,一旦被创建,就在运行期间一直存在 3,作用是应用作用域 SqlSession 每个线程都应该有它自己的 SqlSession 实例。 SqlSession 的实例不是线程安全的,因此是不能被共享的,所以 它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至 一个类的实例变量也不行

也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域 中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一 个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重 要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放 到 finally 块中。 下面的示例就是一个确保 SqlSession 关闭的标 准模式: try(SqlSession session = sqlSessionFactory.openSession()) {// 你的应用逻辑代码} 总结 1,不能将 SqlSession 实例的引用放在一个类的静态域,甚至一 个类的实例变量也不行 2, 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用 域中,比如 Servlet 框架中的 HttpSession 3,确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中 resultMap 元素是 MyBatis 中最重要最强大的元素。 1,查询为null的问题,数据库的字段和实体类的属性不对应的时 候

数据库的字段名称

实体类中的字段

如果这种情况直接查询,查询出来的结果,password字段为 null,因为找不到对应的数据库中的字段值

解决方法 1,为列名指定别名,别名和java实体类中的属性名一致

2,使用结果集映射 ResultMap

日志、分页的使用 日志的使用

如果一个数据库相关操作出现了问题,可以根据输出的sql语句快 速排查出问题,以前都是通过debug模式来查找排错,使用 mybatis后,可以选择日志工具来作为程序调节工具 mybatis内置的日志工厂,提供日志功能 SLF4J LOG4J LOG4J2 JDK_LOGGING STDOUT_LOGGING

标准日志的实现 config.xml中配置即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值