第一个Mybatis程序

2023-11-05

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

学习优秀框架最好的方式就是阅读官网文档,经过初步理解和掌握,初试第一个mybatis程序。

根据官网文档。创造一个Maven项目并且在pom文件中进入如下必备的代码配置。

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

当然初次之外还需要mysql依赖和一个测试junit依赖,配置后的pom为(最后一个是为了解决maven的小缺陷,我认为是小缺陷,文件过滤(之后再深入学习)没有这个的话,mapper.xml无法加载进target然后报错 )

<?xml version="1.0" encoding="UTF-8"?>
<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_first_study</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mybatis-01</module>
    </modules>
    <!--引入依赖-->

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.36</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.2</version>
            <scope>test</scope>
        </dependency>


    </dependencies>

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

    <build>
        <!-- 资源目录 -->
        <resources>
            <resource>
                <!-- 设定主资源目录  -->
                <directory>src/main/java</directory>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,不处理如下配置中包含的资源类型(剔除下如下配置中包含的资源类型)-->
                <excludes>
                    <exclude>**/*.yaml</exclude>
                </excludes>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,指定处理后的资源文件输出目录,默认是${build.outputDirectory}指定的目录-->
                <!--<targetPath>${build.outputDirectory}</targetPath> -->
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,是否对主资源目录开启资源过滤 -->
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <!-- maven default生命周期,process-resources阶段执行maven-resources-plugin插件的resources目标处理主资源目下的资源文件时,只处理如下配置中包含的资源类型 -->
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>



</project>

接下来从 XML 中构建 SqlSessionFactory,

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

必备的代码 我们做成工具类,如下

package com.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.IOException;
import java.io.InputStream;

/**
 * @Author:XK
 * @Date: Created in 23:08 2021/10/30
 * @Description:
 **/
public class MybatisUtil {

    private static SqlSessionFactory sqlSessionFactory;
    static
        {
            try {
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }

}

获得一个构造sqlsession的方法,

然后了解到一个mybatis-config.xml文件,XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源。于是被迫进行一个xml文件的配置。如下,这个放在resources下。(具体的文件结构一会给出,不过没有认真整理还是比较乱,希望大家养成良好的目录习惯)

<?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="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/fisrt21?useUnicod=true&amp;characterEncoding=utf-8&amp;useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="2020"/>
            </dataSource>
        </environment>
    </environments>

<!--  每个mapper。xml都需要在核心配置文件中  注册mapper仓库-->
    <mappers>
        <mapper resource="com/util/Mapper/UserMapper.xml"></mapper>
    </mappers>

</configuration>

跟jdbc的properties的配置非常像,driver包,url路径,username和pwd。并且在这要注意下面的<mappers>一定要存在,每一个mapper.xml文件必须注册在核心配置文件中,不然就会报错,具体错误如下  Exception in thread "main" org.apache.ibatis.binding.BindingException: Type interface com.util.Mapper.UserMapper is not known to the MapperRegistry.

从 SqlSessionFactory 中获取 SqlSession

既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。如

try (SqlSession session = sqlSessionFactory.openSession()) {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}

但这是古老的方式现在大多不这么使用。

现在的都是获取到一个mapper(官网提倡使用这种方法)

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
}

对于mapper和sqlsession到底做了什么,我来白话一下。

简单来说sqlsession就是要执行在数据库的所有方法,但是这里引进了xml定义语句。1个语句既可以通过 XML 定义,也可以通过注解定义。我们先看看 XML 定义语句的方式,事实上 MyBatis 提供的所有特性都可以利用基于 XML 的映射语言来实现。

经过简单的实现完成一个mapper的配置。

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--绑定一个mapper接口-->
<mapper namespace="com.util.Mapper.UserMapper">
    <select id="selectAll" resultType="com.util.doclass.teacher">
        select * from teacher
    </select>
</mapper>

namespace 对应着一个mapper接口,也就是我们想要对数据库进行操作的行为

通过这个命名空间的映射就绑定住了一个接口文件,这个xml文件就类似于一个实现类、用全限名来调用映射语句就好像用全限定名调用一个java对象,这样,该命名就可以直接映射到在命名空间中同名的映射器类,并将已映射的 select 语句匹配到对应名称、参数和返回类型的方法。

与其绑定的Mapper类(接口)

package com.util.Mapper;

import com.util.doclass.teacher;

import java.util.List;

/**
 * @Author:XK
 * @Date: Created in 23:08 2021/10/30
 * @Description:
 **/
public interface UserMapper {
    List<teacher> selectAll();

}

然后进行一下测试

package com.util;

import com.util.Mapper.UserMapper;
import com.util.doclass.teacher;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

/**
 * @Author:XK
 * @Date: Created in 23:27 2021/10/30
 * @Description:
 **/
public class UserMapperTest {

    @Test
    public static void main(String[] args) {
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<teacher> teachers = mapper.selectAll();
        for (teacher t1:teachers
             ) {
            System.out.println(t1);
        }


    }
}

获得成功!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第一个Mybatis程序 的相关文章

随机推荐

  • Linux磁盘挂载

    概念 挂载 所谓挂载就是利用一个目录当成进入点 将磁盘分区的数据放在该目录下 也就是说 进入该目录就可以读取该分区的意思 Linux系统最重要的是根目录 因此根目录一定需要挂载到某个分区 至于其他的目录则根据需要挂载到不同的分区 假设硬盘分
  • 推荐一款我最近爱上的网页版文库(编辑器)——语雀yuque.com

    推荐一款由于工作接触然后热爱上的文库 语雀 语雀 https www yuque com 一开始它是阿里内部的文档库 后来随着它的功能升级 升级 升级 我恨不得把自己以前散落在各地的笔记 各种文件都搬上去 甚至最近已经弃用axureRP和s
  • 微信二次分享链接,出现config:invalid signature错误的解决方法

    当开发微信时需要做特定的页面做分享时 根据官方提供的jssdk php文件创建的签名数据包调试时 大家碰到的最多的错误而且解决最麻烦的大概就是signature错误了 分享时提示错误 errMsg config invalid signat
  • 单链表的各种操作,对于初学者来说,更容易理解

    include
  • Oracle11g 数据库提示ORA-28002: the password will expire within

    Oracle11g 数据库提示ORA 28002 the password will expire within 7 days 是说密码过期 oracle11g中默认在default概要文件中设置了 PASSWORD LIFE TIME 1
  • 批量修改mathtype中的公式字体、大小

    目录 一 保存格式文件 二 批量修改 一 保存格式文件 随便双击打开一个公式 点击菜单栏大小 定义 然后根据自己的需求修改参数 修改完成后点击确定 点击菜单栏预设 公式预设 保存到文件 选择一个保存的位置并命名 二 批量修改 下面就对全文公
  • 怎么导入别人的项目运行部署搭建Java项目springboot代码eclipse idea的心得实操

    调过无数代码 就发现没有运行不了的代码 这些代码也是我实践经验的来源 从最开始的servlet 到现在的springcloud 每一种类型的项目都有其特定的导入部署方式 如果是idea或者eclipse 按如下操作 按项目类型分两种情况部署
  • 内网穿透的应用-如何搭建WordPress博客网站,并且发布至公网上?

    文章目录 如何搭建WordPress博客网站 并且发布至公网上 概述 前置准备 1 安装数据库管理工具 1 1 安装图形图数据库管理工具 SQL Front 2 创建一个新数据库 2 1 创建数据库 2 2 为数据库创建一个用户 3 安装P
  • 如何优雅的使用fbx sdk

    include 头文件 设置lib目录 添加libfbxsdk lib 复制粘贴dll文件 运行平台一定要 大写加粗 一定要 设置为x64 添加宏FBXSDK SHARED 否则会出各种莫名其妙的问题
  • 【java基础】HashMap源码解析

    文章目录 基础说明 构造器 put方法 无扩容 无冲突 put方法 无冲突 有扩容 put方法 有冲突 无树化 put方法 有冲突 树化 remove方法 树退化 常见方法 总结 基础说明 HashMap 是一个散列表 它存储的内容是键值对
  • Go语言学习15-基本流程控制

    基本流程控制 流程控制对比 Go 和 C 基本流程控制 1 代码块和作用域 2 if 语句 3 switch语句 3 1 表达式switch语句 3 2 类型switch语句 4 for 语句 4 1 for 子句 4 2 range 子句
  • 什么是三极管的倒置状态及其作用!

    1 什么是三极管的倒置状态 集电结正偏 发射结反偏 为倒置状态 集电结正偏 发射结正偏 为饱和状态 集电结反偏 发射结反偏 为倒截止态 集电结反偏 发射结正偏 为放大状态 2 对三极管倒置状态的分析 实际上 当NPN型三极管的三个电极电位关
  • BUUCTF-Reverse:SimpleRev(算法分析题)

    题目地址 https buuoj cn challenges SimpleRev 查壳 得知消息 ELF 64 直接拖进ida64分析 int cdecl noreturn main int argc const char argv con
  • h5和APP实现交互(安卓-ios)

    h5调用APP 的方法 taskCallback是和APP端协议的函数名 安卓 window PlatformCurrency taskCallback 测试数据 ios window webkit messageHandlers task
  • 使用ffmpeg合并多个视频文件

    由于腾讯视频将一个视频分割成多个20M左右的小文件 所以必须合并起来成为一个完整视频文件 用什么工具来合并这些文件呢 想到了已经安装好的ffmpeg 开源免费 又是现成的 两种方法 方法1 直接写文件名 使用 来分割 ffmpeg i co
  • Java基础系列:NIO编程

    俗世游子 专注技术研究的程序猿 说在前面的话 聊完了Socket编程 我们来聊一聊关于NIO方面的话题 当然在这里只会介绍用的比较广泛的类 方法 其他用的不多的 就不多介绍了 用到的时候查API就好了 本节我们聊个大概内容 明白该如何使用
  • 解决qt里面添加的信号与槽不起作用的办法

    今天 在qt界面上新加了个checkbox 再加上信号与槽 发现竟然没响应 以前遇到过这个问题 没记录下来 其实很简单 把断点放在起作用的slot里面 发现它的前一步是类名 qt static metacall 而这个断点在Moc 类名 c
  • es6 嵌套数组循环_[js]从 ES3 到 ES6 教你如何数组去重

    声明 以下方法仅对数组值全部属于 primitive data type 的情况有效 ES6 方法一 Set数据结构 Array from静态方法 ES6中新增了Set数据结构 类似于数组 但是它的成员都是唯一的 其构造函数可以接受一个数组
  • Dubbo Spring Cloud

    1 概述 官方文档 https github com apache dubbo spring boot project blob master README CN md dubbo官方网站 http dubbo apache org Dub
  • 第一个Mybatis程序

    MyBatis 是一款优秀的持久层框架 它支持自定义 SQL 存储过程以及高级映射 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作 MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型 接口和