乐趣区

关于spring:看阿里P7怎么讲MyBatis从MyBatis的理解以及配置和实现全帮你搞懂

前言

MyBatis 是一款优良的长久层框架,一个半 ORM(对象关系映射)框架,它反对定制化 SQL、存储过程以及高级映 ` 射。MyBatis 防止了简直所有的 JDBC 代码和手动设置参数以及获取后果集。MyBatis 能够应用简略的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,一般老式 Java 对象)为数据库中的记录。

MyBatis 的作用

MyBatis 作用是在长久层也就是拜访数据库的操作, 以前咱们拜访数据库是用 JDBC 来拜访数据库,JDBC 拜访数据库须要写很多反复的代码, 如果数据库拜访很多还须要对数据库连贯进行不停的关上连贯和敞开连贯, 很耗费零碎性能
MyBatis 封装了 JDBC 底层拜访数据库的代码, 让咱们程序猿只须要关怀如何去写好 SQL 就好, 不在须要去写 JDBC 底层的代码

MyBatis 的优缺点

长处

  • MyBatis 封装了 JBDC 底层拜访数据库的细节, 使咱们程序猿不须要与 JDBC API 打交道, 就能够拜访数据库
  • MyBatis 简略易学, 程序猿间接编写 SQL 语句, 适宜于对 SQL 语句性能要求比拟高的我的项目
  • SQL 语句封装在配置文件中,便于对立治理与保护,升高了程序的耦合度
  • SQL 代码从程序代码中彻底分离出来,可重用
  • 提供了动静 SQL 标签,反对编写动静 SQL
  • 提供映射标签,反对对象与数据库的 ORM 字段关系映射

毛病

  • 过于依赖数据库 SQL 语句, 导致数据库移植性差, 更换数据库, 如果 SQL 语句有差别,SQL 语句工作量大
  • 因为 xml 里标签 id 必须惟一,导致 DAO 中办法不反对办法重载

MyBatis 的配置文件

properties 元素

properties 元素形容的都是内部化, 可代替的属性
个别用来配置连贯数据源, 咱们能够应用 property 子节点来配置也能够应用资源门路援用

应用 property 子节点来配置

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

应用资源门路援用

    <properties resource="jdbcConfig.properties"/>

jdbcConfig.properties 外面的属性

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
username=root
password=123456

连贯数据源的配置

    <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
    </dataSource>

如果应用 property 子节点来配置和应用资源门路援用都用了, 这个时候 MyBatis 会调用哪个勒?MyBatis 会调用资源门路援用的属性值, 因为资源门路援用的优先级高于 property 子节点的优先级

settings 元素

settings 是 MyBatis 中极为重要的调整设置,它们会扭转 MyBatis 的运行时行为

    <settings>
        <!-- 全局映射器启用缓存 -->
        <setting name="cacheEnabled" value="true"/>

        <!-- 查问时,敞开关联对象即时加载以进步性能 -->
        <setting name="lazyLoadingEnabled" value="true"/>

        <!-- 设置关联对象加载的状态,此处为按需加载字段 (加载字段由 SQL 指 定),不会加载关联表的所有字段,以进步性能 -->
        <setting name="aggressiveLazyLoading" value="false"/>

        <!-- 对于未知的 SQL 查问,容许返回不同的后果集以达到通用的成果 -->
        <setting name="multipleResultSetsEnabled" value="true"/>

        <!-- 容许应用列标签代替列名 -->
        <setting name="useColumnLabel" value="true"/>

        <!-- 容许应用自定义的主键值 (比方由程序生成的 UUID 32 位编码作为键值),数据表的 PK 生成策略将被笼罩 -->
        <setting name="useGeneratedKeys" value="true"/>

        <!-- 给予被嵌套的 resultMap 以字段 - 属性的映射反对 -->
        <setting name="autoMappingBehavior" value="FULL"/>

        <!-- 对于批量更新操作缓存 SQL 以进步性能 -->
        <setting name="defaultExecutorType" value="BATCH"/>

        <!-- 数据库超过 25000 秒仍未响应则超时 -->
        <setting name="defaultStatementTimeout" value="25000"/>
    </settings>

typeAliases 元素

typeAliases 元素的作用是给 JavaBean 取别名, 不便咱们在 mappeer 配置文件中应用

当咱们没有给 JavaBean 取别名,mapper 配置文件中获取 JavaBean 的时候, 咱们就须要获取 JavaBean 所在我的项目外面的全门路

    <!-- 省略局部代码 -->
    <select id="login" resultType="cn.friday.pojo.DevUser">
        SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword}
    </select>

接下来咱们就来给 JavaBean 取别名

    <typeAliases>
        <typeAlias type="cn.friday.pojo.DevUser" alias="devUser"/>
        <typeAlias type="cn.friday.pojo.AppInfo" alias="appInfo"/>
    </typeAliases>

给每个 JavaBean 去取一个指定的别名, 这样是有缺点的, 万一我的项目中有很多个 POJO 那么工作量就大了, 不过还有一种办法给指定的包外面所有的 JavaBean 都取一个别名,MyBatis 会主动扫描所指定的包下的 JavaBean 并且给一个默认的别名, 默认的别名为 JavaBean 的名称, 请看上面

    <typeAliases>
        <package name="cn.friday.pojo"/>
    </typeAliases>

mapper 外面的配置文件就能够失常应用 JavaBean 取的别名了, 不须要再去获取 JavaBean 的全门路了

    <!-- 省略局部代码 -->
    <select id="login" resultType="DevUser">
        SELECT * FROM dev_user WHERE devCode=#{devCode} AND devPassword=#{devPassword}
    </select>

environments 元素

MyBatis 能够配置多种环境, 如开发环境、测试环境、生产环境等, 咱们能够灵便抉择不同的配置, 从而将 SQL 映射利用到不同的数据库环境上. 这些不同的运行环境咱们就能够用 environments 元素来配置实现

environments 元素元素的配置

    <!-- 开发环境 -->
     <!--default 属性示意在默认的状况下咱们将启用的数据源 -->
    <environments default="development">
    <!--id 属性用来标识一个数据源的,不便在 MyBatis 中应用 -->
        <environment id="development">
            <!-- 应用 jdbc 事务管理 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

        <!-- 咱们在来配置一个测试环境 -->
         <environment id="test">
            <!-- 应用 jdbc 事务管理 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test1"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

如果咱们想从开发环境变成测试环境只须要批改 environments 元素外面的 default 属性即可

 <environments default="test">
     <!-- 省略局部代码 -->
 </environments>

mappers 元素

mappers 映射器, 说简略点就是通知 MyBatis 去哪里找到 SQL 语句映射文件, 咱们能够应用类资源门路或者是 URL 等
用类资源门路获取映射文件

    <mappers>
        <mapper resource="cn/friday/dao/developer/DevUserMapper.xml"/>
        <mapper resource="cn/friday/dao/developer/AppInfoMapper.xml"/>
    </mappers>

用 URL 获取映射文件

    <mappers>
          <mapper url="file:///D:/mappers/DevUserMapper.xml"/>
          <mapper url="file:///D:/mappers/AppInfoMapper.xml"/>
    </mappers>

如何实现 MyBatis

先给大家看一下我的我的项目构造

第一步 导入依赖

我的是 maven 我的项目所以只须要在 pox.xml 配置文件中增加对于 MyBatis 的依赖即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>MyBatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.4</version>
        </dependency>

    </dependencies>

    <build>
    <resources>
        <resource>
            <directory>src/main/java/</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
    </build>
</project>

第二步 创立 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>
    <properties resource="jdbc-config.properties"/>

    <typeAliases>
        <package name="com.friday.pojo"/>
    </typeAliases>

    <environments default="test">
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/friday/dao/UserMapper.xml"></mapper>
    </mappers>
</configuration>

jdbc-config.properties 外面的属性

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
username=root
password=123456

第三步 创立接口以及映射文件

接口, 一般的 java 接口

package com.friday.dao;

import com.friday.pojo.User;
import org.apache.ibatis.annotations.Param;

public interface UserMapper {//@Param 绝对应给 String userCode 取了一个别名叫做 userPassword, 咱们到写映射 SQL 语句的时候只有 #{注解名称}即可, 如#{userPassword}
    public User login(@Param("userCode") String userCode,@Param("userPassword") String pwd);
}

映射文件

<?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">
<mapper namespace="com.friday.dao.UserMapper">
    <select id="login" resultType="User" parameterType="string">
        SELECT * FROM smbms_user WHERE userCode=#{userCode} AND userPassword=#{userPassword}
    </select>
</mapper>

mapper 文件外面的属性

  • namespace 属性 指定绝对应的接口
  • id 属性 接口外面具体的办法名
  • resultType 返回值的类型
  • resultType 传进来的参数的类型

第四步 测试

package com.friday.test;

import com.friday.dao.UserMapper;
import com.friday.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisTest {public static void main(String[] args) throws IOException {
       // 读取 mybatis 配置文件
       String resource = "mybatis-config.xml";
       // 获取 mybatis 配置文件的输出流
       InputStream is = Resources.getResourceAsStream(resource);
       // 创立 SqlSessionFactory 对象
       SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
       // 关上 sqlSession 对象
       SqlSession sqlSession =  factory.openSession();

       // 获取对应的 Mapper,让映射器通过命名空间和办法名称找到对应的 SQL,发送给数据库执行后返回后果。User user = sqlSession.getMapper(UserMapper.class).login("zhanghua","userPassword");

       // 看一下是否能够查到数据
       if (user != null) {System.out.println("登录胜利");
       } else {System.out.println("登录失败");
       }

       // 敞开 sqlSession 对象
       sqlSession.close();}
}

最初

大家看完有什么不懂的能够在下方留言探讨,也能够关注我私信问我,我看到后都会答复的。也欢送大家关注我的公众号:前程有光,马上金九银十跳槽面试季,整顿了 1000 多道将近 500 多页 pdf 文档的 Java 面试题材料放在外面,助你圆梦 BAT!文章都会在外面更新,整顿的材料也会放在外面。谢谢你的观看,感觉文章对你有帮忙的话记得关注我点个赞反对一下!

退出移动版