[Java Web]Mybatis->超八千字详细介绍,带你由浅入深认识了解mybatis

目录

1、简介

1.1、持久层

1.2、框架

2、JDBC->Mybais

3、使用Mybatis

3.1、步骤概述

3.2、步骤详述

3.3、注意事项

3.3.1、⭐MybatisDemo步骤

3.3.2、bug

3.3.3、映射文件警告信息

4、代理开发

4.1、简介

4.2、使用要求

4.3、代理代码实现

4.3.1、注意事项

4.4、mapper代理的bug


1、简介

MyBatis 是一款优秀的持久层框架用于简化 JDBC 开发。

MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github

官网:https://mybatis.org/mybatis-3

中文网:https://mybatis.org/mybatis-3/zh/index.html

介绍:

MyBatis是一款开源的持久层框架,用于Java应用程序,可以将Java对象映射到数据库中

它允许用户使用简单的XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Objects)到数据库表,减少了几乎所有的JDBC代码和手写设置参数的工作,它提供了一种灵活的查询机制,支持动态SQL,允许在查询期间动态生成SQL,并将其映射到Java对象。

总的来说,MyBatis是一款非常有用的工具,可以简化数据库应用程序的开发,使Java开发人员能够专注于应用程序逻辑,而不必关注数据库和SQL语句细节。

1.1、持久层

负责将数据到保存到数据库的那一层代码

以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。

JavaEE三层架构:表现层、业务层、持久层

1.2、框架

框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型

在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

2、JDBC->Mybais

JDBC缺点:

1.硬编码

        1.1、注册驱动、获取连接:

JDBC的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。

        1.2、SQL语句:如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。

2.操作繁琐:

        2.1、手动设置参数

        2.2、手动封装结果集

代码对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间

Mybatis优化:

  1. 硬编码可以配置到配置文件
  2. 操作繁琐的地方,Mybatis都可以自动完成

持久层框架使用占比:

3、使用Mybatis

3.1、步骤概述

  1. 创建数据库创建数据表
  2. 创建Mybatis项目
  3. 配置pom.xml
  4. 配置logback.xml
  5. 配置mybatis-config.xml
  6. 配置UserMapper.xml
  7. 创建pojo类User
  8. 创建MybatisDemo

3.2、步骤详述

下面是Mybatis详细使用步骤:

①开启数据库服务,创建数据库,创建表单

②创建Maven项目:Mybatis->项目结构如下:

③配置pom.xml,导入依赖

->所需依赖为:mybatis,mysql,junit,slf4j日志,logback

<?xml version="1.0" encoding="UTF-8"?>
<!--项目依赖为:mybatis,mysql,junit,slf4j日志,logback-->
<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>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.5</version>
        </dependency>

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.16</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>

</project>

④配置logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        CONSOLE :表示当前的日志信息是可以输出到控制台的。
    -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err-->
        <target>System.out</target>
        <encoder>
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
                %msg:日志消息,%n是换行符-->
<!--            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level]  %c [%thread] : %msg%n</pattern>-->
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %cyan([%thread]) %boldGreen(%logger{15}) : %msg %n
            </pattern>
        </encoder>
    </appender>

    <!-- File是输出的方向通向文件的 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--日志输出路径-->
        <file>C:/code/itheima-data.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>C:/code/itheima-data2-%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>

    <!--
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR    |    ALL 和 OFF
   , 默认debug
    <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
    -->
    <root level="ALL">
        <!-- 注意:如果这里不配置关联打印位置,该位置将不会记录日志-->
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

⑤配置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>
    <typeAliases>
        <package name="com.xzl.pojo"/>
    </typeAliases>
    <!--environments:配置数据库连接环境信息。
            可以配置多个environment,通过default属性切换不同的environment-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="xzlXZGK680"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="xzlXZGK680"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--加载sql映射文件-->
<!--        <mapper resource="com/xzl/pojo/UserMapper.xml"/>-->
        <mapper resource="com.xzl.pojo/UserMapper.xml"></mapper>
    </mappers>
</configuration>

⭐Mybatis连接数据库的方式:mybatis-config.xml文件中的<environment>标签,<environments default>标签可以切换不同的environment:

⑥配置SQL映射文件UserMapper.xml->方便统一管理SQL语句,解决硬编码问题

<?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>-->
<mapper namespace="com.xzl.pojo.User">
    <select id="selectAll" resultType="com.xzl.pojo.User">
        select * from tb_user;
    </select>
</mapper>

namespace命名空间可随意编写,但编写正确的包和类的关系作为命名空间,则在源码中可以方便查看跳转:

⑦创建User类

package com.xzl.pojo;

public class User {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String address;

    //省略getter和setter

    @Override
    public String toString() {
        //这里的password用PSD来代替,因为CSDN不让发,大家见谅
        return "User{" +
            "id=" + id +
            ", username='" + username + '\'' +
            ", PSD='" + password + '\'' +
            ", gender='" + gender + '\'' +
            ", address='" + address + '\'' +
            '}';
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

pojo类和Java been的区别:pojo类可以不提供全部的getter和setter方法,以及有参无参构造器等,而javaBeen的流程则更为繁琐一些。

⑧创建Mybatis的示例类:MybatisDemo

package com.xzl;

import com.xzl.pojo.User;
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;
import java.util.List;

public class MybatisDemo {
    public static void main(String[] args) throws IOException{
        //1、加载mybatis核心配置文件,获取SqlSessionFactory
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2、获取sqlSession对象,用来执行sql
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //3、执行sql
        List<User> users = sqlSession.selectList("com.xzl.pojo.User.selectAll");
        System.out.println(users);
        sqlSession.close();
    }
}

3.3、注意事项

3.3.1、⭐MybatisDemo步骤

1.加载Mybatis核心配置文件,获取SqlSessionFactory对象

        1.1、先获取字节缓存输入流

InputStream inputStream = Resources.getResourceAsStream(resource);

通过getClass可以看到,最终获取的是一个字节缓冲输入流

        1.2、获取SqlSessionFactory->

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2.获取SqlSession对象,用来执行sql->

SqlSession sqlSession = sqlSessionFactory.openSession();

3.执行sql->List<User> users = sqlSession.selectList("com.xzl.pojo.User.selectAll");

4.释放资源->sqlSession.close();

3.3.2、bug

如果代码检查了并无问题,但是却报错:

可能是SQL映射文件的加载除了问题:需要检查mybatis配置文件中加载SQL映射文件的部分:

可能是resource的资源路径书写有误,可以尝试去直接复制路径看看:

还有一个可能就是,MySQL驱动包的版本较高。MySQL 8+版本的驱动包中,在mybatis核心配置文件配置MySQL连接的url时,参数部分的连接不能用"&"而要使用"&AMP;"替代

例如:

3.3.3、映射文件警告信息

在映射配置文件中存在报红的情况。问题如下:

产生的原因:Idea和数据库没有建立连接,不识别表信息。但是它并不影响程序的执行。

解决方式:在Idea中配置MySQL数据库连接。

步骤:

点击IDEA右边框的 Database ,在展开的界面点击 + 选择 Data Source ,再选择 MySQL

在弹出的界面进行基本信息的填写,点击完成后就能看到如下界面

而此界面就和 navicat 工具一样可以进行数据库的操作。也可以编写SQL语句

4、代理开发

4.1、简介

之前的代码是基本使用方式,它也存在硬编码的问题,如下:

这里调用 selectList() 方法传递的参数是映射配置文件中的namespace.id值

这样写也不便于后期的维护。如果使用Mapper 代理方式则不存在硬编码问题:

通过上面的描述可以看出 Mapper 代理方式的目的:

解决原生方式中的硬编码

简化后期执行SQL

Mybatis 官网也是推荐使用 Mapper 代理的方式。下图是截止官网的图片:

4.2、使用要求

使用Mapper代理方式,必须满足以下要求:

①定义 与 SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下:

②设置SQL映射文件的namespace属性为Mapper接口全限定名

③在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

4.3、代理代码实现

步骤:

①创建UserMapper接口:

②UserMapper.xml 映射配置文件

③创建MybatisDemo2类:

4.3.1、注意事项

如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将mybatis核心配置文件的加载映射配置文件的配置修改为:

4.4、mapper代理的bug

这个部分请查看我的另一篇文章:
Mybatis之Error building SqlSession.https://blog.csdn.net/qq_60735796/article/details/128910611

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逐梦苍穹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值