MyBatis框架操作数据库一>xml和动态Sql

ops/2025/3/16 15:41:41/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

目录

  • 配置连接字符串和MyBatis:
  • XML编写Sql:
      • model层:
      • mapper层:
  • 动态Sql:
      • if 标签和trim标签:
      • where标签:
      • Set标签:
      • Foreach标签:

Mybatis的开发有两种方式:
注解和XML,这里我们讲解XML的方式和基于XML实现动态Sql

配置连接字符串和MyBatis:

这里要做两项:
1.数据库的连接配置
2.XML的配置
以上配置我们都是用yml的配置文件格式

数据库的连接配置:

spring:application:name: Spring-mybatiesdatasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

这里注意:自己连接数据库的密码,和数据库
在这里插入图片描述

XML的配置:

mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印mybatis日志map-underscore-to-camel-case: true # 配置数据库Java字段的驼峰转换mapper—locations: classpath:mapper/*.xml # XML配置

注意:xml文件配置要与resource/mapper目录下的xml文件对应
在这里插入图片描述

XML编写Sql:

model层:

package com.suli.springmybaties.model;import lombok.Data;import java.util.Date;@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;}

注意Java字段大驼峰数据库的字段蛇形命名,要记得加上驼峰转换配置,或者自己用标签来绑定


标签绑定代码:

<resultMap id="BaseMap" type="com.suli.springmybaties.model.UserInfo"><id property="id" column="id"></id><result property="deleteFlag" column="delete_flag"></result><result property="createTime" column="create_time"></result><result property="updateTime" column="update_time"></result>
</resultMap>

注意:
在这里插入图片描述

mapper层:

演示一个查询:

package com.suli.springmybaties.mapper;import com.suli.springmybaties.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface UserInfoMapperXML {List<UserInfo> selectAll();List<UserInfo> selectAll2();
}

对应的XML文件:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.suli.springmybaties.mapper.UserInfoMapperXML"><resultMap id="BaseMap" type="com.suli.springmybaties.model.UserInfo"><id property="id" column="id"></id><result property="deleteFlag" column="delete_flag"></result><result property="createTime" column="create_time"></result><result property="updateTime" column="update_time"></result>
</resultMap><select id="selectAll" resultType="com.suli.springmybaties.model.UserInfo">SELECT * from user_info</select><select id="selectAll2" resultMap="BaseMap">SELECT * from user_info</select>

动态Sql:

动态SQL是Mybatis的强大特性之一,能够完成不同条件下不同的sql拼接


在特定的业务场景下可能,有的字段为非必须字段,不需要用户填,有的字段为必须字段,需要用户填写,这个时候我们的动态Sql就发挥作用,这个时候就可以使用 if标签

if 标签和trim标签:

trim标签需要搭配一些属性使用,如下:
prefix:表示整个语句块,以prefix的值作为前缀
suffix:表示整个语句块,以suffix的值作为后缀
prefixOverrides:表示整个语句块要去除掉的前缀
suffixOverrides:表示整个语句块要去除掉的后缀


插入sql演示:INSERT INTO user_info (username, password,gender, age)values()

<insert id="insertUser3">INSERT INTO user_info<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">username,</if><if test="password != null">`password`,</if><if test="gender != null">gender,</if><if test="age != null">age</if></trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=","><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="gender != null">#{gender},</if><if test="age != null">#{age}</if></trim></insert>

where标签:

当有业务需要写条件时一定需要where条件筛选:
比如:SELECT * FROM user_info WHERE phone = ? and delete_flag = ?


方法一:直接拼不使用where

SELECT * FROM user_info WHERE<if test="phone != null">phone = #{phone}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if>

方法二:也是拼接,这里不用去掉两个and

SELECT * FROM user_info where 1= 1<if test="phone != null">and phone = #{phone}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if>

方法三:使用where标签:

SELECT * FROM user_info <where><if test="phone != null">and phone = #{phone}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if></where>

where标签总结:
1.当where标签内没有内容时,会自己去除where关键字
2.当where标签内有条件时,会添加where关键字,还会去除前面的“and”

Set标签:

当需要根据传入的用户对象属性来更新用户数据,可以使用set标签来指定动态内容


要实现:UPDATE user_info SET gender = ?, password = ?, age = ? WHERE id = ?

<update id="updateByConfition">UPDATE user_info<set><if test="gender != null">gender = #{gender},</if><if test="password != null">password = #{password},</if><if test="age != null">age = #{age},</if></set>WHERE id = #{id}</update>

Foreach标签:

有时会使用到 in关键来指定集合可以使用这个标签
在这里插入图片描述


** 例如:DELETE FROM user_info WHERE id in ( ? , ? )**
在这里插入图片描述

 <delete id="batchDelete">DELETE FROM user_info WHERE id in<foreach collection="ids" open="(" close=")" separator="," item="id">#{id}</foreach></delete>

当每个元素是一个对象,要插入多个:INSERT INTO user_info(username,password,age) VALUES (?,?,?) , (?,?,?)
这里是引用

 <insert id="insertUser4">INSERT INTO user_info(username,`password`,age) VALUES<foreach collection="userInfos" item="userInfo" separator=",">(#{userInfo.username},#{userInfo.password},#{userInfo.age})</foreach></insert>

http://www.ppmy.cn/ops/166235.html

相关文章

FPGA前端设计适合哪些人学?该怎么学?

FPGA前端设计是一个具有挑战性且薪资待遇优渥的岗位&#xff0c;主要涉及FPGA芯片定义、逻辑结构设计。这个职位要求相关专业的本科及以上学历&#xff0c;并且需要掌握一定的专业技能。工作内容从IP级设计到全芯片&#xff08;SoC&#xff09;设计&#xff0c;涉及多个设计层级…

iOS应用程序开发(图片处理器)

续上篇 iOS 编程开发图片浏览器&#xff0c;继续实现一个图标生成功能。 功能。 操作系统平台&#xff1a;MacBook(macOS) IDE:xcode 编程语言&#xff1a;Objective-c 以下是小程序在 iPhone 模拟器中的运行视频。也可以在 iPad 模拟器中运行。 效果图如下所示&#xff1a…

Linux find 命令完全指南

find 是 Linux 系统最强大的文件搜索工具&#xff0c;支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法&#xff0c;涵盖高效搜索、文件管理及高级技巧&#xff1a; 一、基础搜索模式 1. 按文件名搜索&#xff08;精确/模糊匹配&#xff09; <BASH> f…

洛谷 P1725 琪露诺 单调队列优化的线性dp

以上是题目 考虑到2e5的数据范围&#xff0c;暴力的先枚举i&#xff0c;在枚举走的步数区间j&#xff0c;是过不了的&#xff0c; 我们可以看出对于每一个i&#xff0c;只需要找出能走的i的区间的dp最大值即可&#xff0c;求区间最大值可以使用单调队列&#xff0c;时间复杂度…

江科大51单片机笔记【12】AT24C02(I2C总线)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

【Linux】UDP协议与TCP协议

目录 一、端口号 &#xff08;一&#xff09;端口号划分 &#xff08;二&#xff09;端口号相关概念 二、相关指令 &#xff08;一&#xff09;pidof &#xff08;二&#xff09;netstat 三、UDP协议 &#xff08;一&#xff09;UDP协议格式 &#xff08;二&#xff09…

vue 仿deepseek前端开发一个对话界面

后端&#xff1a;调用deepseek的api&#xff0c;所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…

便捷搞定计算机名、IP 与 Mac 地址修改及网卡问题的软件

今天要给大家推荐一款超实用的小软件——“IPtool”。别看它体积小巧&#xff0c;还不到 1M&#xff0c;而且是绿色单文件版&#xff0c;无需复杂安装&#xff0c;使用起来却相当给力&#xff0c;能帮我们轻松搞定一些日常网络设置中的小麻烦。 在修改 IP 地址这件事上&#xf…