JavaWeb(04)

MyBatis 时一款优秀的持久层框架,用于简化JDBC的开发
The MyBatis Blog

目录

  • MyBatis入门
  • Mybatis基础CRUD
  • Mybatis动态SQL

Mybatis入门

  • 快速入门

  • JDBC介绍

  • 数据库连接池

  • lombok

  • 准备工作(创建springboot工程,数据库表user,实体类User)

  • 引入Mybatis的相关依赖,配置Mybatis(数据库的连接信息)

  • 编写SQL语句

  1. 数据库表中的字段和实例用的属性名一一对应

  2. 配置Mybatis的依赖

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234
  1. 编写SQL语句
@Mapper
public interface UserMapper {@Select("select * from user")public List<User> list();
}
  1. 编写测试
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test1(){List<User> userList = userMapper.list();userList.stream().forEach(user -> {System.out.println(user);});}
}

注:要在主入口上面添加@MapperScan("org.mybatis.mapper") ,告诉bean对象在哪个文件夹下

@SpringBootApplication  
@MapperScan("org.mybatis.mapper")  
public class MybatisApplication {  public static void main(String[] args) {  SpringApplication.run(MybatisApplication.class, args);  }  }

JDBC(Java DataBase Connectivity)介绍

本质

  • sun 公司官方定义的一套操作所有关系型数据库的规范,即接口。
  • 各个数据库厂商去实现这套接口,提供数据库驱动 jar 包。
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动 jar 包中的实现类。

数据库连接池

  • 数据库连接池是个容器,负责分配、管理数据库连接 (Connection)
  • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
  • 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏

优势

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

注:springboot默认的数据库连接池 Hikari

小结

  • 是一个容器,负责分配、管理数据库连接 (Connection)
  • 优势:资源复用、提升系统响应速度
  • 接口:DataSource
  • 产品:C3P0、DBCP、Druid、Hikari

lombok

  • 是一个实用的Java类库,能通过注解的形式自动生成构造器,getter/setter, equals , hashcode,toString 等方法,并可以自动化生成日志变量,简化java开发,提高效率
注解作用
@Getter/@Setter为所有的属性提供 get/set 方法
@ToString会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
@Data提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor为实体类生成无参的构造器方法
@AllArgsConstructor为实体类生成除了 static 修饰的字段之外带有各参数的构造器方法

lombok的依赖

<dependency>  <groupId>org.projectlombok</groupId>  <artifactId>lombok</artifactId>  
</dependency>

Mybatis基础操作

准备

  • 准备数据库表
  • 创建一个新的springboot,选择引入对应的起步依赖(mybatis,mysql)
  • application.properties 中引入数据库连接信息
  • 创建对应的实体类 Emp(实体类属性采用驼峰命名)
  • 准备Mapper接口EmpMapper

注:

  • Java中的 LocalDateTime --> datetime
  • Java中的 LocalDate --> date
  • Java中的属性采用大驼峰命名,数据库中采用下划线命名

删除

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);
}
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void test(){int delete = userMapper.delete(12);sout(delete);}
}

注:如果mapper接口方法形参只有一个普通连续的参数,#{} 里面的属性名可以随便写

  • #{} 生成预编译SQL,会自动设置参数值
  • 预编译SQL
    • 性能更高
    • 更安全(防止SQL注入)
  • ${}
    • 拼接SQL,存在SQL注入问题

新增

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);
}

注:name是emp中的属性名

主键返回:在数据添加成功后,许哟啊获取插入数据库数据的主键

实现

@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("... values(#{name})")public void insert(Emp emp);

会将主键封装到emp实类的 id 属性中

更新

@Mapper
public interface UserMapper {@delete("delete from emp where id = #{id}")public int delete(Integer id);@Insert("... values(#{name})")public void insert(Emp emp);@Update("...")public void update(Emp emp);}

查询

@Mapper
public interface UserMapper {@Select("select * from user")public Emp list();
}
  • 数据封装

    • 实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装
    • 如果实体类属性 和 数据库表查询返回的字段名不一致,不能自动封装
  • 解决方案

    • 起别名
    • 通过 @Results注解手动映射封装
    • 开启mybatis的驼峰命名自动映射的开关
@Mapper
public interface UserMapper {@Select("select user_name userName from user")public Emp list();
}
@Mapper
public interface UserMapper {@Result({@Resule(coulmn = "user_name", property = "userName")@Resule(coulmn = "xxx", property = "xxx")})@Select("select user_name UserName from user")public Emp list();
}

条件查询 中使用concat的案例

@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} order by update_time desc")
public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

XML映射文件

  • 规范
    • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下
    • XML映射文件的namespace属性为Mapper接口全限定名一致
    • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
  • 复杂的MySQL,推荐使用XML

注:到官网找到配置SQL语句的XML的约束

  • 插件介绍
    • MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生

动态SQL

例子:

<select id="list" resultType="com.itheima.pojo.Emp">select id, username, password, name, gender, image, job,entrydate, dept_id, create_time, update_time from empwhere<if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>order by update_time desc
</select>
  • <where>
    • 动态生成where (如果if 里面都不成立,就不会生成where)
    • 自动去除多余的andor
  • <set>
    • 动态生成 set
    • 自动去除 ,
    • 用于 update 语句中
  • <if>
    • 用于判断条件是否成立,使用test属性进行判断,如果条件为true,则拼接SQL
  • <foreach>
    • collection:遍历的集合
    • item:遍历出来的元素
    • open:遍历开始前拼接的SQL片段
    • close:遍历结束后拼接的SQL片段
  • <sql><include>
    • 提高SQL的复用性
    • sql --> 需要一个id
    • include --> refid 指定引入的sql

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

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

相关文章

统计学1:伯努利模型的参数估计与等价性分析

伯努利模型的参数估计方法 1. 统计学习方法三要素对比方法模型策略算法极大似然估计概率模型经验风险最小化数值解贝叶斯估计概率模型结构风险最小化解析解2. 极大似然估计 2.1 模型设定 设P(x1)θP(x1)\thetaP(x1)θ&#xff0c;则P(x0)1−θP(x0)1-\thetaP(x0)1−θ 2.2 似然…

游戏行业DDoS攻防实战指南

一、游戏DDoS攻击特征分析游戏行业DDoS攻击呈现高度复合化特征&#xff0c;攻击手段日益专业化。2023年Akamai监测数据显示&#xff0c;63%的游戏服务器攻击采用UDP反射放大&#xff08;如NTP、Memcached协议&#xff09;与HTTP慢速攻击&#xff08;如Slowloris&#xff09;相结…

[自动化Adapt] 录制引擎 | iframe 穿透 | NTP | AIOSQLite | 数据分片

链接&#xff1a;https://github.com/OpenAdaptAI/OpenAdapt/wiki/OpenAdapt-Architecture-(draft) docs&#xff1a;OpenAdapt OpenAdapt 是一个开源项目&#xff0c;旨在 记录 和 回放 用户在计算机上的交互行为。 它如同智能助手般 观察 我们的操作&#xff08;鼠标点击、…

ipv6学习

ipv6的历史背景和及展望ipv6普及不够&#xff0c;ipv4快要用完。ipv6技术部分ivp6包头结构ipv6不允许分片&#xff0c;减轻中间设备压力。IPv6 包头结构可按字段分层解析&#xff0c;核心特点是 固定头部长度&#xff08;40 字节&#xff09; &#xff0c;将可选功能移至扩展头…

软件定义汽车 --- 电子电气架构的驱动

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

HTML5 语义元素

HTML5 语义元素 引言 HTML5 作为现代网页开发的基础&#xff0c;引入了许多新的语义元素&#xff0c;这些元素使得网页内容更加结构化&#xff0c;便于搜索引擎更好地理解和索引页面内容。本文将详细介绍 HTML5 中的语义元素&#xff0c;并探讨其在网页设计中的应用。 HTML5…

vue3 el-select el-option 使用

在 Vue 3 中&#xff0c;el-select 是 Element Plus 组件库中的一个选择器组件&#xff0c;它允许用户从下拉菜单中选择一个或多个选项。如果你想在使用 Vue 3 和 Element Plus 时让 el-select 支持多种选择&#xff08;即多选&#xff09;&#xff0c;你可以通过设置 multiple…

windows搬运文件脚本

使用方法&#xff1a;copy_files_by_prefix.bat [目标目录] [结果目录] [文件名前缀] [可选参数&#xff1a;文件包含内容]echo off chcp 65001 >nul setlocal enabledelayedexpansion:: Check parameters if "%~3""" (echo Usage: %~nx0 [SourceDir] […

C++ 中 initializer_list 类型推导

在 C 中&#xff0c;initializer_list 是一种用于表示列表初始化的标准库模板类&#xff0c;提供了一种方便的方式来初始化容器或者进行函数调用时传递一组参数。initializer_list&& 类型推导涉及到右值引用和移动语义&#xff0c;这在现代 C 中变得越来越重要。initia…

自动驾驶中的传感器技术22——Camera(13)

1、可靠性验证的目标车载摄像头作为自动驾驶和高级驾驶辅助系统&#xff08;ADAS&#xff09;的核心传感器&#xff0c;其可靠性直接影响到行车安全。可靠性验证的目标如下&#xff1a;暴露产品缺陷&#xff1a;在研制阶段&#xff0c;通过测试发现并修正产品设计中的问题&…

一周学会Matplotlib3 Python 数据可视化-图形的组成部分

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

三万字带你了解那些年面过的Java八股文

Java基础 1. String 和StringBuffer 和 StringBuilder的区别&#xff1f; String 字符串常量 StringBuffer 字符串变量&#xff08;线程安全&#xff09; StringBuilder 字符串变量&#xff08;非线程安全&#xff09; 2. sleep() 区间wait()区间有什么区别&#xff1f; sleep…

HTML 媒体元素概述

HTML 提供了多种元素用于嵌入和控制多媒体内容&#xff0c;包括音频、视频、图像、画布等。以下是常用的 HTML 媒体元素及其用法&#xff1a;音频 (<audio>)<audio> 元素用于嵌入音频内容&#xff0c;支持 MP3、WAV、OGG 等格式。 示例代码&#xff1a;<audio c…

http请求结构体解析

copy了一个接口的curl用来说明http请求的三个结构&#xff1a;请求行&#xff0c;请求头&#xff0c;请求体 文章目录一、请求的curl报文示例二、解析1. 请求行&#xff08;Request Line&#xff09;2. 请求头&#xff08;Request Headers&#xff09;3. 请求体&#xff08;Req…

无人机遥控器舵量技术解析

一、舵量的核心作用1. 精确控制的核心 舵量值&#xff08;通常以PWM微秒值表示&#xff09;量化了操作指令的强度&#xff1a; 小舵量&#xff08;1000μs&#xff09;&#xff1a;对应舵机最小角度或电机最低转速&#xff1b; 中点&#xff08;1500μs&#xff09;&#xf…

Git分支相关命令

在 Git 中&#xff0c;分支管理是非常重要的一部分。下面是一些常用的 Git 分支操作命令及其示例。 1. 查看所有分支 要查看项目中的所有分支&#xff08;包括本地和远程&#xff09;&#xff0c;可以使用&#xff1a; git branch -a仅查看本地分支&#xff1a;git branch2. 创…

Apache Flink 的详细介绍

Apache Flink 是一个开源的分布式流处理框架&#xff0c;专注于高吞吐、低延迟、 Exactly-Once 语义的实时数据处理&#xff0c;同时也支持批处理&#xff08;将批数据视为有限流&#xff09;。它广泛应用于实时数据分析、实时 ETL、监控告警、欺诈检测等场景&#xff0c;是当前…

Qt 常用控件 - 5

Qt 常用控件 - 4https://blog.csdn.net/Small_entreprene/article/details/149830464 前文补充 QRadioButton&#xff08;单选按钮&#xff09; QRadioButton 是单选按钮&#xff0c;允许在多个选项中选择一个。作为 QAbstractButton 和 QWidget 的子类&#xff0c;前面介绍…

vue的响应式原理

Vue.js 的响应式原理是其核心特性之一&#xff0c;使得数据变化能够自动更新到视图。Vue 的响应式系统主要依赖于 Object.defineProperty&#xff08;在 Vue 2.x 中&#xff09;和 Proxy&#xff08;在 Vue 3.x 中&#xff09;来实现数据的观察和更新。以下是对 Vue 响应式原理…

【AI论文】PixNerd:像素神经场扩散

摘要&#xff1a;扩散变换器目前所取得的成功在很大程度上依赖于预训练变分自编码器&#xff08;VAE&#xff09;所塑造的压缩潜在空间。然而&#xff0c;这种两阶段训练模式不可避免地会引入累积误差和解码伪影。为解决上述问题&#xff0c;研究人员选择回归像素空间&#xff…