当前位置: 首页 > news >正文

图文讲解带你拿捏MyBatis(一)——MyBatis入门

1 MyBatis入门

摘要:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。在本文中,我们会学习一些mybatis的相关概念,以及搭建其开发环境以便快速入门。

作者:来自ArimaMisaki创作

文章目录

  • 1 MyBatis入门
    • 1.1 历史
    • 1.2 特性
    • 1.3 下载
    • 1.4 搭建开发环境
    • 1.5 优化测试类
    • 1.6 搭配日志框架

1.1 历史

说明:MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
当前,最新版本是MyBatis 3.5.9,其发布时间是2021年12月26日。


1.2 特性

特性

  • MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
  • MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  • MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
  • MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架

1.3 下载

官网:入门_MyBatis中文网

下载:我们推荐使用maven来构建MyBatis项目。主要的方法是在pom.xml中导入下列坐标,也可以通过alt+insert搜索mybatis导入坐标。

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

1.4 搭建开发环境

步骤

  1. 在pom.xml中配置所需的jar包

    <dependencies>
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.11</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.28</version>
            </dependency>
        </dependencies>
    
  2. 创建数据库mybatis_test,并且创建一张名为t_user的表。

    create table mybatis_test.t_user
    (
        id       int auto_increment,
        username varchar(255) null,
        password varchar(255) null,
        age      int          null,
        gender   char         null,
        email    varchar(255) null,
        constraint key_name
            primary key (id)
    );
    
  3. 新建一个实体类,里面是该表的各项数据。

    image-20221002224519627

    package mybatis.pojo;
    
    public class User {
        private Integer id;
        private String username;
        private Integer age;
        private String gender;
        private String email;
    
        public User(Integer id, String username, Integer age, String gender, String email) {
            this.id = id;
            this.username = username;
            this.age = age;
            this.gender = gender;
            this.email = email;
        }
    
        public User(){}
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", age=" + age +
                    ", gender='" + gender + '\'' +
                    ", email='" + email + '\'' +
                    '}';
        }
    }
    
  4. 创建配置文件;习惯上将配置文件名命名为mybatis-config.xml;配置文件主要用于配置链接数据库的环境和mybatis的全局配置信息;在配置文件中,记得自己修改对应的jdbc驱动、数据库地址、用户名和密码;里面的mappers标签包裹的mapper的rosouce属性值为mybatis的映射文件。何为映射文件?我们可以理解为sql语句啥的不会写在该配置文件中,而是从新建立一个.xml后缀的文件来书写sql语句,该文件我们用术语映射文件来称呼他。

    image-20221002224618590

    <?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">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <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=""/>
      </mappers>
    </configuration>
    
  5. 创建一个mapper接口。该接口可以理解为以前的dao,但是区别在于mapper仅仅是接口,而无需提供实现类。接口名一般看操作哪个表,如操作t_user表就把接口命名为UserMapper;我们在该接口中还书写了一个表插入数据的insertUser方法。

    public interface UserMapper{
    	int insertUser();
    }
    
  6. 创建一个映射文件;其中有个概念为ORM(对象关系映射);一般映射文件的命名遵循表的实体类类名+Mapper.xml,如我们现在要创建一个名为UserMapper.xml文件,这侧面可以看出一个映射文件对应一个表和一个实体类;映射文件主要用于编写SQL,访问以及操作表中的数据。映射文件的模板可以在官网找到,需要注意的是,其中的namespace用于和mapper接口关联,也就是说namespace需要填入接口在项目中的位置;而mapper标签中的子标签可以根据不同的操作选择不同的子标签,我们这里选择insert插入标签并且配置属性id为对应接口中书写的插入方法,做完这些,我们就可以在insert标签中写上sql语句了。

    上面的话可能稍显复杂,但是完美阐述了配置的过程。我们总结一下mapper配置文件需保持两个一致:命名空间和接口名一致;接口的方法名和映射文件中sql操作标签的id一致

    <?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="mybatis.mapper.UserMapper">
        <insert id="insertUser">
            insert into t_user values(null,'admin','123456',23,'男','12345@qq.com')
        </insert>
    </mapper>
    
  7. 返回mybatis配置文件,将mapper标签中的resource属性值写上映射文件对应的路径。

    image-20221002231407821

    <?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">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <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="mappers/UserMapper.xml"/>
      </mappers>
    </configuration>
    
  8. 创建一个MyBatisTest测试类

    image-20221002231626271

    package mybatis.test;
    
    import 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 testInsert() throws IOException {
            // 1.需要调用mybatis提供的方法来获取mybatis的配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 2.获取SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 3.通过构建器来根据输入流生成一个一个sqlSession工厂对象
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            // 4.获取sql的会话对象sqlSession,该对象用于操作数据库
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 5.获取UserMapper代理对象,底层使用了代理模式,帮我们创建了一个代理实现类
            UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            // 6.可以调取接口的方法了
            int result = mapper.insertUser();
            System.out.println(result);
            // 7.调取后的方法虽然执行了,但没有持久化到数据库(未提交事务)
            sqlSession.commit();
            // 8.关闭会话
            sqlSession.close();
        }
    }
    
  9. 查看数据库数据是否添加成功

    image-20221002233058813


1.5 优化测试类

说明1:在测试类中我们写了不少代码,但是有很多代码都是被重复使用的,故我们可以将其封装到工具类lib中的某个方法中,这样就可以减少代码量。

		// 1.需要调用mybatis提供的方法来获取mybatis的配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.通过构建器来根据输入流生成一个一个sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取sql的会话对象sqlSession,该对象用于操作数据库
        SqlSession sqlSession = sqlSessionFactory.openSession();

说明2:如果不想通过获取mapper接口的代理对象再调用其方法,那我们可以通过sqlSession.insert(namespace.sqlId)的方式来调用接口中的方法,但这种方式较少使用

package mybatis.test;

import 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 testInsert() throws IOException {
        // 1.需要调用mybatis提供的方法来获取mybatis的配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.通过构建器来根据输入流生成一个一个sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取sql的会话对象sqlSession,该对象用于操作数据库
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 5.获取UserMapper代理对象,底层使用了代理模式,帮我们创建了一个代理实现类
        // UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 6.可以调取接口的方法了
        // int result = mapper.insertUser();
        int result = sqlSession.insert("mybatis.mapper.UserMapper.insertUser");
        System.out.println(result);
        // 7.调取后的方法虽然执行了,但没有持久化到数据库(未提交事务)
        sqlSession.commit();
        // 8.关闭会话
        sqlSession.close();
    }
}

说明3:如果不想每次写完sql后都调用sqlSession来提交事务,则在开启会话时,即调用sqlSessionFactory.openSession方法时,可以通过其构造器传入参数true,其对应开启autoCommit属性。

package mybatis.test;

import 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 testInsert() throws IOException {
        // 1.需要调用mybatis提供的方法来获取mybatis的配置文件的输入流
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // 2.获取SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 3.通过构建器来根据输入流生成一个一个sqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        // 4.获取sql的会话对象sqlSession,该对象用于操作数据库
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        // 5.获取UserMapper代理对象,底层使用了代理模式,帮我们创建了一个代理实现类
        // UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        // 6.可以调取接口的方法了
        // int result = mapper.insertUser();
        int result = sqlSession.insert("mybatis.mapper.UserMapper.insertUser");
        System.out.println(result);
        // 7.调取后的方法虽然执行了,但没有持久化到数据库(未提交事务)
        // sqlSession.commit();
        // 8.关闭会话
        sqlSession.close();
    }
}


1.6 搭配日志框架

搭配步骤

  1. 在pom.xml中导入log4j坐标

            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.12</version>
            </dependency>
    
  2. 新建log4j.xml配置文件

    image-20221002235921515

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
            <param name="Encoding" value="UTF-8" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}
    %m (%F:%L) \n" />
            </layout>
        </appender>
        <logger name="java.sql">
            <level value="debug" />
        </logger>
        <logger name="org.apache.ibatis">
            <level value="info" />
        </logger>
        <root>
            <level value="debug" />
            <appender-ref ref="STDOUT" />
        </root>
    </log4j:configuration>
    

相关文章:

  • [Python]Django类视图
  • 重识Nginx - 12 SSL/TLS 浅析
  • 神经网络做多元线性回归,神经网络是线性模型吗
  • 如何查看Debian/Ubuntu和RHEL/AlmaLinux/Rocky软件包的更新日志
  • Java—多线程
  • 【第九篇】商城系统-商城首页功能
  • 【SpringBoot+MyBatisPlus】系统全局异常处理器的使用以及添加员工功能的实现
  • FreeRTOS大杂烩
  • 都这麽大了还不快了解防病毒网关?
  • HTML 笔记(八):SVG
  • 15.5 - 边界值法
  • 图解MySQL 记录
  • Effective C++学习笔记——确定对象被使用前已先被初始化
  • 一文弄懂 HashMap 中的位运算
  • 【易购管理系统】路由界面基础搭建
  • #Java异常处理
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • ES6 ...操作符
  • ES6简单总结(搭配简单的讲解和小案例)
  • java8-模拟hadoop
  • js如何打印object对象
  • Laravel5.4 Queues队列学习
  • mockjs让前端开发独立于后端
  • PHP 7 修改了什么呢 -- 2
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 聊聊redis的数据结构的应用
  • 悄悄地说一个bug
  • 算法-图和图算法
  • 为什么要用IPython/Jupyter?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #pragam once 和 #ifndef 预编译头
  • #在 README.md 中生成项目目录结构
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (14)Hive调优——合并小文件
  • (3)选择元素——(17)练习(Exercises)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (SpringBoot)第七章:SpringBoot日志文件
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (搬运以学习)flask 上下文的实现
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (四)Linux Shell编程——输入输出重定向
  • (一)UDP基本编程步骤
  • (转载)hibernate缓存
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .Mobi域名介绍
  • .mysql secret在哪_MySQL如何使用索引
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net Remoting常用部署结构
  • .NetCore部署微服务(二)
  • .net对接阿里云CSB服务
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国