Mybatis(一)

发布于 2020-11-28  4.52k 次阅读


一,Mybatis的概述

一,Mybatis的历史

Mybatis本身是apache的开源项目Ibatis,2010年这个项目由apache software foundation迁移到Google更名为Mybatis(当时Ibatis为3.0)

二,Mybatis的简介

mybatis是基于JDBC上的封装框架,也是基于ORM(对象关系映射模型)上的框架MyBatis ,是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

ORM:对象关系映射模型,就是将数据映射成对象,通过操作数据来实现对数据的操作

三,Mybatis的架构

一,Mybatis的业务框架

(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑

二,Mybatis的框架架构

(1)加载配置:配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
(3)SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
(4)结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

四,mybatis的执行流程

(1)加载配置并初始化

触发条件:加载配置文件

处理过程:将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求
触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。

二,Mybatis的初体验

一,Mybatis的项目搭建

项目搭建步骤:
①建立maven项目,导入相关坐标
②建立Mybatis主配置文件,导入XML约束
③建立Mybatis映射文件,导入约束,并在主配置文件中配置映射文件
④建立实体类,全局变量名和数据库列名一致
⑤读取配置文件,建立Session进行操作
第一步:导入maven坐标:

重点是两个坐标,MySQL驱动和Mybatis,其次是日志log4j和单元测试junit

<!--Mybatis依赖-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

<!--mysql连接驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->

<!--日志-->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->

<!--单元测试-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
第二步:建立Mybatis主配置文件
文件名称自定义,需要导入主配置文件约束
配置内容:
<?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>
<!--配置mybatis环境environments,默认名称default自定义-->
<environments default="WQL">
    <!--id自定义-->
    <environment id="WQL">

        <!--配置事务管理器的类型,它主要有两种一个是JDBC,一个是MANAGED-->
        <transactionManager type="JDBC"></transactionManager>

        <!--配置数据源连接,type配置数据源连接类型它主要有三种,UNPOOLED,POOLED,JNDI-->
        <dataSource type="POOLED">

            <!--配置基本的连接-->
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/wql"/>
            <property name="username" value="root"/>
            <property name="password" value="123"/>
        </dataSource>
    </environment>
</environments>

        <!--映射文件-->
    <mappers>
        <mapper resource="map1.xml"></mapper>
    </mapers>
</configuration>
第三步:建立映射配置文件(这是其中一种方式,基于注解就不需要这个映射文件)
文件名自定义,导入映射文件约束
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--上面是映射文件约束-->
<!--namespace是对那个类或者接口进行映射-->
<mapper namespace="com.wql.Iuser">
<!--我们是以查询为例 resultType返回接收的实体类 -->
    <select id="findall" resultType="com.wql.user">
        select * from fq
    </select>
</mapper>
第四步:根据列名创建实体类(第四步和第五步是个人自定义的)
表列名:
实体类需要实现序列化接口:
public class user implements Serializable {

    int id;
    String name;
    int random;

    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void setRandom(int random) {
        this.random = random;
    }

    @Override
    public String toString() {
        return "user{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", random=" + random +
                '}';
    }
}
创建操作接口:
public interface Iuser {

    public List<user> findall();

}
第五步:建立session会话
public static void main(String[] args) throws IOException {

 //读取主配置文件形成流对象   
 InputStream inputStream = Resources.getResourceAsStream("mybatisconfig.xml");

 //创建一个工厂创建者对象(创建者模式),用来产生session工厂对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

//创建者对象,读取接收流,创建session工厂
    SqlSessionFactory factory = builder.build(inputStream);

//seesion工厂创建一个session对象
    SqlSession session = factory.openSession();

//session的getmapper代理iuser接口(通过代理DAO的方式,没有直接实现),产生代理对象
    Iuser iuser=session.getMapper(Iuser.class);

//调用代理dao接口的方法
    List<user> list = iuser.findall();

//打印
    for (user a:list){
        System.out.println(a);
    }
}
结果:
user{id=2, name='FQ', random=20}
user{id=3, name='LOVE', random=520}
user{id=4, name='wqll', random=520}
user{id=5, name='daf', random=520}
user{id=6, name='fq', random=520}
user{id=7, name='las', random=100}
user{id=10, name='NB', random=1001}
user{id=16, name='SB', random=101}
user{id=18, name='LUOQIN', random=101}

三,Mybatis配置文件详解

Mybatis的配置文件Mybatis的一个重点

一,主配置文件

主配置文件,主要配置JDBC连接,事务,映射关系,别名,缓存……,对于全局有重要影响

一,主配置文件标签解释

mybatis中总共有11个直接子标:properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, reflectorFactory ,plugins, environments, databaseIdProvider,                                                                mappers
 注意:这些标签在根标签下有自己固定的顺序,不然会报错
① properties:引入外部配置文件
例:
1,定义一个properties文件里面写jdbc连接信息,将它导入,让dataSource引用(在文件引用中只能用${}不能用#{})
properties文件:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/wql
jdbc.user=root
jdbc.password=123

引入(只截取部分):

<properties resource="jdbcwql.properties"></properties>
<dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</dataSource>

2,在properties标签中自己定义

<properties >
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/wql"/>
    <property name="username" value="root"/>
    <property name="password" value="123"/>
</properties>

<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
② setings:设置系统属性
在外面经常用到的就只有一部分:

lazyLoadingEnabled:是否开启延迟加载

aggressiveLazyLoading:是否查询所有信息(一般与延迟加载一起使用)

cachEnabled:是否开启二级缓存