mybatis学习(适合有一定基础的人学习,复习)

目录

mybatis概述

mybatis入门

mybatis的事务管理机制

关于mybatis的集成日志组件,调试更方便

Mybatis中的crud

Mybatis中的核心配置文件

mybatis动态代理机制

Mybatis的小技巧

Mybatis的参数

Mybatis的查询语句

动态sql

Mybatis高级映射

Mybatis中的缓存

Mybatis中的逆向工程


mybatis概述

  • ORM:对象 关系 映射

    • Object:JVM中的java对象

    • R(relational):关系型数据库

    • M(mapping):映射

  • Mybatis可以做什么?

    • java对象<--------->数据库中的一条记录

  • Mybaits是一个半自动化的ORM

    • 因为mybatis中的sql语句需要自己编写

  • 像User这样的类,特殊的称呼

    • pojo (普通java类)

    • bean(java豆)

    • domain(领域模型)

  • mybatis中有两个主要的配置文件

    • mybatis-config.xml 配置连接数据库的信息

    • xxxxMapper.xml (一个表一个)

      • 编写sql语句的文件

mybatis入门

  • 开发步骤

    • 1、打包方式 jar

    • 2、引入依赖

    • 3、编写mybatis核心配置文件

    • 4、编写mapper.xml文件

    • 5、在mybatis配置文件中指定mapper文件路径

      • resource属性会自动从类的根路径下查找资源

    • 6、编写mybatis程序

      • sqlsession专门执行sql语句

        • java程序和数据库之间的一次会话

  • mybatis的核心对象

    • sqlSesionFactoryBuilder

      • builde(“ 流文件”)

    • SqlSessionFactory

      • 一个SqlSessionFactory 对应一个数据库(environment)

      • openSession()

    • SqlSession

      • insert() CRUD

      • commit( )提交事务

mybatis的事务管理机制

  • 在mybatis配置文件中通过以下的配置进行mybatis的事务管理

    • <transactionManager type="JDBC"/>
  • JDBC事务管理器

    • mybatis框架自己管理事务,自己采用原生的jdbc代码管理事务。

    • con.setAutoCommit(false) 开启事务

    • con.setAutoCommit(true) 关闭事务

    • con.commit()手动提交事务

  • MANAGED事务管理器

    • mybatis不再负责事务的管理,交给其他容器负责 。 例如:spring

  • 重点:只要autocommit是true,就表示没有开启事务!!!只有autocommit是false时候,表示开启了事务!!

关于mybatis的集成日志组件,调试更方便

  • mybatis常见的集成日志组件有哪些

    • SLF4J(沙拉风)

      • 日志标准,其中有一个框架叫logback,实现了沙拉风规范。

    • LOG4J

    • LOG4J2

    • STDOUT_LOGGING :标准日志

  • mybatis已经实现了标准日志,怎么开启?

    • 在mybatis配置文件中的setting标签中,注意顺序

  • 集成logback日志框架

    • 1、引入logback的依赖。

    • 2、引入logback必须的xml配置文件。

Mybatis中的crud

  • jdbc中的占位符是? mybatis中是什么呢?

    • #{ } 是一个占位符 括号中写map集合的key pojo类的属性名

  • java程序中给sql语句传值的方式

    • map集合

      • 调用集合的getkey()

    • pojo类

      • 调用类的 get属性名()

  • select一条或多条数据

    • 需要设置mapper文件中,设置resultType的类型。

    • 数据库列名和java类属性名对应不上,不能调用类的set方法给 pojo类属性赋值,所以查的数据为null。

      • 设置sql语句中的列名的 别名 as

  • 在sql mapper.xml文件中有一个namespace,这个属性是用来 指定命名空间的,防止sql id重复 。

Mybatis中的核心配置文件

  • environments

    • 一个环境environment对应一个 数据库 和一个 sqlsessionFactory对象

    • default属性

      • 当你使用mybatis创建sqlSessionFactory对象时,没有指定环境的话,默认使用哪个环境。

  • transactionManager

    • 配置事务管理器,指定mybatis用什么方式管理事务

    • 两个属性值

      • jdbc:使用原生的JDBC代码管理事务

      • managed:mybatis不再负责事务,将事务交给其他JEE (JAVAEE) 容器管理

  • datasoource 数据源

    • 作用是什么?

      • 为程序提供connection对象 (但凡是给程序提供connection对象的都叫数据源)连接池

    • 数据源实际是一套规范。

      • JDK有这套规范 javax.sql.DataSource

    • 常见的数据源组件有哪些呢?

      • 德鲁伊连接池 :druid

      • c3p0

      • dbcp

    • type属性用来指定数据源类型,什么方式获取connection对象。

    • Type属性值有三个

      • UNPOOLED:不使用连接池技术

      • POOLED: 使用mybatis自己实现的数据源

      • JNDI: 集成第三方的数据库连接池

    • JNDI是一套规范,谁实现了这套规范,大部分web容器实现了JNDI规范

      • 例如:tomcat jetty

  • properties

    • 在properties标签中可以配置很多属性

    • 通过${ }中写properties的key,获取属性值

    • 怎么引入properties文件?

      • properties两个属性:

        resource:这个属性从类的根路径下开始加载。【常用的。】

        url:从指定的url加载,假设文件放在d:/jdbc.properties,这个url可以写成:file:///d:/jdbc.properties。注意是三个斜杠哦。

mybatis动态代理机制

  • 动态代理机制

    • dao的实现类不需要程序员写实现类,由mybatis动态生成dao的实现类(代理类:dao接口的代理)

    • mybatis中采用了代理模式,在内存中生成dao的代理类,创建代理类的实例。

  • 使用这种机制的要求

    • 要想使用动态代理机制 namespace必须是接口的全限定名称!!!

    • sqlid必须是到中的方法名 !!

  • 使用mybatis 接口,完成增删改查。

    • 一般不叫做XXXDao,叫做XXXMapper

    • 使用动态代理机制

      • CarMapper carDao=sqlSession.getMapper(CarMapper.class);
    • lamada表达式

      • cars.forEach(car -> System.out.println(car));

Mybatis的小技巧

  • #{ }和 ${ }的区别 ?

    • #{ } : 底层使用PreaparedStatement

      • 特点:先进行sql语句的编译,然后给sql语句的占位符 ?传值。

    • ${ } :底层使用Statement

      • 特点:先进行sql语句的拼接,再进行sql语句的编译,存在sql注入的风险。

    • 优先使用#{ }, 避免sql注入的风险

  • 什么时候使用${ }

    • sql语句的关键字,排序 asc desc 只能使用${ },因为#{ }是以值的形式放到sql语句中的。

  • 向sql语句中拼接表名,使用${ }

  • 批量删除:一次删除多条记录 ${ }

    • delete from t_car where id=1 or id=2 or id=3

    • delete from t_car where id in (1,2,3)
  • 模糊查询:${ }

    • select * from t_car where id like '%奔驰%'
    • 第一种:

      • '%${brand}%'

    • 第二种:

      • concat函数,mysql自带的函数,进行字符串拼接

      • concat ( '%', #{brand}, '%')

    • 第三种

      • "%"#{brand}"%"

  • 别名机制

    • typeAliases标签

    • typeAliases标签中的typeAlias可以写多个。

    • typeAlias:

      • type属性:指定给哪个类起别名

      • alias属性:别名。

        • alias属性不是必须的,如果缺省的话,type属性指定的类型名的简类名作为别名。

        • alias是大小写不敏感的。也就是说假设alias="Car",再用的时候,可以CAR,也可以car,也可以Car,都行。

    • package 将包下的类自动起别名,不区分大小写

      • 注意:namespace不能使用别名机制

  • mybatis中的mappers标签

    • resource

      • 从类的根路径查找资源,配置文件必须放到类路径中才行。

    • url

      • 绝对路径的方式

    • class:全限定接口名,带包名

      • mapper.xml的文件位置不能随便放

      • 必须和CarMapper接口放在一起

      • XML文件的名字必须和接口名一致

    • 注意!!!!!

      • 在idea的resource的目录下创建目录必须:com/study/mybatis/mapper ,使用 /

  • Mybatis的参数

    • 简单类型

      • 八大基本类型 + 包装类型 +Date +String

    • Map参数

      • #{ }:写的是map集合的key

    • pojo参数

      • #{ } : 写的是实体类的属性

    • 多参数的情况

      • mybatis框架会创建一个Map集合。

      • map.put("arg0",value);

      • map.put("arg1",value);

      • map.put("param1",value);

      • map.put("param2",value);

    • 多参数之@param注解

      • @Param(value=" ") 设置mybatis底层的map集合的key,给参数命名。

    • 代理模式

      • 代理对象 中介

      • 代理方法 找房子

      • 目标对象 我

      • 目标方法 找房子

  • Mybatis的查询语句

    • 返回Car

      • 查询的结果只有一条,有对应的实体类。

    • 返回List<Car>

      • 查询结果多条,用集合接收

    • 返回Map

      • 返回的数据,没有java的实体类对应,可以用map结合接收。

    • List<Map>

      • 返回的数据,没有java的实体类对应,且查询的结构条数大于等于一条。

    • Map<String,Map>

      • Map中套map 数据被封装在小map中

      • @Mapkey 拿Car的id做key,以后取出对应的Map集合时更方便。

    • 起别名的目的

      • 别名变成类的属性名,查询出的值,才能赋值到对象的属性上。

    • 查询结果的列名和java对象的属性名对应不上怎么办?

      • 第一种方式:as 给列起别名

      • 第二种方式:使用resultMap进行结果映射

        • type属性:pojo类的类名

        • id属性:指定resultMap的唯一标识

      • 第三种方式:是否开启驼峰命名自动映射(配置settings),即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。

    动态sql

  • 动态拼接SQL语句

  • if标签

    • if标签中的test属性值是 布尔类型

    • 如果test为true,if标签中的sql语句就会拼接

    • test属性中可以使用的是:

      • 当使用了@Param注解,test属性中要出现的是Param指定的参数名。

      • 没有使用@Param注解:param1 param2 arg0,arg1....,当使用了POJO,test中出现的是POJO类的属性名。

    • select * from t_car where 判断语句 and 判断语句 and 判断语句

  • where标签 :让where子句更加动态智能

    • 所有条件为null时,保证不会生成where子句

    • 自动去除前面多余的and和all

  • trim标签

    • prefix:在trim标签中的语句前添加内容

    • suffix:在trim标签中的语句后添加内容

    • prefixOverrides:前缀覆盖掉(去掉)

    • suffixOverrides:后缀覆盖掉(去掉)

  • set标签

    • 主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”。

    • 比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。

Mybatis高级映射

  • 怎么区分主表和副表?

    • 原则:谁在前谁是主表

  • 高级映射

  • 多对一 :主表为student,那JVM中的对象就是:Student对象

    • 第一种方式:一条sql语句,级联属性映射

    • 第二种方式:association

      • association 关联

    • 第三种方式:分步查询

      • (最常用,重复性强,支持延迟加载)

  • 什么是懒加载?

    • 延迟加载核心原理:用的时候在查询,提高性能。

  • 怎么开启延迟加载机制呢?

    • association中添加 fetchType=“lazy” 设置局部的延迟加载。

    • 设置全局的延迟加载机制

    • <settings>
            <setting name="lazyLoadingEnabled" value="true"/>
          </settings>
  • 一对多:

  • 一对多的实现,通常是在一的一方中有List集合属性。

  • 一对多的实现通常包括两种实现方式:

    • 第一种方式:collection

    • 第二种方式:分步查询

Mybatis中的缓存

  • 缓存:cache

  • 缓存的作用:通过减少IO的方式,来提高程序的执行效率

  • mybatis的缓存:将select语句的查询结果放到缓存中,下次直接去缓存中找,提高效率。

  • mybatis缓存包括:

    • 一级缓存:将查询到的数据存储到SqlSession中。

    • 二级缓存:将查询到的数据存储到SqlSessionFactory中。

    • 或者集成其它第三方的缓存:比如EhCache【Java语言开发的】、Memcache【C语言开发的】等。

  • 什么情况下不走缓存?

    • 不同的sqlsession对象

    • 查询条件变化了

  • 一级缓存失效的两种情况?

    • 手动清空缓存

    • 第一次查询和第二次查询期间执行了 增删改的语句

Mybatis中的逆向工程

  • 第一步:基础环境准备

  • 第二步:在pom中添加逆向工程插件

  • 第三步:配置generatorConfig.xml

  • 第四步:运行插件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值