一篇入魂,带你认识并使用Mybatis

JDBC是什么

概念

JDBC(Java Database Connectivity)是一种用于在Java应用程序和数据库之间进行连接和交互的Java API(应用程序编程接口)。它提供了一组类和接口,使开发人员能够通过标准的SQL语句来执行数据库操作,如查询、插入、更新和删除数据。

JDBC 提供了一个统一的接口,使得开发人员可以使用相同的代码来连接不同的数据库管理系统(DBMS),如MySQL、Oracle、SQL Server等。通过 JDBC,开发人员可以建立与数据库的连接、发送 SQL 语句、处理结果集和事务等。

优点

  • 广泛支持:JDBC 是 Java 的标准API,被几乎所有主流的数据库管理系统所支持。
  • 跨平台性:Java 是一种跨平台的编程语言,而 JDBC 作为其数据库访问的标准接口,也具备跨平台性。
  • 灵活性:JDBC 提供了灵活的编程方式,开发人员可以使用原生的 SQL 语句来直接操作数据库,从而有更大的控制权和自由度。

缺点

  • 低层编程:JDBC 是一种较低层次的数据库访问接口,需要开发人员手动编写和管理与数据库的连接、语句和结果集等。
  • 处理复杂性:对于复杂的数据库操作,如处理关联查询、对象映射等,使用纯 JDBC 可能变得复杂和繁琐。
  • 对象关系映射(ORM)限制:JDBC 不直接支持对象关系映射(ORM),需要开发人员自己处理将数据库结果集转换为对象的逻辑。

什么是MyBatis

概述

about

核心是操作数据库的一个框架,底层 对JDBC进行了封装
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis
免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

方式

MyBatis 提供了两种配置和映射的方式:XML 配置和注解

  1. XML 配置:通过编写简单的 XML 配置文件,开发人员可以将原始类型、接口和 Java POJO 对象与数据库中的记录进行映射关联。在 XML 配置文件中,可以定义 SQL 语句、参数映射、结果集映射等信息,MyBatis 根据这些配置信息来执行数据库操作。
  2. 注解:除了 XML 配置外,MyBatis 还提供了注解的方式来进行配置和映射。开发人员可以在 Java 类或接口上使用注解,来指定与数据库中表或字段的映射关系。通过在代码中直接添加注解,可以更加灵活地定义数据库操作。

映射

Mybatis是一个ORM(对象关系映射)框架:将数据库中查询出来的字段名与java中实体类
的属性进行一一对应,要使数据库表和实体类进行映射,遵守以下规则
数据库中的字段名如果有多个字符,中间使用下划线连接,Java中是以驼峰命名规则进行命名

优点

  • 与JDBC相比,减少了50%的代码量
  • 简单易学
  • 将SQL语句从程序代码中彻底分离出来,可以重用
  • 提供XML标签,支持编写动态SQL
  • 支持对象与数据库表的ORM字段关系映射

MyBatis中文文档:https://mybatis.net.cn/getting-started.html

缺点

学习曲线较陡峭:相对于其他 ORM 框架,MyBatis 具有较高的学习曲线。

大量的 XML 配置:在 MyBatis 中,配置信息主要通过 XML 文件进行定义。虽然这样的设计可以提供灵活性和可配置性,但也意味着需要编写大量的 XML 配置文件。

繁琐的 SQL 编写:相比于完全基于对象的 ORM (对象关系映射)框架,MyBatis 需要手动编写大量的 SQL 语句。
缺乏自动化:相较于一些全自动化的 ORM 框架,MyBatis 需要手动编写和维护持久化代码。

对象关系映射(ORM)的限制:MyBatis 是一个半自动的 ORM 框架,它并不会对数据库模式和对象实体之间的关系进行严格的管理。

使用MyBatis

环境配置

导入依赖

<dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.10</version>
        </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>

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

            <dependency>
                <groupId>org.projectLombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.26</version>
            </dependency>
    </dependencies>

导入了如下依赖

MyBatis(org.mybatis:mybatis:3.5.10):MyBatis 是一个开源的持久层框架,用于在 Java 应用程序中与数据库进行交互。

MySQL Connector(mysql:mysql-connector-java:5.1.38):这是 MySQL 数据库的官方 Java 驱动程序。

JUnit(junit:junit:4.13.2):JUnit 是一个 Java 编程语言的单元测试框架

Lombok(Project Lombok)是一个Java库,它通过使用注解来减少Java类中的冗余代码。

项目结构

在这里插入图片描述

jdbc.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/hqyj03?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimeZone=Asia/Shanghai
password=aaa
username=root

方便给mybatis配置文件设置值

mybatis配置文件

在resource目录下创建mybatis配置文件,使用xml方式编写数据库连接信息

  1. 在idea中设置mybatis配置文件模板,使得创建的时候更方便(下面有配置文件内容)
    在这里插入图片描述
  2. 在配置文件中编写数据库连接信息。

在内容里面可以看见${}这种语法。

${driver} 是 MyBatis 配置文件(mybatis-config.xml)中的占位符语法,${driver} 即为一个占位符,它会根据 ${jdbc.driver} 所引用的属性值进行替换。用于引用配置文件中定义的属性值。

在 MyBatis 的配置文件中,可以使用 <properties> 元素定义一组属性,并通过 ${propertyName} 的方式来引用这些属性。

<?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 resource="jdbc.properties"></properties>
    <!--mybatis环境,default属性指定一个环境-->
    <environments default="development">
        <!--id属性自定义的环境唯一标识符-->
        <environment id="development">
            <!--指定使用jdbc事务管理-->
            <transactionManager type="JDBC"/>
            <!--使用mybatis内部带连接池功能的数据源-->
            <dataSource type="POOLED">
                <!--获取配置驱动-->
                <property name="driver" value="${driver}"/>
                <!--获取配置url-->
                <property name="url" value="${url}"/>
                <!--获取配置账号-->
                <property name="username" value="${username}"/>
                <!--获取配置密码-->
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射器,映射器的 XML 映射文件包含了 SQL 代码和映射定义信息-->
    <mappers>
        <mapper resource="com/yjg/mybatis/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

Tip

default="development" 表示将 development 这个环境设置为默认环境。这意味着如果没有明确指定使用哪个环境,MyBatis 将使用名为 development 的环境作为默认环境。

<environments> 元素内部,你可以定义多个 <environment> 子元素来配置不同的环境。每个 <environment> 元素都包含一个或多个数据源(<dataSource>)、事务管理器(<transactionManager>)和其他可选的配置。

编写代码

数据库代码

CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

实体类

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String password;
}

接口

Java 接口文件(Mapper 接口):Mapper 接口用于定义数据库操作的方法。

public interface UserMapper {
    //根据id查询用户
    User queryUserById();

    //查询用户数量
    int queryUserCount();

    //查询全部用户
    List<User>queryAllUser();

    //插入用户
    int  addUser();

    //更新用户
   int updateUser();

   //查询一个用户返回值类型为Map类型
  // @MapKey( "id")加上就指定id字段作为key,可以不加
    Map<String,Object> queryUserToMap(); 
}

映射文件

映射文件(Mapper XML 文件):映射文件用于定义 SQL 语句的映射关系,将 Java 对象与数据库表进行关联。

  • <mapper> 标签的 namespace 属性用于指定映射文件与对应的接口或类之间的关联关系。通过指定 namespace 属性,MyBatis 就能够将映射文件与对应的接口或类进行绑定,使得在使用时可以更方便地进行调用。

    具体而言,namespace 属性的取值应为接口或类的全限定名(包括包路径)。这里的接口或类所指的是与映射文件相对应的 Java 接口或类,它们定义了与数据库交互的方法和 SQL 语句的对应关系。

  • <select><insert><update><delete> 元素:分别用于定义查询、插入、更新、删除操作的 SQL 语句。其中,id 属性指定了该语句的唯一标识符

  • ``resultType指定了查询结果的对象类型:当resultType` 指定的类型是一个基本类型(如 String、Integer 等)或简单的 JavaBean 类时,MyBatis 会通过列名和属性名的匹配自动将查询结果映射到对应的属性上。

<?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">

<!--在configuration配置内容时,有顺序限制-->

<!-- namespace:Mapper接口的全路径,使其和UserMapper对应-->
<mapper namespace="com.yjg.mybatis.mapper.UserMapper">
    <!--执行DML操作时,返回值都是影响行数所以不需要指定返回值类型-->
    <insert id="addUser">
      INSERT into user VALUES(8,"www","www");
    </insert>
    <update id="updateUser"></update>	
     
    <select id="queryUserById" resultType="com.yjg.mybatis.pojo.User">
        select * from user where id=1;
    </select>
    <select id="queryUserCount" resultType="Integer">
        select count(*)from user;
    </select>

<!--写List里面装入的数据类型-->
    <select id="queryAllUser" resultType="com.yjg.mybatis.pojo.User">
        select *from user;
    </select>

<!--  返回值为Map类型会将表的字段作为key字段对应值作为value-->
    <select id="queryUserToMap" resultType="map">
        select * from user  where id=1;
    </select>
</mapper>

为什么UserMapper.xml,目录路径要和接口的类路径相同?

是因为 MyBatis 默认使用相同的目录结构和名称来进行映射关系的配置。

在 MyBatis 中,Mapper 接口与映射文件(Mapper XML 文件)是一一对应的关系。按照默认的约定,映射文件的路径和名称应该与 Mapper 接口的类路径和名称相同,只是后缀名不同(接口是 .java,映射文件是 .xml)。

当使用 Maven 构建项目时,一般会将配置文件(包括 MyBatis 的映射文件)放在 src/main/resources 目录下。

这些资源文件会在构建过程中被拷贝到输出目录(如 target/classes 目录)中,以便在运行时可以正确地加载和使用。

所以,在使用 Maven 构建项目时,一般将 MyBatis 的映射文件(UserMapper.xml 等)放在 src/main/resources 下的相应目录中

输出目录,可见最后是放在一起的
在这里插入图片描述

返回值类型resultType设置

  • 如果是实体类,必须写全路径。
  • 如果是执行DML操作。返回值都是影响行数不驽要再指定返回值类型。
  • 如果是jdk自带的类型,可以写全路径,也可写别名

测试类

public class Test1 {
    SqlSession sqlSession;
    @Before
    public void before() throws IOException {
        //1.读取mybatis核心配置文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        //2.实例化SqlSessionFactoryBuilder
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //3.调用 build() 方法并传入配置文件的输入流 configStream,
        //可以创建一个配置了数据库连接信息、映射文件路径等的 SqlSessionFactory 对象。
        SqlSessionFactory factory = builder.build(inputStream);
        //4.获取SqlSession
         sqlSession = factory.openSession(true);//打开自动提交
    }

    //Mybatis中提供数据库操作的核心接口:SqlSession
    @Test
    public void test1() throws Exception{
        //5.给接口创建代理实现类对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //6.调用接口方法执行对应sql操作
        User user = mapper.queryUserById();
        System.out.println(user);

    }

    @Test
    public void test2() throws Exception{
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.queryUserCount();
        System.out.println(i);
    }

    @Test
    public void test3(){
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.queryAllUser();
        users.forEach(System.out::println);
    }


    @Test
    public void test4(){
        //自动提交是默认关闭的需要手动提交事务
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        int i = mapper.addUser();
        //提交事务可以使用sqlSession.commit();也可以在@Before注解里面打开
        System.out.println(i);
    }

    @Test
    public void test5(){
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        Map map = mapper.queryUserToMap();
        System.out.println(map);
    }
}

总结

MyBatis 映射流程主要包括以下几个步骤:

  1. 配置数据库信息:在 MyBatis 的配置文件中,需要配置数据源(DataSource)的相关信息,如数据库驱动、连接地址、用户名和密码等。
  2. 定义实体类:创建与数据库表结构对应的 Java 实体类,其中的属性与表中的字段相对应。
  3. 创建映射文件:编写与数据库操作相关的 SQL 语句,并将其存储在映射文件中。映射文件通常采用 XML 格式,用于定义 SQL 语句以及与之对应的实体类方法。
  4. 配置映射文件:在 MyBatis 的配置文件中,需要配置映射文件的路径,使 MyBatis 能够找到并解析映射文件。
  5. 创建 SqlSessionFactory:SqlSessionFactory 初始化时会加载并解析mybatis配置文件,其中包含了数据库连接的配置信息,如数据库的 URL、用户名、密码等。当调用 SqlSessionFactory.openSession() 方法创建 SqlSession 对象
  6. 创建 SqlSession:通过 SqlSessionFactory 创建 SqlSession 对象,SqlSession 提供了进行数据库操作的方法。SqlSessionFactory 并没有直接连接数据库,它只是用于创建和配置 SqlSession 对象,而 SqlSession 才是用于实际的数据库交互。
  7. 进行数据库操作:利用 SqlSession 对象执行具体的数据库操作,如插入数据、查询数据、更新数据或删除数据等。这些操作会根据映射文件中定义的 SQL 语句进行执行,将结果返回给调用方。SqlSession 是 MyBatis 的会话对象,用于执行 SQL 语句并与数据库进行交互。通过调用 getMapper() 方法,里面填入的参数是映射器接口(测试代码中UserMapper.class就是),可以获取一个映射器(Mapper)的实例。映射器的实例就是一个能够执行与数据库交互的方法的对象,它基于映射器接口和配置的 SQL 语句,提供了一种便捷的方式来进行数据库操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yjg_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值