MyBatis(初阶)

news2024/11/15 17:55:42

1.什么是MyBtis

MyBatis是持久层框架,⽤于简化JDBC的开发。

2.准备工作

2.1 创建⼯程

 数据库:

2.2 配置数据库连接字符串

以application.yml⽂件为例:

  

2.3 写持久层代码

@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

添加mapper接口:

@Mapper会告诉Spring,把对象交给Spring管理

2.4 单元测试

3. MyBatis的基础操作(注解)

3.1 打印日志 

在Mybatis当中我们可以借助⽇志,查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果 

#打印mtbatis日志的配置
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


3.2 传递参数 

@Mapper
public interface UserInfoMapper {

    @Select("select * from userinfo")
    List<UserInfo> selectAll();


    @Select("select * from userinfo where id= 1 ")
    UserInfo selectOne();

    @Select("select * from userinfo where id=#{id} ")
    UserInfo selectOne1(Integer id);

    //参数重命名
    @Select("select * from userinfo where id=#{userId} ")
    UserInfo selectOne2(@Param("userId") Integer id);

}

首先要添加@SpringBootTest注解,启动Spring容器,才能注入

@SpringBootTest
@Slf4j
class UserInfoMapperTest {

    @Autowired
    private UserInfoMapper userInfoMapper;

    @Test
    void selectAll() {
        List<UserInfo> list = userInfoMapper.selectAll();
        log.info(list.toString());
    }

    @Test
    void selectOne() {
        log.info(userInfoMapper.selectOne().toString());
    }

    @Test
    void selectOne1() {
        log.info(userInfoMapper.selectOne1(1).toString());
    }

    @Test
    void selectOne2() {
        log.info(userInfoMapper.selectOne2(1).toString());
    }
}

3.3 增

 

②获取自增ID:

③对INSERT的参数进行重命名:

如果对对象进行重命名: 

此时会报错:

修改:

#{对象名.属性名}

3.4 删


3.5 改

3.6 查

① 
@Mapper
public interface UserInfoMapper {

    /**
     * 查询
     * @return
     */
    @Select("select * from userinfo")
    List<UserInfo> selectAll();


    @Select("select * from userinfo where id=#{id}")
    UserInfo selectOne(Integer id);


    //对参数进行重命名
    @Select("select * from userinfo where id=#{id123}")
    UserInfo selectOne2(@Param("id123") Integer id);

}

 

②结果映射

MyBatis会自动把mysql返回的数据,和java对象进行映射(规则:名称一致)

如果mysql字段名和java对象的属性不一致: 

方法一:对字段进行重命名(不推荐)

方法二:@Results注解

想重复利用的话,进行命名:

方法三: 自动转驼峰


4. MyBatis XML配置⽂件

4.1  配置数据库连接字符串和MyBatis

4.2 写持久层代码

1. 方法定义Interface 

2. 方法实现 XXX.xml

4.2.1 添加mapper接口

4.2.2 添加UserInfoXMLMapper.xml 

 数据持久成的实现,MyBatis的固定xml格式:

4.2.3 单元测试(同注释)

 

4.3 增删改查 

4.3.1 增

UserInfoXMLMapper接⼝: 

@Mapper
public interface UserInfoXMLMapper {


    Integer insert(UserInfo userInfo);

}

UserInfoXMLMapper.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.example.demo.mapper.UserInfoXMLMapper">
  
    <insert id="insert">
        insert into userinfo (username,password,age,gender,phone)
        values(#{username},#{password},#{age},#{gender},#{phone})
    </insert>


</mapper>

单元测试: 

@Slf4j
@SpringBootTest
class UserInfoXMLMapperTest {

    @Autowired
    private UserInfoXMLMapper userInfoXMLMapper;


    @Test
    void insert() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("java108");
        userInfo.setPassword("java108");
        userInfo.setAge(1);
        userInfo.setGender(2);
        userInfo.setPhone("456567899231");
        Integer result= userInfoXMLMapper.insert(userInfo);
        log.info("影响行数:{}, 插入的结果ID:{}",result,userInfo.getId());
    }

}

返回自增ID:


 

4.3.2 删

@Mapper
public interface UserInfoXMLMapper {

    Integer delete(Integer id);

}


4.3.3 改


4.3.4 查

此操作需要写全限定类名

下面来看映射操作(<resultMap标签>):

其它两种方法:1)给字段设置别名 2)配置自动转驼峰

此时有结果的映射,这个就不需要了:

5. 其他查询操作 

5.1 多表查询

看打印日志:

可以看出:sql语句返回的结果有username和age,但是打印的结果没有

这是为什么呢?

因为对象里面没有username和age,所以加上 

此时打印结果为:

总结:SQL中直接查询多个表,把查询的结果放在一个对象即可


5.2 #{} 和 ${}(常见面试题)

首先看Interger类型的:

使用$查询:即时SQL

使用#查询:预编译SQL 

再看String类型

 #:

使用$的时候报错:少了个' '

那就需要加上:

 

总结:使用#时,如果参数为String,会自动加上' ',$不会,$符合是直接拼接 


5.3 排序

使用#,会报错

此时#给asc自动加上引号,报错

使用$,运行正确

总结:排序时,不能使用#,如果使用#,会给参数加上' ' 


5.4 like查询

使用#号,报错: 

又多加了一个引号,报错 

使用$符号,正常运行:

 

注意:模糊查询时,如果使用#,需要搭配mysql的内置函数concat,而不能直接使用

那既然#符号不适用某些场景,那可以只使用$嘛?

不可以,$符号存在漏洞

5.5 $符号漏洞SQL注入

SQL注⼊:

是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。 

举个例子:

正常访问:

select * from userinfo where username = 'admin'

把admin改为  'or 1 = ' 1,即select * from userinfo where username =' 'or 1 = ' 1'

此时数据库会将usrname = '' 和'1'看作一对去执行,但其实参数是'or 1 = '

其中参数or被当做了SQL语句的⼀部分

 

#和$区别其中之一就是预编译SQL和即时SQL的区别

1)预编译SQL性能更高

2)预编译SQL不存在SQL注入的问题 

实际开发中,能使用#的,都使用#,使用$时,一定要考虑到SQL注入的问题

6.数据库连接池

6.1 介绍

数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个

  • 没有使⽤数据库连接池的情况:

每次执⾏SQL语句,要先创建⼀个新的连接对象,然后执⾏SQL语句,SQL 语句执⾏完,再关闭连接对象释放资源.这种重复的创建连接,销毁连接⽐较消耗资源

  • 使⽤数据库连接池的情况:

程序启动时,会在数据库连接池中创建⼀定数量的Connection对象,当客⼾请求数据库连接池,会从数据库连接池中获取Connection对象,然后执⾏SQL,SQL语句执⾏完,再把 Connection归还给连接池. 

6.2 优点

1. 减少了⽹络开销

2. 资源重⽤

3. 提升了系统的性能

6.3 使用

常见的数据库连接池:

  • C3P0
  • DBCP  
  • Druid
  • Hikari

⽬前⽐较流⾏的是Hikari,Druid

6.3.1 Hikari

Hikari : SpringBoot默认使⽤的数据库连接池

6.3.2 Druid 

如果想把默认的数据库连接池切换为Druid数据库连接池,引⼊相关依赖即可 

 <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.17</version>
 </dependency>

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

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

相关文章

YOLOv10训练,适合小白训练,新手YOLOv10训练自己数据集教程!超简单,超详细!!

YOLOv10训练&#xff0c;适合小白训练&#xff0c;新手YOLOv10训练自己数据集教程&#xff01;超简单&#xff0c;超详细&#xff01;&#xff01; AI学术叫叫兽在这&#xff01;家人们&#xff0c;给我遥遥领先&#xff01;&#xff01;&#xff01; 方法一&#xff1a;云服务…

如何打造一款爆款手游?

现在开发一款游戏太简单了&#xff0c;各种源码满地飞&#xff0c;大家拿过来随便改改有个版号就可以上线运营了&#xff0c; 但是这种的游戏品质一般都不会怎么样&#xff0c;留存的周期也是比较短的&#xff0c;更别说让玩家持续消费了&#xff0c;想要打造一款火热的游戏我们…

Android Media Framework(十八)ACodec - Ⅵ

ACodec之所以复杂&#xff0c;主要是因为状态太多。在上一篇文章中&#xff0c;我们学习了在ExecutingState下对buffer的处理。ExecutingState可能会切换到OutputPortSettingsChangedState、FlushingState&#xff0c;或者当组件被释放时&#xff0c;进入UninitializedState。接…

泛微云桥前台文件上传漏洞-202408

漏洞简介 2024 年 8 月份新出漏洞&#xff0c;泛微云桥任意文件上传漏洞&#xff0c;详情如图所示。 环境搭建 1、下载漏洞环境。 https://wx.weaver.com.cn/download 2、运行install64.bat&#xff0c;安装环境。 3、安装成功界面。 未安装补丁&#xff0c;系统不能使用…

Java方法01:什么是方法

本节视频链接&#xff1a;Java方法01&#xff1a;什么是方法&#xff1f;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p45&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌方法‌是一段执行特定任务的代码片段&#xff0c;‌它是程序的基本构…

Keepalived:不只是心跳检测,更是高可用性的秘密武器

keepalived博客(Keepalived&#xff1a;不只是心跳检测&#xff0c;更是高可用性的秘密武器) 文章目录 keepalived博客(**Keepalived&#xff1a;不只是心跳检测&#xff0c;更是高可用性的秘密武器**)keepalived介绍概述工作原理核心模块应用场景配置与安装总结 keepalived基本…

工 厂设计模式

简单工厂模式 基本介绍 1) 简单工厂模式是属于创建型模式,是工厂模式的一种。 简单工厂模式是由一个工厂对象决定创建出哪一 种产品类 的实例。简单工厂模式是工厂模式家族中最简单实用的模式 2) 简单工厂模式:定义了一个创建对象的类,由这个类来 封装实例化对象的行为 (代…

从零开始学cv-6:图像的灰度变换

文章目录 一&#xff0c;简介&#xff1a;二、图像的线性变换三、分段线性变换四&#xff0c;非线性变换4.1 对数变换4.2 Gamma变换 五&#xff0c;效果: 一&#xff0c;简介&#xff1a; 图像灰度变换涉及对图像中每个像素的灰度值执行数学运算&#xff0c;进而调整图像的视觉…

Python基础和变量使用

1. 基础了解 1.1 运行方式 Python有多种运行方式&#xff0c;以下是几种常见的执行Python代码的方法&#xff1a; 交互式解释器&#xff1a; 打开终端或命令提示符&#xff0c;输入python或python3&#xff08;取决于你的系统配置&#xff09;&#xff0c;即可进入Python交互…

HelpLook AI 知识库:为企业提供高效智能的知识管理解决方案

“管理就是把复杂的问题简单化&#xff0c;混乱的事情规范化。” 在当今竞争激烈的商业环境中&#xff0c;企业面临着快速变化的市场需求和日益复杂的业务流程。为了保持竞争力并提升运营效率&#xff0c;选择一款合适的知识管理系统至关重要。在众多选项中&#xff0c;HelpLoo…

day05--Vue

一、Vue入门 1.1入门案例 1.在页面中引入vue.js框架 2.定义vue对象 let app new Vue({ el:"#vue作用域的div标签id", data:{ //所有数据模型 }&#xff0c; methods:{ //页面中所有触发的js方法 }&#xff0c; created(){ //页面初始化&#xff0c;准备调用方法 } …

MODELSIM仿真报错解决记录

目录 问题&#xff1a;Modelsim报错&#xff1a;Error (10228): Verilog HDL error at Line_Shift_RAM_1Bit.v(39): module “Line_Shift_RAM_1 原因&#xff1a;创建的IP核放到了别的位置 解决方法&#xff1a;删掉IP核以及QIP等文件&#xff0c;将IP核创建到工程目录下 问…

vue3旋转木马型轮播图,环型滚动

<template><div><div class"content"><div class"but1" click"rotateLeft">--向左</div><div class"ccc"><main id"main"><div class"haha" ref"haha"&g…

垂直电商的兴衰与开源AI智能名片S2B2C商城系统的崛起:一场商业模式的革新

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;电子商务行业经历了从萌芽到繁荣再到精细化分化的历程。垂直电商作为电商领域的一个重要分支&#xff0c;曾因其聚焦细分市场、满足特定用户需求、产品标准化及快速整合供应链等优势&#xff0c;吸引了大量资本的关注。然…

Ubuntu上安装Redis的详细教程

1、安装redis 首先&#xff0c;访问Redis官网&#xff0c;点击首页的【Get Started】&#xff0c;然后点击Install Redis on Linux 安装 终端依次输入以下命令&#xff0c;如果过程中没有错误提示&#xff0c;则redis安装完成。 sudo apt install lsb-release curl gpg cu…

【前端】NodeJS:会话控制

文章目录 1 介绍2 cookie2.1 cookie是什么2.2 cookie的特点2.3 cookie的运行流程2.4 浏览器操作cookie2.5 cookie的代码操作 3 session3.1 session是什么3.2 session的作用3.3 session运行流程3.4 session的代码操作 4 session和cookie的区别5 token5.1 token是什么5.2 token的…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

旧版Pycharm支持的python版本记录

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;旧版Pycharm支持的python版本记录-CSDN博客 前言&#xff1a;近期由于打算研究GitHub上一个开源量化交易平台开发框架&#xff0c;但是该框架是基于python3.10的版本开发&#xff0c;所…

海康VisionMaster使用学习笔记5-开机自启动

开机自启动 在实际应用中&#xff0c;用户会希望机台上电开机后&#xff0c;软件能自启动避免现场人员误操作&#xff0c;减少机台重新上电时的操作步骤以提升效率。 设置 打开VM,点击设置,软件设置->开机自启动->勾选开机自启动->确定 默认运行界面 启动时以设定的…

MapReduce原理和操作

目录 一、MapReduce开发1. 数据处理的过程&#xff08;MapReduce&#xff09;2. 入门案例 二、MapReduce的高级特性1. 序列化2. 排序3. 分区4. Combiner——合并5. Shuffle——洗牌 一、MapReduce开发 1. 数据处理的过程&#xff08;MapReduce&#xff09; 注意 JobMapReduce&…