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=false
    username: root
    password: root
    driver-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=false
    username: root
    password: root
    driver-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 {
    @Autowired
    private UserInfoMapper userInfoMapper;

    @PostConstruct
    public 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 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】Linux安装MySQL

一、center OS环境准备 为了在Linux系统中查看MySQL5.8与8.0版本的区别 我们要准备两个虚拟机&#xff0c;需要的软件&#xff1a;VMware和CentOS7 因为博主之前在学习redis的时候已经安装过一个虚拟机了&#xff0c;所以我就直接克隆了一个CentOS2.0 修改mac地址&#xff0…

基于C#使用ACCESS数据库时遇到的问题记录

一、32位版本Office与64位AccessDatabaseEngine共存安装方法 1. 使用winrar、7zip等软件将AccessDatabaseEngine_X64.exe解压缩&#xff0c;得到AceRedist.msi和files14.cat2个文件 2. 下载Orca MSI编辑修改工具。安装后&#xff0c;使用Orca打开AceRedist.msi&#xff0c;找到…

在iPhone上恢复已删除的Safari历史记录的最佳方法

您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法&#xff1f;好吧&#xff0c;这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗&#xff1…

爱德蒙得洛希尔:深耕亚洲市场,开启中国投资新篇章!

爱德蒙得洛希尔资产管理&#xff08;法国&#xff09;有限公司&#xff08;以下简称“爱德蒙得洛希尔”&#xff09;是一家具有悠久历史和全球业务网络的金融企业&#xff0c;由洛希尔家族于1953年在法国巴黎创立。作为一家主要从事私人银行和资产管理业务的金融集团&#xff0…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …

【已解决】HtmlWebpackPlugin.getHooks is not a function

安装下面的依赖&#xff0c;获得 html-webpack-plugin 的 beta 版本 npm i html-webpack-pluginnext --save此问题在github上有讨论&#xff1a;https://github.com/facebook/create-react-app/issues/5465

网络报文协议头学习

vxlan&#xff1a;就是通过Vxlan_header头在原始报文前面套了一层UDPIP&#xff08;4/6&#xff09;Eth_hdr 需求背景&#xff1a;VXLAN&#xff1a;简述VXLAN的概念&#xff0c;网络模型及报文格式_vxlan报文格式-CSDN博客 如果服务器作为VTEP&#xff0c;那从服务器发送到接…

Java对象的揭秘

前言 作为一个 Java 程序员&#xff0c;我们在开发中最多的操作要属创建对象了。那么你了解对象多少&#xff1f;它是如何创建&#xff1f;如何存储布局以及如何使用的&#xff1f;本文将对 Java 对象进行揭秘&#xff0c;以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基…

云计算如何助力金融科技企业实现高效运营

一、引言 随着信息技术的飞速发展,云计算作为一种新兴的计算模式,正在逐渐改变着传统金融行业的运营模式。金融科技企业作为金融行业的重要组成部分,面临着日益增长的业务需求和技术挑战。在这一背景下,云计算凭借其弹性扩展、高可用性、低成本等优势,成为金融科技企业实…

VisualSVN Server/TortoiseSVN更改端口号

文章目录 概述VisualSVN Server端更改端口号TortoiseSVN客户端更改远程仓库地址 概述 Subversion&#xff08;SVN&#xff09;是常用的版本管理系统之一。部署在服务器上的SVN Server端通常会在端口号80&#xff0c;或者端口号443上提供服务。其中80是HTTP访问方式的默认端口。…

SSM牙科诊所管理系统-计算机毕业设计源码98077

目 录 摘要 1 绪论 1.1研究目的与意义 1.2国内外研究现状 1.3ssm框架介绍 1.4论文结构与章节安排 2 牙科诊所管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能…

制作ChatPDF之后端Node搭建(三)

后端Node搭建 接上篇:制作ChatPDF之前端Vue搭建&#xff08;二&#xff09; 项目结构 下面是项目的结构图&#xff0c;包括前端 (Vue.js) 和后端 (Node.js) 的项目结构。 pdf-query-app/ ├── frontend/ │ ├── public/ │ │ ├── index.html │ ├── sr…

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别&#xff0c;及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…

C++20实战之channel

C20实战之channel 继前面两节的直播&#xff0c;讲解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法与底层实现&#xff0c;那么如何基于这些知识实现一个小项目呢&#xff1f; 于是引出了这篇&#xff0c;写一个channel出来。 注&#xff1a…

Python-算法编程100例-双指针(入门级)

1、盛水最多的容器 from typing import Listclass Solution:def maxArea(self, height: List[int]) -> int:# 双指针初始化l 0r len(height) - 1max_area 0# 循环终止条件while l < r:# 指针调整条件if height[l] < height[r]:# 指针调整前计算中间值max_area max…

FreeRTOS基础(四):静态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中如何动态创建任务&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握静态创建任务的编码风格&#xff0c;达到实战应用&#xff01; 目录 一、空闲任务和空闲任务钩子…

决定短视频打开率的要素:成都鼎茂宏升文化传媒公司

​ 在当下这个短视频盛行的时代&#xff0c;无论是个人创作者还是企业品牌&#xff0c;都希望通过短视频平台获得更多的曝光和关注。然而&#xff0c;如何让自己的短视频在众多内容中脱颖而出&#xff0c;吸引用户的点击和观看&#xff0c;成为了摆在我们面前的重要问题。成都…

【爬虫工具】油管视频批量采集软件

一、背景介绍 1.1 爬取目标 我用Python独立开发了一款爬虫软件&#xff0c;作用是&#xff1a;通过搜索关键词采集ytb的搜索结果&#xff0c;包含14个关键字段&#xff1a;关键词,页码,视频标题,视频id,视频链接,发布时间,视频时长,频道名称,频道id,频道链接,播放数,点赞数,评…

开源模型应用落地-LangSmith试炼-入门初体验-监控和自动化(五)

一、前言 在许多应用程序中&#xff0c;特别是在大型语言模型(LLM)应用程序中&#xff0c;收集用户反馈以了解应用程序在实际场景中的表现是非常重要的。 LangSmith可以轻松地将用户反馈附加到跟踪数据中。通常最好提供一个简单的机制(如赞成和反对按钮)来收集用户对应用程序响…

工控一体机5寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…