JavaWeb——后端之Mybatis

四、Mybatis

概念: Mybatis是一款持久层(Dao层)框架,用于简化JDBC(Sun操作数据库的规范,较繁琐)的开发

历史: Apache的一个开源项目iBatis,2010年由apache迁移到了google code,并改名MyBatis。2013年11月迁移到Github

1. 入门程序

1)创建Spring module;创建的时候勾选MyBatis Framework和MySql service(对应数据库的类型)

2)准备数据以及数据库环境

3)定义一个实体类,实体类的变量要与表中的数据类型以及名称对应,实体类变脸阿哥使用包装类,命名使用驼峰命名

4)创建Mybatis的环境,在模块的application.properties中声明

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://124.221.237.48(地址):3306/test(数据库名)
#连接数据库的用户名
spring.datasource.username=xy
#连接数据库的密码
spring.datasource.password=123456

5)定义mapper,就是使用Sql语句的类,要使用Mapper进行注解,这样运行时,会自动生成该接口的实现类对象(代理对象),并将该对象交给IOC容器管理。

在类中定义抽象方法,如果是查询就使用@Select()注解,括号中指定sql查询语句

注:要想有sql语法提示

选中Sql语句右键Show Context Actions——>inject language——>MySql(要想提示表名,要将数据库连接到IDEA——使用IDEA连接数据库)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

6)在测试启动类中编写测试方法,因为要使用mapper接口中的方法,所以使用Autowired,从IOC中获取bean对象

2. 数据库池连接

使用配置文件进行配置之后,SpringBoot底层就会自动使用数据库连接池技术管理和分配连接

概念:

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

优势:

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

产品:

Druid

引入依赖(版本要对应调整)

# Spring2
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2.8</version>
</dependency>

# Spring3
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-3-starter</artifactId>
	<version>1.2.20</version>
</dependency>

配置数据库连接池类型(可以不)

Hikari(springboot默认)

3. lombok工具包

原有问题: 数据库中的数据要对应一个实体类,并为其生成构造器,getter/setter,toString等方法

lombok: 一个实用的java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发,提高效率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

准备工作: 添加依赖

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

注: Lombok会在编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)

4. Mybatis基础操作

1)删除

EmpMapper.java

@Mapper
public interface EmpMapper {
    // 根据ID删除数据
    @Delete("delete from emp where id= #{id}")
    public void delete(Integer id);
}
// #{}是占位符,生成的就是预编译的SQL语句

测试方法

@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
    @Autowired
    private EmpMapper empMapper;
    @Test
    public void testDelete() {
        empMapper.delete(17);
    }
}

想要查看执行的日志信息可以配置==>预编译SQL

# 配置mybatis日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在这里插入图片描述

在这里插入图片描述

参数占位符

在这里插入图片描述

2)新增

接口方法

// 插入数据
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
        "values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
public void insert(Emp emp);  // 参数太多,使用实体类进行封装

测试方法

@Test
public void testInsert() {
	Emp emp = new Emp();
	emp.setUsername("Tom");
	emp.setName("汤姆");
    emp.setImage("1.jpg");
    emp.setGender((short)1);
    emp.setJob((short)1);
    emp.setEntrydate(LocalDate.of(2000, 1, 1));
    emp.setCreateTime(LocalDateTime.now());
    emp.setUpdateTime(LocalDateTime.now());
    emp.setDeptId(1);
    empMapper.insert(emp);
    }

主键返回

插入数据成功后,想要获取这个插入数据的主键

@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
        "values(#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")
public void insert(Emp emp);

3)更新

根据主键id查询回显

然后修改对应数据

@Update(更新的SQL语句)

4)查询

// 根据ID查询数据
@Select("select  * from emp where id = #{id}")
public Emp getById(Integer id);
@Test
public void testGetById() {
    Emp emp = empMapper.getById(1);
    System.out.println(emp);
}

在这里插入图片描述

数据封装

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装(数据库属性命名是下划线分隔,实体类变量命名是驼峰)

解决数据封装问题

方案一:给数据库字段起别名

方案二:通过@Results,@Result注解手动映射封装

// 通过@Results和@Result注解进行封装
@Results({
        @Result(column = "dept_id", property = "deptId"),
        @Result(column = "create_time", property = "createTime"),
        @Result(column = "update_time", property = "updateTime")
})
@Select("select  * from emp where id = #{id}")
public Emp getById(Integer id);

方案三:开启Mybatis的驼峰命名自动映射开关(前提:数据库字段名字和Java中的属性名命名都是严格按照规范的)

# 开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true

条件查询

// 条件查询
//    @Select("select * from emp where name like'%${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);
// 为了防止SQL注入
@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);
@Test
public void testSelect() {
List<Emp> empList = empMapper.list("张", (short)1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
System.out.println(empList);
}

5. XML映射文件(配置SQL语句)

在这里插入图片描述

条件查询的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.itheima.mapper.EmpMapper">
    <!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select * from emp where name like concat('%', #{name}, '%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc
    </select>
</mapper>

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

使用注解来映射简单的语句会使代码更加简洁,但是稍微复杂一点,就混乱不堪。——>如果做一些复杂的操作,最好使用XML来映射语句

6. 动态SQL

概念: 随着用户的输入或者外部条件的变化而变化的SQL语句

6.1 <if>

<mapper namespace="com.itheima.mapper.EmpMapper">
    <!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select *
        from emp
        where
        <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>

</mapper>
@Test
public void testSelect() {
    // List<Emp> empList = empMapper.list("张", (short)1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
    List<Emp> empList = empMapper.list("张", null, null, null);
    System.out.println(empList);
}

在这里插入图片描述

问题: 如果第一个为空,wher就会紧跟着and,不合规的SQL

解决: 使用<where></where> 代替where

  • 动态生成where关键字
  • 自动去除条件前的and和or
<mapper namespace="com.itheima.mapper.EmpMapper">
    <!--第一个参数是方法名,第二个参数是查询返回的单条语句的全类名-->
    <select id="list" resultType="com.itheima.pojo.Emp">
        select *
        from emp
        <where>
        <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>
        </where>
        order by update_time desc
    </select>

</mapper>

<set></set>

  • 去掉字段之后多余的逗号

6.2 <foreach>

<!--批量删除-->
<!--
collection:遍历的集合
item:遍历的元素
separator:分隔符
open:遍历开始前拼接的SQL片段
close:遍历结束后拼接的SQL片段
-->
<delete id="deleteByIds">
    delete from emp where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>
// 批量删除
public void deleteByIds(List<Integer> ids);
@Test
public void testDeletByIds() {
    List<Integer> ids = Arrays.asList(13, 14, 15);
    empMapper.deleteByIds(ids);
}

6.3 <sql><include>

重复SQL片段——》代码复用性差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

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

相关文章

Spring见解

1.Spring概述 1.1.Spring介绍 Spring是轻量级Java EE应用开源框架&#xff08;官网&#xff1a; http://spring.io/ &#xff09;&#xff0c;它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面&#xff1f; IOC 解决传统Web开发中硬编…

【MATLAB】EEMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EEMD-LSTM神经网络时序预测算法是一种结合了扩展经验模态分解&#xff08;EEMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 EEMD是一种改进的EM…

spring见解2基于注解的IOC配置

3.基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。 3.1.创建工程 3.1.1.pom.xml <?xml version"1.0" en…

《论文阅读》基于情绪-原因转换图的共情回复生成

《论文阅读》基于情绪-原因转换图的共情回复生成 前言摘要模型架构图构建回复概念预测回复生成前言 今天为大家带来的是《EMPATHETIC RESPONSE GENERATION VIA EMOTION CAUSE TRANSITION GRAPH》 出版: 时间:2023.2.23 类型:共情对话生成 关键词:图网络;共情回复;情绪…

C++ 实现对战AI五子棋

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 前言&#xff1a; 为了能够快速上手一门语言&#xff0c;我们往往在学习了基本语法后&#x…

SoapUI参数传递操作详解

SoapUI 传递参数 本文章主要是通过例子&#xff0c;给大家讲解一下 SoapUI 发送请求时&#xff0c;如何带上参数~ 我们可以先了解下&#xff1a;SoapUI简介&#xff1a;了解这个流行的API测试工具 新建工程 首先新建一个工程&#xff0c;然后在里面进行后续的操作。 填写工程…

【C语言期末】基于VS2022的学生成绩管理系统

诚接计算机专业编程任务(C语言、C、Python、Java、HTML、JavaScript、Vue等)10/15R&#xff0c;如有需要请私信我&#xff0c;或者加我的企鹅号&#xff1a;1404293476 本文资源&#xff1a;https://download.csdn.net/download/weixin_47040861/88702521https://download.csd…

海外数据中心代理与住宅代理:优缺点全面对比

数据中心代理和住宅代理是为了匿名而开发的&#xff0c;通过替换网站眼中您自己的 IP 地址。然而&#xff0c;它们在价格、功能、性能或最佳用例方面存在一些差异。那么&#xff0c;这些代理类型到底有什么相似点和不同点呢&#xff1f; 一、什么是数据中心代理&#xff1f; 1…

CSS 放大旋转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-scale-up: isAnimating }"><!-- 元素内容 -->&l…

视频怎么配上音乐?视频软件轻松配乐

视频怎么配上音乐&#xff1f;视频配乐已经成为了一种重要的表达方式。它能够为视频增添情感&#xff0c;营造氛围&#xff0c;让观众更加深入地理解视频的内容。那么&#xff0c;哪些软件可以给视频配上音乐呢&#xff1f;本文将为你介绍几款优秀软件。 一、清爽视频编辑 清爽…

【Harmony OS - 网络请求】

在一个应用开发中&#xff0c;网络请求是必不可少的&#xff0c;我们一般用的fetch、axios来进行http请求&#xff0c;在鸿蒙中也可以通过createHppt来发生一个http请求&#xff0c;它们都是异步请求返回的Promise&#xff0c;下面我们将介绍’ohos.net.http’和axios这两种方式…

JMeter 插件大全:详细介绍 Jmeter 常用插件

JMeter作为一个开源的接口性能测试工具&#xff0c;其本身的小巧和灵活性给了测试人员很大的帮助&#xff0c;但其本身作为一个开源工具&#xff0c;相比于一些商业工具&#xff08;比如 LoadRunner&#xff09;&#xff0c;在功能的全面性上就稍显不足。这篇博客&#xff0c;就…

特斯拉被比亚迪拉下神坛,马斯克难改命运岁月不如人

当这个消息浮现在我面前时&#xff0c;我几乎不敢相信眼前所见。比亚迪这个我曾无数次在文章中提及的中国车企&#xff0c;终于在2023年完成了伟大的历史任务——以销量突破特斯拉&#xff0c;站上全球电动车王座的宝座&#xff01; 过去我们都习惯于从欧美日韩那里听说汽车的成…

k8s笔记1- 初步认识k8s

k8s简介&#xff1a; kubernetes&#xff0c;俗称k8是&#xff0c;用于自动部署&#xff0c;扩缩和管理容器化应用程序的开源系统&#xff0c;它将组成应用程序的容器&#xff0c;组合成逻辑单元&#xff0c;便于管理和服务发现。 k8s的作用 自动化上线和回滚、存储编排…

张驰咨询:ZENNER真兰标杆展示——2023年六西格玛DMAIC项目出色落下帷幕

告别了旧年&#xff0c;我们跨入了新的一年&#xff01;ZENNER在23年初启动的DMAIC项目在2023年12月25日迎来了总结、收获成果的发布会。 ZENNER真兰集团中国区总裁杨燕明先生&#xff0c;张驰咨询公司的两位精益六西格玛黑带大师专家张驰老师和朱成朝老师&#xff0c;以及真诺…

云卷云舒:构建业务型电信智能运维方法

1 引言 智能运维&#xff08;AIOps-Algorithmic IT Operations基于算法的IT运维&#xff09;是人工智能技术在IT运维领域的运用&#xff0c;引用Gartner 的报告的一段话“未来几年&#xff0c;将近50%的企业将会在他们的业务和IT运维方面采用AIOps&#xff0c;远远高于今天的10…

java基础之java8新特性-默认方法

目录 1.默认方法 jdk8之前的接口 jdk8的接口 默认方法的用途 1.默认方法 jdk8之前的接口 在jdk8之前接口&#xff08;interface&#xff09;中可以定义变量和方法&#xff0c;变量必须是public&#xff0c;static&#xff0c;final的&#xff1b;方法必须是public&#xf…

腾讯云2024年优惠券领取入口及使用教程

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效、安全可靠的云计算服务。为了回馈广大用户&#xff0c;腾讯云会不定期地推出各种优惠活动&#xff0c;其中最受欢迎的就是优惠券活动。本文将详细介绍腾讯云优惠券的领取入口及使用教程。 一、…

19、BLIP-2

简介 github 通过利用预训练的视觉模型和语言模型来提升多模态效果和降低训练成本&#xff0c;预训练的视觉模型能够提供高质量的视觉表征&#xff0c;预训练的语言模型则提供了强大的语言生成能力。 实现过程 为了弥合模态差距&#xff0c;提出了一个分两个阶段预训练的 Qu…

秋招复习之数组与链表

目录 前言 1 数组 初始化数组&#xff1a; 访问元素 插入元素 删除元素 遍历数组&#xff1a; 查找元素 扩容数组&#xff1a; 数组的优点与局限性 2 链表 初始化链表 插入节点 删除节点 访问节点 查找节点 数组 vs. 链表 常见链表类型 3 列表 初始化列表 访问元素 插入与删…