学习Mybatis

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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编辑


            相关实践学习
            基于CentOS快速搭建LAMP环境
            本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
            全面了解阿里云能为你做什么
            阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
            目录
            相关文章
            |
            1天前
            |
            SQL Java 数据库连接
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
            |
            1天前
            |
            SQL XML Java
            学习Mybatis相关知识
            一、什么是Mybatis? 1、Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。开发人员直接编写原生态sql,即可严格控制sql执行性能、且灵活度高。
            13 0
            |
            1天前
            |
            XML Java 数据库连接
            Mybatis-Plus学习小项目及详细教程
            Mybatis-Plus学习小项目及详细教程
            |
            1天前
            |
            SQL 缓存 Java
            Mybatis学习文章
            Mybatis学习文章
            |
            1天前
            |
            SQL Java 数据库连接
            还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
            还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
            |
            1天前
            |
            XML SQL Java
            今日记录:学习一个Mybatis的技能之choose 和 bind
            今日记录:学习一个Mybatis的技能之choose 和 bind
            28 1
            |
            1天前
            |
            算法 数据库
            MYSQL-mybatisplus的主键自增问题与@Tableld@TableField@TableLogic的学习
            关于org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.laoyang.Mapper.BookMapper.deleteById问题
            |
            6月前
            |
            SQL XML Java
            Mybatis框架使用的学习
            在沃尔玛项目中的Mybatis框架使用了两种实现CRUD的模式,为Dao文件编写相应的xml实现功能与直接在Dao的方法中直接使用注解开发
            30 1
            |
            7月前
            |
            SQL Java 数据库连接
            MyBatisPlus学习
            MyBatisPlus学习
            49 0
            |
            9月前
            |
            Java 数据库连接 数据库
            SSM 最全学习内容总结(Spring+SpringMVC+MyBatis)
            本文介绍SSM学习过程,同时附上相关技术文章
            1008 0