Spring-Boot添加MyBatis:手动添加代码方式

2023-11-04

创建了一个MySQL数据库,并添加了一张表:

添加MyBatis后,有两种使用方式:

  • 注解方式。简单快速,适合规模较小的数据库。
  • xml配置方式。支持动态生成SQL,调整SQL更方便,适合大型数据库。

无论哪种方式,都需要共同执行的前期工作:

  1. pom.xml中添加依赖库。
     
    <!-- 添加mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    
    <!-- 添加mysql驱动 -->
    <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
    </dependency>

     

  2. application.properites中添加配置项来配置数据库。
    spring.datasource.driverClassName = com.mysql.jdbc.Driver
    spring.datasource.url = jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username = root
    spring.datasource.password = 123456

    这些配置项的key都是固定的,只需要修改后面的值。

  3. 创建表对应的实体类Student
    import java.io.Serializable;
    
    public class Student implements Serializable {
        private String id = "";
        private String name = "";
        private Integer age = 0;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
  • 注解方式

  1. 在src/main/java/com/template/dao文件夹下创建操作表用的mapper.java,其中引用了实体类Student。
    import com.template.model.Student;
    import org.apache.ibatis.annotations.*;
    
    public interface StudentMapper {
        @Select("select * from student where id = ${id}")
        @Results({
                @Result(property = "id",  column = "id"),
                @Result(property = "name", column = "name"),
                @Result(property = "age", column = "age")
        })
        Student get(@Param("id") String id);
    }
    该mapper文件是一个interface,每个接口都需要使用@Select /@Insert/@Update/@Delete等注解来添加SQL语句。对于需要返回值的,还要使用@Results来定义返回的数据。
    特别注意,要在程序入口文件application类前添加注解:

    @MapperScan("com.template.dao")

    这样spring才会将该文件夹下的所有文件扫描为mapper文件,spring才会识别它们。

    当然也可以在每个mapper文件上方添加@Mapper注解,只是这样就意味着每个mapper文件都要添加一次,比较麻烦。

  2. 在需要的地方通过@Autowired引入mapper文件,调用接口来操作数据表。

    引入:

    @Autowired
    private StudentMapper studentMapper;

    调用:

    Student student = studentMapper.get("201802");
    String name = student.getName();
    Integer age = student.getAge();

     

  • xml配置方式

  1. 在src/main/java/resources/下添加一个mybatis文件夹,在其下添加一个mybatis-config.xml文件,然后添加一个mapper文件夹,并在mapper文件夹下添加一个studentMapper.xml文件。添加完成后,结构如下:

    然后修改application.properties,添加:

    mybatis.config-location = classpath:mybatis/mybatis-config.xml
    mybatis.mapper-locations = classpath:mybatis/mapper/*.xml
    

    这两个配置项指定了刚才添加的mybatis-config.xml配置文件以及mapper文件夹下所有的映射xml文件。

  2. 打开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>
        <typeAliases>
            <typeAlias alias="Integer" type="java.lang.Integer" />
            <typeAlias alias="Long" type="java.lang.Long" />
            <typeAlias alias="HashMap" type="java.util.HashMap" />
            <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
            <typeAlias alias="ArrayList" type="java.util.ArrayList" />
            <typeAlias alias="LinkedList" type="java.util.LinkedList" />
        </typeAliases>
    </configuration>
    

    这样就为常用的数据类型定义了别名。

  3. 打开mapper/studentMapper.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" >
    <mapper namespace="com.template.dao.StudentMapper">
        <resultMap id="BaseResultMap" type="com.template.model.Student">
            <result column="id" property="id" jdbcType="VARCHAR"/>
            <result column="name" property="name" jdbcType="VARCHAR"/>
            <result column="age" property="age" jdbcType="INTEGER"/>
        </resultMap>
    
        <sql id="Base_Column_List">
            id, name, age
        </sql>
    
        <select id="get" parameterType="java.lang.String" resultMap="BaseResultMap">
            SELECT
            <include refid="Base_Column_List"/>
            FROM student
            WHERE id = #{id}
        </select>
    </mapper>
    

    注意:

    ①namespace属性必须与即将创建的mapper.java文件路径相同。
    jdbcType务必确保正确,否则编译错误。
  4. 在src/main/java/com/template/dao文件夹下创建操作表用的mapper.java,其中引用了实体类Student。
    import com.template.model.Student;
    
    public interface StudentMapper {
        Student get(String id);
    }
    

    可以看到相比于注解的方式,该方式的mapper文件由于将SQL语句,参数,返回值等移到了上面3中的xml里,因此更加简洁。

    同1,需要在程序入口文件application类前添加注解:

    @MapperScan("com.template.dao")

  5. 在需要的地方通过@Autowired引入mapper文件,调用接口来操作数据表。
    引入:
    @Autowired
    private StudentMapper studentMapper;
    

    调用:

    Student student = studentMapper.get("201802");
    String name = student.getName();
    Integer age = student.getAge();
    

     

可见两种方式的区别仅仅在于mapper的实现。最终的使用方式是相同的。

 

其他:

  • xml文件路径问题

在properties配置文件中,使用classpath来指定基础路径,也就是target/classes文件夹。就像上面引入mybiatis-config.xml时:

mybatis.config-location = classpath:mybatis/mybatis-config.xml

该路径等同于:

target/classes/mybatis/mybatis-config.xml

spring-boot编译后会将各种编译和资源文件放到classes文件夹下,程序实际运行需要从classes文件下引用自己所需要的各种资源,例如xml文件。spring-boot的classpath就是classes文件夹。

而针对于mapper,使用上面的配置,则java类放在:

src/main/java/com/template/dao

文件夹下,而配套的xml文件放在:

src/main/resources/mybatis/mapper

文件夹下。

要添加一个数据库操作,就必须同时修改这两个文件,而这两个文件的目录相隔有点远,来回切换并不是特别方便。因此希望可以将这两个文件的目录放在一起,就像这样:

然而,这样放置,就是将xml文件放在了src/main/java路径下。存在的一个问题就是只有java-resource类型文件夹才会将自身的子文件复制到classes下。工程默认的java-resource类型文件夹只有一个,那就是src/main/resources。因此这样放置xml,是不会被复制到classes文件夹下的。

解决的方法是将该文件夹设置为Resources类型文件夹。

可以使用修改iml文件的方式,也可以使用 Resource Plugin:

在pom.xml中,<build>节点下添加一个新的resource路径:

<build>
   <resources>
      <resource>
         <directory>src/main/java/com/template/mapper</directory>
         <targetPath>mapper</targetPath>
      </resource>
      <resource>
         <directory>src/main/resources</directory>
      </resource>
   </resources>
</build>

这样,src/main/java/com/template/mapper这个目录下的所有资源就会被复制到classes/mapper文件夹下,mapper路径是<targetPath>设置的。然后修改application.properties文件中mybatis.mapper-locations设置:

mybatis.mapper-locations = classpath: mapper/*.xml

即告诉工程说,去classes/mapper文件夹下取所有的xml文件。

重新编译,即可。

  • 调用时提示Could not autowire问题

在调用时:

@Autowired
private StudentMapper studentMapper;

结果提示错误:

Could not autowire. No beans of 'StudentMapper' type found. more... (Ctrl+F1)

然而却可以正常运行。

有两种解决方案:

  1. 降低提示等级,从而看到的是低等级提示,不再是错误警告。
  2. 为IDEA安装MyBatis plugin。

MyBatis plugin收费,推荐使用1。

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

Spring-Boot添加MyBatis:手动添加代码方式 的相关文章

随机推荐

  • Python将图片转换为灰度图

    很多时候我们需要用到灰度图像 比如说在深度学习的训练中 有时候我们并不需要图片的颜色信息 然而我们日常环境下获得的通常都是彩色图像 所以需要将彩色图像转换成灰度图像 也就是从3个通道 RGB 转换成一个通道 from PIL import
  • 学会项目成本管理计算,PMP计算题就是送分题

    学会项目成本管理计算 PMP计算题就是送分题 PMP中的计算主要在 lt 项目成本管理 gt 的控制成本部分 服务于挣值管理 EVM Earned Value Management 挣值分析 EVA Earned Value Analysi
  • Android OpenGLES绘制yuv420纹理

    Android OpenGLES绘制yuv420纹理 曾大稳丶 关注 2018 07 16 11 31 字数 76 阅读 440评论 0喜欢 3 把shader代码写入raw里面 vertex shader glsl attribute v
  • keil编译错误:ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED

    出现这个错误 很多网上都说是没注册成功导致的 注册成功的话会在keil的菜单栏 help gt about 里看到如下的显示 我的keil里about显示注册成功了 但还是出现错误提示 ERROR L250 CODE SIZE LIMIT
  • AI 时代来临,这些 AI 工具让你的工作更加高效!

    在这篇文章中 我们将介绍一些有趣的人工智能应用 这些应用涵盖了不同的领域 包括图像生成 文本处理 决策辅助等 以下是这些应用的具体介绍和文本链接 AI 生成图标工具 iconifyai是一个AI生成App图标的产品 价格每15个图标约10美
  • codeforces 1186d D. Vus the Cossack and Numbers

    题意 和为0的n个double数 上下取整后和还为0的构造一个 首先都下取整 结果肯定 lt 0 和加起来再取绝对值num 则有num个数要上取整 那么小数部分为0的不变 不为0的挑num个上取整 其他的下取整 另外floor ceil r
  • JMM内存模型、JMM内存间交互操作

    主内存与工作内存 JMM内存间交互操作 关于主内存与工作内存之间具体的交互协议 即一个变量如何从主内存拷贝到工作内存 如何从工作内存同步回主内存这一类的实现细节 Java内存模型中定义了以下8种操作来完成 Java虚拟机实现时必须保证下面提
  • 配置接口IP地址并通过静态路由、默认路由配置实现全网互通!

    配置接口IP地址并通过静态路由 默认路由配置实现全网互通1 对Router R1 R3进行默认路由配置 R2为静态路由配置 2 配置好PC机的IP地址 子网
  • Can‘t use an undefined value as an ARRAY reference at probe2symbol

    Can t use an undefined value as an ARRAY reference at probe2symbol 有时间限制 过了时间就不行 把所有诸如if samp1e 5 gt 118 next 删掉 就可以了 这句
  • golang返回值为interface{}的类型判断

    大家知道 golang对于不确定返回值可以用interface 代替 这确实很方便 但是也带来了问题 那就是如何判断返回值是什么类型的 其实可以用反射也就是reflect来判断 通过函数 reflect TypeOf 1 即返回类型 本文参
  • Qt学习之二——QPushButton按钮用法

    目录 1 QPushButton按钮简介 2 三个构造函数 3 QPushButton常用属性 4 QPushButton常用方法 5 QPushButton按钮的信号与槽 1 QPushButton按钮简介 QPushButton是普通按
  • Vlc播放rtsp视频

    Vlc播放rtsp视频 网上的例子不少 我看后觉得有点不足的地方 就是他们没有设置播放rtsp视频时的参数 参数设置对播放网络视频是很重要的 如果设置不当 或不设置 可能你的程序就播放不了rtsp视频了 说下开发步骤吧 挺简单的 我的环境
  • 分布式消息队列RocketMQ&Kafka -- 消息的“顺序消费”-- 一个看似简单的复杂问题

    在说到消息中间件的时候 我们通常都会谈到一个特性 消息的顺序消费问题 这个问题看起来很简单 Producer发送消息1 2 3 Consumer按1 2 3 顺序消费 但实际情况却是 无论RocketMQ 还是Kafka 缺省都不保证消息的
  • 初学者怎样看懂代码_糖说:不懂代码的我们如何看代码?

    大家新年好啊 先给各位老板们拜个年 这两天写的大家不是很爱看 可能大家还是喜欢看一些故事性的东西 那么在以后的韭爷说里一定会加大对于故事板块儿的输出的 现在我们还是继续今天的内容吧 有始有终 不懂代码的我们如何看代码 这是一个问题 因为笔者
  • 【Android取证篇】华为设备无法识别解决方案

    Android取证篇 华为设备无法识别解决方案 以鸿蒙系统的开发者模式设置展示 和安卓的设置情况一样 suy 文章目录 Android取证篇 华为设备无法识别解决方案 华为设备无法识别 一 正常打开方式 1 开发者模式 2 USB配置 仅充
  • 最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4.0/AI绘画/H5端/Prompt知识库/

    一 前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统 本期针对源码系统整体测试下来非常完美 可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统 那么如何搭建部署AI创作ChatGPT
  • 2017-06-12 每日一记 Linux的root密码修改

    在ubuntu中 1 1 切换root用户 sudo su 然后输入sudo密码 su root 然后输入root密码 1 2 切换其他用户 su 用户名 修改root用户密码 需要记得sudo密码 首先sudo su 输入普通用户密码 进
  • 页面加载与iframe加载函数

  • 运算放大器基础知识

    文章目录 前言 一 运放内部电路原理 二 运放的参数和特性 1 输入输出特性曲线 2 主要参数 三 运放常用应用 1 加法器 2 减法器 3 读书电路和指数电路 4 乘法器和除法器 5 乘方和开平方根电路 6 积分电路 7 微分电路 8 P
  • Spring-Boot添加MyBatis:手动添加代码方式

    创建了一个MySQL数据库 并添加了一张表 添加MyBatis后 有两种使用方式 注解方式 简单快速 适合规模较小的数据库 xml配置方式 支持动态生成SQL 调整SQL更方便 适合大型数据库 无论哪种方式 都需要共同执行的前期工作 在po