学习Mybatis

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一.Mybatis特性 二.常见持久层技术的比较 三.搭建Mybaits环境 四.使用Mybatis 五.通过Mybatis实现增删改 六.实现数据库的查询操作


一.Mybatis特性

    1. 定制化SQL:MyBatis允许开发人员编写、优化和管理自定义的SQL语句,可以满足复杂查询和存储过程等高级操作的需求。
    2. 避免JDBC代码:MyBatis抽象了JDBC底层的繁琐操作,开发人员无需手动设置参数和获取结果集,通过配置文件或注解即可完成数据库操作。
    3. 灵活的映射配置:MyBatis通过简单的XML配置文件或者注解来实现对象与数据库记录之间的映射关系,将接口和Java的POJO对象映射到数据库表中的记录。
    4. 高度可定制:MyBatis提供了丰富的配置选项和插件机制,可以按照项目需求进行灵活的定制和扩展。开发人员可以根据具体情况选择合适的配置方式。

    二.常见持久层技术的比较

    JDBC:

      • 优点:JDBC是Java连接数据库的标准接口,具有广泛的适应性和灵活性。可以直接编写SQL语句,对数据库操作更为直观。
      • 缺点:需要在代码中编写和管理SQL语句,导致代码与SQL耦合度高,难以维护和修改。开发效率较低,代码冗长。

      Hibernate和JPA:

        • 优点:操作简便,开发效率高。通过对象关系映射(ORM)实现数据库操作,屏蔽了底层SQL细节,减少了手动编写SQL的工作量。
        • 缺点:对于复杂的SQL查询,可能需要绕过框架,使用特定的查询语言。自动生成的SQL语句可能不容易进行特殊优化。在处理大量字段的POJO进行部分映射时会比较困难。反射操作较多可能导致数据库性能下降。

        MyBatis:

          • 优点:轻量级且性能出色,具有很高的执行效率。SQL和Java代码相分离,功能边界清晰,Java代码专注于业务逻辑,SQL语句专注于数据操作。可以灵活地编写和优化SQL语句。
          • 缺点:相对于Hibernate,开发效率稍逊一些,需要手动编写和管理SQL语句。

          三.搭建Mybaits环境

          使用工具Maven idea Mysql

          1.配置

          在maven的pom.xml中需要配置三个模块,mysql-connect-java、mabatis、junit

          配置如下:

          <!--    mysql驱动-->
              <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.33</version>
              </dependency>
          <!--      mybatis核心-->
              <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
              </dependency>
                <!--    junit测试-->
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>RELEASE</version>
                    <scope>test</scope>
                </dependency>

          image.gif

          2.构建连接数据库的xml

          image.gif编辑

          在resources中(如果没有resource则创建一个)创建名称为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><!-- 配置 -->
          <!--    配置连接数据库的环境-->
              <environments default="development">
          <!--        设置环境id-->
                  <environment id="development">
          <!--            事务管理模式-->
                      <transactionManager type="JDBC"/>
          <!--            数据源类型-->
                      <dataSource type="POOLED">
                          <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
          <!--                配置url时候记得jdbc:mysql://localhost:3306后面加上的是选择的具体数据库-->
          <!--                我这里选择我创建的mysqltest数据库-->
                          <property name="url" value="jdbc:mysql://localhost:3306/mysqltest"/>
          <!--                输入连接你的数据库的名称和密码-->
                          <property name="username" value="mysql"/>
                          <property name="password" value="123456"/>
                      </dataSource>
                  </environment>
              </environments>
          <!--    配置映射文件-->
              <mappers>
          <!--        这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置-->
                  <mapper resource=""/>
              </mappers>
          </configuration>

          image.gif


          四.使用Mybatis

          1.创建实体类

          在完成了搭建环境后,在Java下的com下创建目录pojo,创建一个需要与数据库映射对应的类,比如创建一个用户类

          image.gif编辑

          创建好后设置好构造函数、getter、toString,如下

          package com.alphamilk.mybatis.pojo;
          public class User {
          //    设置名字
              private String name;
          //    设置年龄
              private int age;
          //    设置邮箱地址
              private String email;
          //    设置身份id
              private int  id;
              public User(String name, int age, String email, int id) {
                  this.name = name;
                  this.age = age;
                  this.email = email;
                  this.id = id;
              }
              public String getName() {
                  return name;
              }
              public int getAge() {
                  return age;
              }
              public String getEmail() {
                  return email;
              }
              public int getId() {
                  return id;
              }
              @Override
              public String toString() {
                  return "User{" +
                          "name='" + name + '\'' +
                          ", age=" + age +
                          ", email='" + email + '\'' +
                          ", id=" + id +
                          '}';
              }
          }

          image.gif

          2.在数据库中创建同样创建一样的表

          Sql语言如下:

          create table table_user
          (
            name varchar(10) null,
            age int null,
            email varchar(20) null,
            id int null
          );

          image.gif

          image.gif编辑

          3.创建业务接口类

          首先在com下创建一个mapper包,里面再创建一个接口 创建映射接口(User对应的就是UserMapper)

          image.gif编辑

          4.创建接口实现映射

          创建接口后,为了实现接口的功能,又需要实现java与sql的分离,则需要用xml配置实现,在resource包下创建一个mappers包,写一个对应的xml

          <?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.alphamilk.mybatis.mapper.UserMapper">
              <!--    配置实体类映射接口-->
          <!--    通过标签的设置就可以实现对应的操作,insert标签对应插入操作-->
          <!--    注意id需要与其作用的方法名称对应,该方法在接口中名称为public int insertUser();-->
          <!--    内部写对应的sql语句-->
              <insert id="insertUser">
                  insert into table_user value ('何生',20,'915@qq.com',001)
              </insert>
          </mapper>

          image.gif

          5.实现接口映射后,就需要将映射的xml导入到mybatis-config.xml中

          <mappers>
                  <!--        这个暂时不需要设置默认为空就行,在后面具体操作的时候再进行配置-->
                  <mapper resource="mappers/UserMapper.xml"/>
              </mappers>

          image.gif

          5.最后创建测试类,测试Mybatis是否能够正常运行

          创建MybatisTest类

          image.gif编辑

          内容如下:

          package com.alphamilk.mybatis;
          import com.alphamilk.mybatis.mapper.UserMapper;
          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 org.junit.Test;
          import java.io.IOException;
          import java.io.InputStream;
          public class MybatisTest {
              @Test
              public void  Test() throws IOException {
          //       创建核心输入流
                  InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
          //        创建SqlSessionFactoryBuilder对象
                  SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
          //      获取SqlSessionFactory对象
                  SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
          //        获取Session会话对象,会话对象用以提供
                  SqlSession sqlSession = sqlSessionFactory.openSession();
          //        创建动态代理对象
                  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          //        通过代理对象调用方法insertUser
                  int result =  mapper.insertUser();
          //        执行完后需要记得提交事务,才会保留内容到数据库
                  sqlSession.commit();
          //      执行完后关闭会话对象
                  System.out.println(result);
                  sqlSession.close();
              }
          }

          image.gif

          注意用的Resource是包org.aphache.ibatis.io

          image.gif编辑

          执行后可以在数据库中查看表

          image.gif编辑

          可以看到正常插入进去了


          五.通过Mybatis实现增删改

          增删查改,除了查,其他操作跟上述一样。

          这里展示其源码

          由于Test测试类中有太复杂的操作,所以在com目录下创建了一个util工具类,类中实现一个方法就是给我们返回SqlSession操作数据库对象

          代码如下

          package com.alphamilk.mybatis.util;
          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.InputStream;
          public class MybatisUtil {
              public static SqlSession getSession(){
                  SqlSession sqlSession =null;
                  try {
          //            配置核心配置输入流
                      InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
          //           获取SqlSessionFactoryBuilder对象
                      SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
          //            获取sqlSessionFactory对象
                      SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
          //            获取sqlSession对象
                      sqlSession = sqlSessionFactory.openSession();
                      return sqlSession;
                  }catch (Exception e){
                      e.printStackTrace();
                  }
                  return sqlSession;
              }
          }

          image.gif

          由于需要实现删该的方法,所以在接口中需要实现方法增加

          package com.alphamilk.mybatis.mapper;
          public interface UserMapper {
          //    实现用户插入
              public int insertUser();
          //   实现用户信息修改
              public int UpdateUser();
          //    实现用户信息消除
              public int DeleteUser();
          }

          image.gif

          对应的映射也需要增加

          <?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.alphamilk.mybatis.mapper.UserMapper">
              <!--    配置实体类映射接口-->
          <!--   方法insertUser() -->
              <insert id="insertUser">
                  insert into table_user value ('何生',20,'915@qq.com',001)
              </insert>
          <!--    方法UpdateUser()-->
              <update id="UpdateUser">
                  update table_user set name ='黄小龙'where id=1
              </update>
          <!--    方法DeleteUser()-->
              <delete id="DeleteUser">
                  delete from table_user where name='黄小龙'
              </delete>
          </mapper>

          image.gif

          最后测试类实现

          package com.alphamilk.mybatis;
          import com.alphamilk.mybatis.mapper.UserMapper;
          import org.apache.ibatis.session.SqlSession;
          import org.junit.Test;
          public class MybatisTest {
              @Test
              public void Test(){
                  SqlSession sqlSession = null;
                  sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
                  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          //        执行insert方法
          //        mapper.insertUser();
          //        执行修改方法
                  mapper.UpdateUser();
          //        执行删除方法
          //        mapper.DeleteUser();
              }
          }

          image.gif

          实现数据修改效果

          image.gif编辑

          实现数据删除效果

          image.gif编辑


          六.实现数据库的查询操作

          由于数据库查询的操作需要返回的是数据的结果

          在设置xml时候,需要而外设置参数resultType 或者 resultMap

            • resultType:设置结果类型,即查询的数据要转换的java类型
            • resultMap,处理一对一或者一对多的映射关系
            <!--    getUserById()-->
            <!--    resultType:设置结果类型,即查询的数据要转换的java类型
                    resultMap,处理一对一或者一对多的映射关系
                    这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象
            -->
                <select id="getgetUserById" resultType="com.alphamilk.mybatis.pojo.User" >
                    select name from table_user where id =2
                </select>

            image.gif

            测试类内容

            package com.alphamilk.mybatis;
            import com.alphamilk.mybatis.mapper.UserMapper;
            import com.alphamilk.mybatis.pojo.User;
            import org.apache.ibatis.session.SqlSession;
            import org.junit.Test;
            public class MybatisTest {
                @Test
                public void Test(){
                    SqlSession sqlSession = null;
                    sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
                    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //        执行insert方法
            //        mapper.insertUser();
            //        执行修改方法
            //        mapper.UpdateUser();
            //        执行删除方法
            //        mapper.DeleteUser();
            //        执行通过id查询
                    User user =  mapper.getUserById();
                    System.out.println(user);
                    sqlSession.commit();
                    sqlSession.close();
                }
            }

            image.gif

            image.gif编辑

            如果有多个结果则返回时候需要用集合接收

            当前xml配置

            <?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.alphamilk.mybatis.mapper.UserMapper">
                <!--    配置实体类映射接口-->
            <!--   方法insertUser() -->
                <insert id="insertUser">
                    insert into table_user value ('何生',20,'915@qq.com',001)
                </insert>
            <!--    方法UpdateUser()-->
                <update id="UpdateUser">
                    update table_user set name ='黄小龙'where id=1
                </update>
            <!--    方法DeleteUser()-->
                <delete id="DeleteUser">
                    delete from table_user where name='黄小龙'
                </delete>
            <!--    getUserById()-->
            <!--    resultType:设置结果类型,即查询的数据要转换的java类型
                    resultMap,处理一对一或者一对多的映射关系
                    这里使用returnType设置为pojo包内的User类型(注意一定要明确详细的类名),即返回结果是User对象
            -->
                <select id="getUserById" resultType="com.alphamilk.mybatis.pojo.User" >
                    select * from table_user where id =2
                </select>
            <!--    对应接口内方法public  User getUserAll();-->
                <select id="getUserAll">
                    select * from table_user
                </select>
            </mapper>

            image.gif

            测试类内容

            package com.alphamilk.mybatis;
            import com.alphamilk.mybatis.mapper.UserMapper;
            import com.alphamilk.mybatis.pojo.User;
            import org.apache.ibatis.session.SqlSession;
            import org.junit.Test;
            import java.util.Iterator;
            import java.util.List;
            public class MybatisTest {
                @Test
                public void Test(){
                    SqlSession sqlSession = null;
                    sqlSession = com.alphamilk.mybatis.util.MybatisUtil.getSession();
                    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //        执行insert方法
            //        mapper.insertUser();
            //        执行修改方法
            //        mapper.UpdateUser();
            //        执行删除方法
            //        mapper.DeleteUser();
            //        执行通过id查询
            //        User user =  mapper.getUserById();
            //        System.out.println(user);
            //        查询所有用户的信息
                    List<User> list = mapper.getUserAll();
                    Iterator<User> iterator = list.listIterator();
                    while (iterator.hasNext()){
                        System.out.println(iterator.next());
                    }
                    sqlSession.commit();
                    sqlSession.close();
                }
            }

            image.gif

            image.gif编辑

            image.gif编辑


            相关实践学习
            如何在云端创建MySQL数据库
            开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
            全面了解阿里云能为你做什么
            阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
            目录
            相关文章
            |
            2月前
            |
            Java 关系型数据库 MySQL
            springboot学习五:springboot整合Mybatis 连接 mysql数据库
            这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
            218 0
            springboot学习五:springboot整合Mybatis 连接 mysql数据库
            |
            3月前
            |
            Java 关系型数据库 数据库连接
            mybatis-plus学习
            MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
            51 5
            |
            4月前
            |
            安全 Java 数据库连接
            后端框架的学习----mybatis框架(3、配置解析)
            这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
            后端框架的学习----mybatis框架(3、配置解析)
            |
            4月前
            |
            Java 数据库连接 mybatis
            后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
            这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
            |
            4月前
            |
            Java 数据库连接 测试技术
            后端框架的学习----mybatis框架(8、lombok)
            这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
            |
            4月前
            |
            Java 数据库连接 数据库
            后端框架的学习----mybatis框架(6、日志)
            这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
            |
            4月前
            |
            SQL Java 数据库连接
            后端框架的学习----mybatis框架(5、分页)
            这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
            |
            4月前
            |
            SQL Java 数据库连接
            后端框架的学习----mybatis框架(7、使用注解开发)
            这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
            |
            7月前
            |
            SQL Java 数据库连接
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            |
            6月前
            |
            Java 数据库连接 Maven
            Mybatis学习
            Mybatis学习
            31 0