在 SpringBoot 中 初步使用 MyBatis

news2025/1/16 21:05:29

        这篇文章简单介绍如何初步使用MyBatis框架。MyBatis官网:mybatis – MyBatis 3 | 简介。本文中介绍MyBatis使用在SpringBoot中,Spring帮我们进行了管理,省去了获取sql的步骤。

什么是 MyBatis?

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

        接下来,就开始使用MyBatis。

使用MyBatis

创建数据库和表

先创建一个数据库和表。表的创建可以创建一个学生表,包含id,姓名,年龄,性别,班级。

drop table if exists student;
create table student
(
    id   int primary key auto_increment,
    name varchar(100) not null,
    age  int,
    sex  int, # 1表示男,0表示女;
    class int
) default charset 'utf8mb4';

desc student;

添加框架支持

如果是SpringBoot项目,可以使用插件来快速添加框架。

在pom.xml文件中,点击该页面中的任意内容,然后 Alt + insert,就可以看到该插件。

使用该插件。 

配置文件

        如果是SpringBoot,在resources目录下创建application.yml文件,这个文件中存放mybaits的相关配置信息。

        下面的配置中使用了一些别的日志框架,为了可以正常使用,你可以添加成一样的框架,虽然有的框架不起作用,比如SpringWeb,是用来web开发的,本文章用不到。

# 配置数据库的连接字符串
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/你的数据库?characterEncoding=utf8
    username: 你的数据库用户名
    password: 你的数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver
    
# 设置 Mybatis 的 xml 保存路径
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #需要lombok框架支持,可以添加
    
# 配置打印 MyBatis 执行的 SQL
logging:
  level:
    com:
      example:
        demo: debug

添加实体类

创建了一个student的表,要在java代码中创建相对应的实体类。

@Data // 需要lombok支持
public class studentInfo {

    private int id;
    private String name;
    private int age;
    private int sex;
}

        @Data注解是lombok提供的快速开发的注解,添加该注解,相当于自动添加了setter和getter方法,添加了toString方法,添加了equal和hashcode方法,添加了无参构造方法和相关参数的构造方法。

        实体类中的字段名需要和数据库中的字段名保持一致,不然就会出现没有映射的情况。

xml保存路径

        我们在配置文件中注释了xml的保存路径。要在相关的resources目录下添加mapper目录。

        在java目录中创建调用方法的接口,比如写成StudentMaper.java,然后在resources的mapper目录下创建StudentMaper.xml。

        需要注意的是上面图片中红框标识出来的部分,最好不要改,不然会找不到文件。MyBatis 的 XML 中保存是查询数据库的具体操作 SQL,通过*Mapper.xml,就可以在找到在 resources/mapper 创建所有表的 xml ⽂件。

        刚刚的操作我们创建了一个StudentMapper接口和StudentMapper.xml的xml文件。需要在接口中添加@Maper注解,在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="你的mapper接口位置">
    
</mapper>

 <mapper>标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接⼝的全限定名,包括全包名.类名。

Mybatis跳转的插件

        你可能看到了我的代码中出现了一个 图标,这是安装了插件。该插件可以进行接口和xml文件的跳转。代码中,如果你的namespace是正确的路径,那么就会出现该图片,点击就可以跳转到相关的接口上,可以使用它来判断代码是否无误。

相关sql语句

insert

在学生表中插入学生信息,需要先在接口中定义该方法,然后在xml中编写sql语句。

@Mapper
public interface StudentMapper {

    //插入
    Integer add(@Param("studentInfo") StudentInfo studentInfo);

}

        @Param注解:如果你的映射方法接受多个参数,就可以使用这个注解自定义每个参数的名
字。简单来说,使用该注解,就相当于重新将参数名进行了定义。

后序的使用,只能使用重新定义的参数名,否则就会报找不到相关参数的异常。 

        如果你安装了插件,就会发现方法上报红。这也不是问题,可以alt+回车快速生成相关sql语句,或者在xml中自己手动添加。 

insert标签:是⽤来执行数据库的查询操作的;

id:是和 Interface(接⼝)中定义的方法名称⼀样的,表示对接⼝的具体实现方法。

    <insert id="add">
        insert into student(name, age, sex)
        values (#{studentInfo.name},
                #{studentInfo.age},
                #{studentInfo.sex})
    </insert>

 #{}这里先不介绍。

写完了相关的sql语句,判断是否成功,需要进行单元测试。在接口中alt+insert,就可以看到test,点击test,跳出相关界面,勾选需要测试的add方法即可。

        进入相关代码后第一件事就是添加@SpringBootTest注解,表示确定如何装载Spring应用程序的上下文资源,否则会报空指针异常,原因是没有装载Spring上下文资源。

        引入studentMapper和studentInfo,就可以进行测试了。

@SpringBootTest
class StudentMapperTest {

    @Autowired
    private StudentMapper studentMapper;
    StudentInfo studentInfo = new StudentInfo();

    @Test
    void add() {
        studentInfo.setName("1");
        studentInfo.setAge(1);
        studentInfo.setSex(1);
        Integer result = studentMapper.add(studentInfo);
        System.out.println(result);
    }
}

        说明成功。 如果你按照配置中的进行了配置,就可以看到sql语句的打印。否则是没有sql语句的打印的。

        现在,将add中的@Param改动一下。

发现报错了。如果在insert中改成studnet:

在这里是需要格外注意的。

insert返回自增主键

默认情况下,返回的是受影响的行数。要返回自增主键,需要格外的属性。

  • useGeneratedKeys:这会令 MyBatis 使⽤ JDBC 的 getGeneratedKeys 方法法来取出由数据 库内部⽣成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统自动递增字段),默认值:false。
  • keyColumn:设置⽣成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第⼀列的时候,是必须设置的。如果生成列不止一个,可以⽤逗号分隔多个属性名称。
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis 会使⽤ getGeneratedKeys 的返回值或 insert 语句的 selectKey ⼦元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。

要注意的是,自增主键使用需要传入对象。

    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into student(name, age, sex)
        values (#{student.name},
                #{student.age},
                #{student.sex})
    </insert>
@SpringBootTest
class StudentMapperTest {

    @Autowired
    private StudentMapper studentMapper;
    StudentInfo studentInfo = new StudentInfo();

    @Test
    void add() {
        studentInfo.setName("1");
        studentInfo.setAge(1);
        studentInfo.setSex(1);
        studentMapper.add(studentInfo);

        //通过该方法获取
        System.out.println(studentInfo.getId());
    }
}

数据库情况。这里插入了两次1,1,1。代码中又插入了一次1,1,1。预期结果是返回第三次的自增主键3。 

#{} 与 ${}

#{}:预编译处理。MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?,后序MyBatis使用 PreparedStatement 的 set 方法来赋值。

${}:字符直接替换。MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

update

    <update id="update">
        update student
        set name = #{name}
        where id = #{id}
    </update>
    @Test
    void update() {
        //将id为1的name改为2
        Integer result = studentMapper.update("2", 1);
        System.out.println(result);
    }

alt+insert的时候进入test界面,勾选相关的方法后生成。如果遇到error,直接点击ok即可。

delete

    <delete id="delete">
        delete
        from userinfo
        where id = #{id}
    </delete>
    @Test
    void delete() {
        //删除id为1的记录
        System.out.println(studentMapper.delete(1));
    }

 select

    <select id="select" resultType="com.example.java011001.model.StudentInfo">
        select *
        from student;
    </select>

select标签中有一个resultType属性,表示返回的数据类型,也就是开头我们定义的实体类StudentInfo。

接口中的语句:

    List<StudentInfo> select();

xml中的语句:

    <select id="select" resultType="com.example.java011001.model.StudentInfo">
        select *
        from student;
    </select>

Test中的语句:

    @Test
    void select() {
        System.out.println(studentMapper.select());
    }

resultType 和 resultMap

        resultType表示返回的数据类型。

        有的时候,我们会遇到java实体类和数据表中的字段不一致的情况。这个时候需要resultMap标签。

    <resultMap id="resultMap" type="com.example.java011001.model.StudentInfo">
        <id column="id" property="id"></id>
        <result column="name" property="nameStudent"></result>
        <result column="age" property="ageStudent"></result>
        <result column="sex" property="sexStudent"></result>
    </resultMap>

    <select id="select" resultMap="resultMap">
        select *
        from student;
    </select>

        resultMap标签中:id:该resultMap的标识名。type:要映射的实体类。id标签表示是该数据库的主键,column属性表示数据库中的字段名,而property表示程序中的属性名。result标签表示普通的字段和属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XAML控件宽度为另一控件的一半、静态属性绑定、ObjectDataProvider

控件上当某些数据需要根据其他数据的变化而变化 很多时候&#xff0c;想让某个控件的宽度或者高度是另一个已有控件的一半&#xff0c;一开始打算使用ObjectDataProvider来实现&#xff0c;因为在控件上当某些数据需要根据其他数据的变化而变化时&#xff0c;可以使用ObjectDa…

Selenium实战【滑动验证码破解】【JAVA爬虫】

简介本文主要讲解&#xff0c;利用之前所学到的java selenium如何实战操作,浏览器控制鼠标&#xff0c;模拟人工操作滑动验证码。这里需要用javacv 的代码知识&#xff0c;用于计算图像中滑块需要移动的距离。实战目标网站&#xff1a;https://dun.163.com/trial/jigsaw操作流程…

【Java入门】Java注释和关键字

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java入门 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一…

mycat个人详谈

项目背景 现在业务想实现不同的用户分别看到不同的数据库&#xff0c;领导说用mycat中间件试试。没有接触过这个东西&#xff0c;刚拿到手直接头皮发麻&#xff0c;现在搞定了&#xff0c;索性就记录一下 Mycat数据库分库分表中间件 简介 阿里大牛开发的开源免费产品&#x…

设计模式——抽象工厂模式

文章目录1. 抽象工厂模式的定义2. 抽象工厂模式的类图3. 抽象工厂模式的作用4. 抽象工厂模式的实现1. 抽象工厂模式的定义 提供一个接口&#xff0c;用于创建相关或依赖对象的家族&#xff0c;而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品&a…

OAuth 2.0简介

OAuth就是一种授权机制。数据的所有者告诉系统&#xff0c;同意授权第三方应用进入系统&#xff0c;获取这些数据。系统从而产生一个短期的、一定权限的令牌&#xff08;token&#xff09;&#xff0c;用来代替密码&#xff0c;供第三方应用使用。 流程 1.第三方客户端要求用…

【欧姆龙控制器NX1系列调研】

欧姆龙控制器NX1系列调研NX系列 NX1 CPU单元NX系列-EtherNet/IP耦合器单元NX系列-系统单元NX系列通信接口单元NX系列数字输入单元NX系列模拟量输入单元NX系列模拟量输出入单元NX系列 高速模拟量模块NX系列IO-Link 主站单元温度控制/温度输入单元位置接口单元NX系列 安全控制单元…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing算法学习笔记 &#x1f4ac;总结&#xff1a;希望你看完…

CSS入门四、浮动

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

mybatis参数配置和日志详解

生命周期和作用域是至关重要的&#xff0c;因为错误的使用会导致非常严重的并发问题 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的&#xff0c;SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得&#xff0c;而 SqlSessionFactoryBuild…

【stl容器--实践操作】

目录&#xff1a;前言一、string&#xff08;一&#xff09;初始化 、 赋值 、 拼接&#xff08;二&#xff09;单个字符的访问和修改[]、at()&#xff08;三&#xff09;插入和删除insert 、erase&#xff08;四&#xff09;查找和替换find、rfind、replace&#xff08;五&…

代码随想录-47-101. 对称二叉树

目录前言题目1.递归思路2. 本题思路分析&#xff1a;3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题目…

FileNotFoundError: [Errno 2] No such file or directory VSCode Python插件的工作路径

文章目录1 前言2 Python主进程工作路径3 解决参考1 前言 在VSCode中&#xff0c;你是否遇到这样的情况 Traceback (most recent call last):File "......*.py", line 1, in <module>with open(filepath, r) as f: FileNotFoundError: [Errno 2] No such file…

提面优秀成功上岸浙大MBA的一点经验——专业管理思维很重要

本人的学历背景比较一般&#xff0c;就是个普通一本&#xff0c;但大学时为了挣学分&#xff0c;参加了不少的活动&#xff0c;还考了教师资格证&#xff0c;并且还去山区支教过3个月&#xff0c;支教一开始也是为了学分&#xff0c;但是通过与孩子们的相处&#xff0c;其实自己…

http相关(更新中)

概念 HTTP&#xff08;hypertext transport protocol&#xff09;协议也叫超文本传输协议&#xff0c;这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。HTTPS更安全&#xff1b;无状态&#xff0c;cookie解决了无状态的问题 请求过程 客户端发送给服务器的称为“…

深度聚类方法之跨实例引导的对比聚类(Cross-instance guided Contrastive Clustering,C3)

深度聚类方法之跨实例引导的对比聚类(Cross-instance guided Contrastive Clustering,C3) 1.参考文献 《C3: Cross-instance guided Contrastive Clustering》2.跨实例引导的对比聚类(Cross-instance guided Contrastive Clustering,C3) 该方法是在对比聚类(Contrastive Clus…

Linux系统编程——信号

1.信号 信号共性: 简单、不能携带大量信息、满足条件才发送。信号的特质: 信号是软件层面上的“中断”。一旦信号产生&#xff0c;无论程序执行到什么位置&#xff0c;必须立即停止运行&#xff0c;处理信号&#xff0c;处理结束&#xff0c;再继续执行后续指令。所有信号的产…

如何使用Element-UI?

文章目录Element-UI概述Element-UI快速入门Element 布局Layout 局部Container 布局容器Element-UI组件使用案例介绍准备基本页面完成表格展示拷贝修改完成搜索表单展示完成批量删除和新增按钮展示完成对话框展示完成分页条展示完整页面代码Element-UI概述 Element&#xff1a;…

day11|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历

144.二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xf…

隔离放大器工作原理及其应用

介绍 隔离放大器或单位增益放大器提供从电路的一部分到另一部分的隔离。因此&#xff0c;不能在电路中消耗、使用和浪费功率。该放大器的主要功能是增加信号。运算放大器的相同输入信号作为输出信号从运算放大器精确地传出。这些放大器用于提供电气安全屏障和隔离。这些放大器…