Mybatis项目创建 + 规范

文章目录

  • 一、相关概念Mybatis
    • 1.1 什么是Mybatis
    • 1.1 如何实现简化JDBC
  • 二、如何创建 Mybatis 项目
    • 2.1 创建SpringBoot项目 + 加载依赖
    • 2.2 准备数据库 以及 对象的映射
    • 2.3 配置数据库连接池
    • 2.4 使用Mybatis操作数据库
    • 2.5 单元测试
  • 三、其他
    • 3.1 数据库与Java对象的映射规则 ---- 结果映射
      • 【1】概念介绍
      • 【2】注解写法的处理方式
      • 【3】xml写法的处理方式
    • 3.2 传参规则
    • 3.3 参数重命名规则
    • 3.2 开发规范介绍
    • 3.3 打印 Mybatis 执行的SQL

一、相关概念Mybatis

1.1 什么是Mybatis

  1. 是持久层框架:是一个用来操作数据库的持久层框架,基于JDBC开发的,可以简化JDBC的开发(将JDBC共性的东西放在框架里,程序员只要基于框架写个性的内容即可)
  2. 使用场景:我们一般会使用Mybatis操作关系型数据库
  3. 关于官网:Mybatis官网
  4. 两个依赖的区分
    在这里插入图片描述

1.1 如何实现简化JDBC

  1. 创建数据库连接池DataSource:在Spring Boot的配置文件中配置一下数据库的信息即可
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
  1. 通过DataSource获取数据库连接Connection:底层有一个默认的数据库连接池,可以直接从这里面拿连接
  2. 编写SQL语句:分为注解和xml两种写法
@Select("select * from userinfo")    //查询操作的注解写法
  1. 通过Connection即SQL创建命令对象 Statement
  2. 替换占位符
  3. 使用Statement执行SQL语句
  4. 根据查询/增删改执行不同的方法
  5. 处理结果
    • JDBC中,执行查询操作我们需要遍历结果集。而Mybatis直接返回一个List即可,Mybatis会根据我们的返回结果自动匹配
@Select("select * from userinfo")
List<UserInfo> selectAll();
  1. 处理异常和释放资源:异常还是要我们自己处理的,但一旦方法执行完了,Mybatis会立马帮我们释放资源

二、如何创建 Mybatis 项目

2.1 创建SpringBoot项目 + 加载依赖

  1. 需要加载的依赖
    在这里插入图片描述

2.2 准备数据库 以及 对象的映射

  1. 准备数据库:进行建库建表操作
    • 关于数据库客户端的使用:小黑框和图形化的数据库都可以使用
      在这里插入图片描述
  2. 对象的映射:数据库对象和Java对象映射
    在这里插入图片描述

2.3 配置数据库连接池

注意要根据自身数据库的情况,进行修改,如密码、数据库名、版本等

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver

2.4 使用Mybatis操作数据库

  1. 创建包和接口:因为我们用的是@Mapper,所以包通常设置为【mapper】,类名则是以【Mapper】结尾,可以方便我们查找
  2. @Mapper:是ibatis提供的注解,ibatis是Mybatis前身。加了@Mapper就不需要再加上五大注解了。
    • 作用:寓意【Mybatis告诉Spring来管理这个对象】,效果和五大注解差不多。此处我们用的是Mybatis框架,故而不用五大注解。
  3. 为什么不是创建一个类:如果是一个类,selectAll方法里就必须要写方法的实现了
  4. @Select:表示一个查询语句,里面的参数是表示SQL语句的字符串。我们使用不同的注解,会调用不同的方法。
    在这里插入图片描述

2.5 单元测试

  1. 方式一:原始版:在src文件下里写一个代码调用接口。下面是在Controller层写,但这其实并不规范,毕竟单元测试的代码并不符合【控制层】的定义。
@RestController
public class UserInfoController {@Autowiredprivate UserInfoMapper userInfoMapper;@PostConstructpublic void init(){List<UserInfo> userInfos = userInfoMapper.selectAll();System.out.println(userInfos.toString());}
}
  1. 方式二:使用IDEA测试类:在Mapper接口下,选择generate —>test,让IDEA帮我们生成测试代码
    在这里插入图片描述

在这里插入图片描述

三、其他

3.1 数据库与Java对象的映射规则 ---- 结果映射

【1】概念介绍

  1. 什么是结果映射:Mybatis会自动根据数据库的字段名和Java对象的属性名进行映射
    • 名称一致:直接赋值
    • 名称不一致
      • 从mysql层面进行结果映射 :xxx as xxx
        不推荐,感觉改变了mysql的命名规范,而且把SQL语句弄得很复杂
      • 从Mybatis层面进行结果映射:告诉Mybatis哪些字段是对应的,让它帮我们映射
      • 配置驼峰自动转换:因为命名规范上,数据库默认用蛇形,Java属性名用小驼峰。故而可以直接写入配置文件,由Mybatis映射时自动转驼峰

【2】注解写法的处理方式

1. 对mysql查询结果重命名

@Select("select id, username, password, age, gender," +"phone, delete_flag as deleteFlag, create_time as createTime," +"update_time as updateTime from userInfo ")
List<UserInfo> selectAll();

在这里插入图片描述
2. 使用@Results、@Result
在这里插入图片描述
3. 配置自动转驼峰
:Mybatis拿到数据结果后,会读取配置,然后根据配置里的内容进行结果映射

mybatis:configuration:map-underscore-to-camel-case: true  #自动驼峰转换

【3】xml写法的处理方式

1. 对mysql查询结果重命名:和注解的一样

<?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.example.sp20240530.mapper.UserInfoXMLMapper"><select id="selectAll" resultType="com.example.sp20240530.model.UserInfo">select id, username, password, age, gender,phone, delete_flag as deleteFlag, create_time as createTime,update_time as updateTime from userInfo</select>
</mapper>
  1. 使用< resultMap>、< result>
    • resultType VS resultMap:前者指【结果的类型】,后者指【结果的映射】,有了resultMap就不需要resultType了

在这里插入图片描述

  1. 配置自动转驼峰:和注解的一样

3.2 传参规则

  1. 只有一个参数:如果只有一个参数,名称是可以不匹配的,Mybatis会直接拿去用。但通常情况下,为了方便去阅读,我们还是会让他们保持一致
@Mapper
public interface UserInfoMapper {@Select("select * from userinfo where id = #{id}")UserInfo selectUser(Integer id123);
}
  1. 有多个参数:要求名称对应上

3.3 参数重命名规则

  1. 参数不为对象:直接使用改名后的参数即可
@Mapper
public interface UserInfoMapper {@Select("select * from userinfo where id = #{userId}")UserInfo selectUser(@Param("userId") Integer id);//结合了映射规则,只有一个参数的情况@Select("select * from userinfo where id = #{userId111}")UserInfo selectUser2(@Param("userId") Integer id);
}
  1. 参数为对象:用【对象.属性名】的写法
    在这里插入图片描述

3.2 开发规范介绍

  1. XXXMapper:使用Mybatis对数据库的操作类,叫做XXXMapper(因为我们多用@Mapper)
  2. 企业建表规范:需要具备4个字段,哪怕项目中用不到,也需要我们有
    • id:身份标识
    • create_time:记录,可以方便后续使用
    • delete_flag:表示一个删除的标志,表示数据有无被删除,可以让我们使用【逻辑删除】而不是【物理删除】
      • 原理:企业开发中,我们一般不轻易删除数据,能用逻辑删除就用逻辑删除。
        (1)逻辑删除指从逻辑上进行数据删除,如把标志改变,后续查找的时候不查找这块。物理删除则是delete操作,真的从硬盘里删除了数据

        (2)一旦物理删除了,后续找回数据十分麻烦,我们也并不确定该数据在未来是否真的再也不用了,故而不推荐物理删除。

    • update_time:保障数据修改时的安全
  3. is_xxx:表达是否概念的字母,必须使用is_xxx的方式命名
  4. 字段名、表名全部小写
  5. 开发时尽量不要使用*:需要查询哪些字段,直接去写即可,如果需要全部的字段就全部写完

3.3 打印 Mybatis 执行的SQL

  1. 作用:帮我们进行调试,看到SQL代码的执行情况(运行的SQL、参数、结果分别是什么)
  2. 打印在开发环境:该日志的打印只建议出现在开发环境中,不要出现在线上环境。
    • 原理:因为当前我们打印这个日志,是为了帮助开发人员进行数据上的调试的。线上环境已经不是调试阶段了
  3. 环境分类:我们在实际的开发工作中,通常分为下面四种环境
    • 开发环境:写代码过程中,进行调试的这个环境
      • 方式:本地开发,或者一些公司提供单独的服务器让员工进行开发调试
      • 数据库使用:使用的是开发环境的数据库
    • 测试环境:测试人员使用的
      • 数据库使用:使用的是测试的数据库、配置,和开发环境没什么关系
    • 预发布环境:和线上环境同等地位,但不对外提供服务,主要用来观测上线的程序是否会出问题
      • 数据库使用:和线上环境一样都用的是【线上数据库】
      • 数据库使用
    • 发布环境(线上环境):域名后面会对应好几个服务器,分为“发布环境”和“预发布环境”,用户访问只能访问到“发布环境”。
mybatis:configuration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

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

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

相关文章

为什么GD32F303代码运行在flash比sram更快?

我们知道一般MCU的flash有等待周期&#xff0c;随主频提升需要插入flash读取的等待周期&#xff0c;以stm32f103为例&#xff0c;主频在72M时需要插入2个等待周期&#xff0c;故而代码效率无法达到最大时钟频率。 所以STM32F103将代码加载到sram运行速度更快。 但使用GD32F30…

复习kafka

Kafka 介绍 Kafka 是一种分布式的&#xff0c;基于发布/订阅的消息系统。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源。Kafka 的设计目标是提供一种高效、可靠的消息传输机制&#xff0c;能够处理大量的实时数据。 Kafka 基本概念 Producer&#xff1a;生产者&#xf…

Spring Boot 官方不再支持 Spring Boot 的 2.x 版本!新idea如何创建java8项目

idea现在只能创建最少jdk17 使用 IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时&#xff0c;没有 Java 8 的选项了&#xff0c;只剩下了 > 17 的版本 是因为 Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了&#xff0c;之后全力维护 3.x&#xff1b;而 …

阿里云计算之运维概念学习笔记(一)

运维管理 运维管理&#xff08;Operation and Maintenance Management, 简称O&M管理&#xff09;是指通过科学的管理方法和技术手段&#xff0c;对IT系统和基础设施进行监控、维护、优化和保障&#xff0c;以确保系统的高可用性、稳定性、安全性和性能。运维管理涵盖了硬件…

ArcGIS属性域和子类型

01 属性域 道路的车道数值是小于10的。在编辑道路的此属性时&#xff0c;为了限制其值在10以内&#xff0c;可以使用属性域。当输入数据超过10时&#xff0c;就会限制输入。 限制输入这个功能是Pro特有的&#xff0c;在ArcMap中输入超出限制的值也是合法的&#xff0c;需要手动…

【NOIP提高组】进制转换

【NOIP提高组】进制转换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 我们可以用这样的方式来表示一个十进制数&#xff1a;将每个阿拉伯数字乘以一个以该数字所处位置的&#xff08;值减1&#xff09;为指数&#xff0c;以 10 为底数的幂…

Mac硬件设备系统环境的升级/更新 macOS

Mac硬件设备上进行系统环境的升级/更新macOS 1.大版本(升级)判断(比如&#xff1a;我买的这台电脑设备最高支持Monterey) 点击进入对应的大版本描述说明页查看相关的兼容性描述&#xff0c;根据描述确定当前的电脑设备最高可采用哪个大版本系统(Sonoma/Ventura/Monterey/Big Su…

构建高效便捷的家政平台系统——打造优质家政服务的关键

随着人们生活节奏的加快和工作压力的增大&#xff0c;家政服务的需求日益增长。为了满足这一需求&#xff0c;家政平台系统应运而生。本文将探讨家政平台系统的整体架构&#xff0c;以实现高效便捷的家政服务&#xff0c;打造优质家政体验。 ### 1. 家政平台系统背景 随着现代…

18岁适合做什么编程:探索编程世界的无限可能

18岁适合做什么编程&#xff1a;探索编程世界的无限可能 在18岁的青春年华&#xff0c;选择学习编程不仅是对未来职业发展的明智投资&#xff0c;更是开启一个充满无限可能的创造世界。然而&#xff0c;面对琳琅满目的编程语言和技术&#xff0c;如何选择适合自己的编程领域成…

C++联合体用法

联合体&#xff08;union&#xff09;在 C 中是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同的数据类型&#xff0c;联合体的大小等于其中最大成员的大小。这里有一些在使用联合体时需要注意的事项&#xff1a; 内存共享&#xff1a; 联合体的所有成员共享同…

ArkTS是前端语言吗

ArkTS是前端语言吗 ArkTS&#xff0c;这个名词在现代软件开发领域里逐渐崭露头角&#xff0c;但对于许多人来说&#xff0c;它仍旧是个神秘而令人困惑的存在。那么&#xff0c;ArkTS究竟是前端语言吗&#xff1f;为了回答这个问题&#xff0c;我们需要从多个方面进行深入剖析。…

对于Spring应用来说 ClassPath指的是哪些地方 ?

这里写自定义目录标题 1. 编译输出目录2. 依赖的JAR文件3. 外部库和第三方库4. 应用服务器或容器提供的类5. 资源文件6. 测试类路径示例Maven项目的类路径Gradle项目的类路径 在Spring中访问类路径资源使用 Value 注解使用 ResourceLoader使用 Resource 接口 总结 在Spring应用…

PKG系统安装包及IPSW固件下载(MacOS 11-14)11.7.10/12.7.1/13.6.

MacOS 14 Sonoma&#xff0c;为提高生产力和创造力带来了全新的功能&#xff0c;有了更多使用小部件和令人惊叹的新屏幕保护程序进行个性化设置的方法&#xff0c;对Safari浏览器和视频会议进行了重大更新&#xff0c;以及优化的游戏体验——Mac体验比以往任何时候都更好。 下载…

MySQL:MySQL索引种类详解

一、前言 MySQL中的索引是帮助数据库系统高效获取数据的数据结构。索引通过保存表中一列或多列的值以及相应的指向表中物理数据的指针来提高检索速度。 二、索引的定义 1. 索引是数据库管理系统中的一个数据结构&#xff0c;用于快速查找和定位数据。 2. 索引通常与表关联&…

C++中的类

一&#xff0c;类的定义 class classname {//类体由成员函数和成员变量组成}; class为定义类的关键字&#xff0c;ClassName为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分 号不能省略。 类的两种定义方式&#xff1a; 声明和定义全部放在类体中…

LeetCode 575.分糖果:min(type, size/2)

【LetMeFly】575.分糖果&#xff1a;min(type, size/2) 力扣题目链接&#xff1a;https://leetcode.cn/problems/distribute-candies/ Alice 有 n 枚糖&#xff0c;其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长&#xff0c;所以前去拜访了一位医生。 …

从集合论到位运算

前言 本文将扫清位运算的迷雾&#xff0c;在集合论与位运算之间建立一座桥梁。 在高中&#xff0c;我们学了集合论&#xff08;set theory&#xff09;的相关知识。例如&#xff0c;包含若干整数的集合 S{0,2,3}。在编程中&#xff0c;通常用哈希表&#xff08;hash table&…

自然资源-农村土地流转知识全解

自然资源-农村土地流转知识全解 随着农村经济的发展和城市化进程的加快&#xff0c;农村土地面临着多方面的压力&#xff0c;如人口增长、城市扩张、环境恶化等。这些压力导致了农村土地利用率低、经济效益差、农民收入水平低、农村社会经济不发达等问题。因此&#xff0c;改变…

C语言PTA练习题(期末考试成绩排名,新生舞会,约瑟夫游戏(序号+姓名+密码),排队点名)

7-1 期末考试成绩排名 期末考试结束了&#xff0c;数学成绩已经出来&#xff0c;数学老师请你帮忙编写一个程序&#xff0c;可以帮助老师对班级所有同学的考试分数按照由高到第低进行排序&#xff0c;并输出按照成绩排序后每个同学的学号、姓名、数学成绩。 输入格式: 第一行…

Vue.js的核心概念:如何理解Vue.js的声明式渲染、组件系统、Vue实例、Vue生命周期等核心概念。

介绍Vue.js Vue.js的由来 Vue.js是由前Google工程师尤雨溪(Evan You)在2014年开发并发布的。尤雨溪在Google任职期间,主要使用AngularJS进行开发工作,但他觉得AngularJS有些部分过于复杂,因此他决定开发一个轻量且更易于理解的库,这就是Vue.js的诞生。 Vue.js的特点 …