一、什么是mybatis?

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

MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

二、MyBaits与JDBC

JDBC核心对象

DriverManager,数据库驱动管理对象
Connection,数据库连接对象
Statement | PrepareStatement ,操作数据库SQL语句对象
ResultSet,结果集对象

MyBaits核心对象

SqlSession对象,该对象包含了执行SQL语句的所有方法,例如JDBC里面Connection

Executor接口,将传递过来的参数动态生成SQL语句,负责查询缓存。

MappedStatement对象,该对象负责对SQL封装,用于存储需要映射的SQL语句及参数等信息

ResultHandler对象,用户返回结果集合,封装成最红想要的数据类型,可以自定义返回类型

三、MyBaits执行流程

 依赖: 

     //mybatis依赖配置
    implementation 'org.mybatis:mybatis:3.5.15'
    //MySQL连接驱动
    implementation 'com.mysql:mysql-connector-j:8.2.0
mybatis核心组件:
①SqlSessionFactoryBuilder:构建SqlSessionFactory的构建器,采用了分布构建方式进行构建
②SqlSessionFactory:生产SqlSession的工厂(工厂设计模式),在项目的生命周期应该以单例的形式进行存在
③SqlSession:mybatis围绕SqlSession进行工作,
提供:发送执行sql语句;
   获取mapper映射器;
控制事务
④mapper映射器:接口+映射文件(注解或者xml)xml常用

注意:在xml中&是特殊符号,有具体的语义,要使用&表示连接

mybatis不支持方法重载
因为MyBatis动态代理寻找策略是:全限定名+方法名,不涉及参数,所以MyBatis不支持方法重载。
方法重载:方法名相同,参数列表不同

配置文件:mybatis-config.xml
复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!--命名空间及约束文件-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
    <!--通过 properties文件进行配置datasource数据源-->
    <properties resource="datasource.properties"/>
    <!--settings:会改变mybatis的运行时行为
    logImpl:指定mybatis所有日志的具体实现,未指定时将自动查找
    mapUnderscoreToCamelCase:驼峰映射
    autoMapperBehavior:指定mybatis应如何自动映射列到字段或属性
    (NONE:关闭自动映射;PARTIAL只会自动映射没有定义嵌套结果映射的字段;FULL会自动映射任何)
    .....
    -->
    <settings>
    <!-- 开启驼峰映射 默认是关闭的-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--类型别名:不区分大小写-->
    <typeAliases>
        <!-- 针对类型单独进行别名配置-->
        <typeAlias type="com.monster.pojo.Student" alias="student"/>
        <!-- 位于指定包下指定别名,别名即为类的简单名称(mybatis 的别名不区分大小写)-->
        <package name="com.monster.pojo"/>
    </typeAliases>

    <!--类型处理器:处理Java对象属性和数据表字段类型不一致的类型转换
    BooleanTypeHandler
    FloatTypeHandler
    BigDecimalTypeHandler
    EnumTypeHandler: 数据库兼容的字节流类型【VARCHAR 或任何兼容的字符串类型,用来存储枚举的名称(而不是索引序数值)】
    .....等等
    -->
    <typeHandlers>
        <!-- 单独加载 自定义类型转换处理器-->
<!--        <typeHandler handler="com.monster.typehandler.GenderTypeHandler"-->
<!--                     javaType="com.monster.enums.Gender"/>-->
        <!-- mybatis自带的类型转换器(这儿是枚举转换器)-->
        <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
                     javaType="com.monster.enums.Gender"/>

        <!--包加载-->
        <!-- <package name="com.monster.typehandler"/>-->

    </typeHandlers>
    <!--  自定义对象工厂:当创建结果集的时候,mybatis会使用一个对象工厂创建这个结果集的实例,然后实现里面的方法  -->
    <objectFactory type="com.monster.factory.MyObjectFactory"/>
    
   <!-- 插件(plugins):允许你在映射语句执行过程中的某一点进行拦截调用。

    -->
    <!-- 环境配置 -->
    <environments default="development">
        <environment id="development">
            <!-- 事务管理器(需要实现Transaction接口)
            JDBC:采用JdbcTransaction生成的JdbcTransaction对象实现,以JDBC的方式对数据库的事务进行操作
            MANAGED:采用ManagedTnansaction生成的WanagedTransaction对象实现。它的提交和回滚不需要任何操作,而是把事务交给容器处理。
            在默认情况下会自动关闭连接,然而容器并不希望这样做,因此需要将closeConnection属性设置为false来阻止它默认的关闭行为
            -->
            <transactionManager type="JDBC"/>

            <!-- 数据源环境
                POOLED:连接池
                UNPOOLED:非连接池的方式创建连接
                JNDI:在外部(容器)配置数据源
             -->
            <dataSource type="POOLED">
                <!-- 连接驱动-->
                <property name="driver" value="${driverClassName}"/>
                <!-- 在xml中&是特殊符号,有具体的语义,要使用&amp表示连接-->
                <property name="url" value="jdbc:mysql://localhost:3306/studentmanage?userUnicode=true&amp;characterEncoding=UTF8"/>
                <property name="username" value="longhj"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 映射器
    ①类名
    ②包名
    ③注解映射   -->
    <mappers>
    <!--<mapper resource="com/monster/mapper/StudentMapper.xml"/>
    顺序:mapper >> package
    -->
        <!--通过注解映射的mapper直接被扫描,不需要通过xml注册-->
<!-- 省略:<mapper class="com.monster.mapper.BookMapper"/>-->
        <package name="com/monster/mapper"/>
    </mappers>
</configuration>
复制代码