java-Spring-(MyBatis框架-xml管理)

目录

前置条件

xml与注解比较

[1.1 xml定义](#1.1 xml定义)

[1.2 和SQL注解比较](#1.2 和SQL注解比较)

建包准备

插入数据

[​编辑 更新数据](#编辑 更新数据)

删除数据

查询数据

查看单字段查询


🏷💣前置条件

创建一个spring boot 初始化的项目

🏷💣xml与注解比较

1.1 xml定义

XML是一种可扩展性语言,用户可以自己定义标签,用来描述特定类型的数据;

XML的语法严格,每个标签都必须有一个结束标签,标签的嵌套关系也必须合法;

1.2 和SQL注解比较
  • xml配置SQL,可以将SQL语句和JAVA代码分离开

  • xml配置SQL,支持动态SQL语句

  • xml配置SQL,支持SQL语句的复用

xml是属于外部文件属性,所以需要在application.properties中添加配置

这边新建mappers的包用于装xml文件

这边需要引入一个xml模版

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="指定的@Mapper映射的接口的具体路径">

</mapper>

💣建包准备

一个实体类包 这边是 pojo.entity包

数据库的字段名 User实体类对应的属性
id private Long id
username private String username
password private String password
nickname private String nickname
created private Date created
[实体类的属性]

一个**@Mapper映射接口的包**mapper包

一个VO类包(返回数据库查询字段值的属性) pojo.vo包

📢流程

定义接口方法 ->编写xml 文档->测试

我们先写一个UserMapper映射的接口

1.注意必须加@Mapper否则会找不到对应的bean对象

2.这时候不需要加相关的sql注解

java 复制代码
package cn.tedu.demoforcsdn.mappers;

import cn.tedu.demoforcsdn.pojo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
    //插入数据
    int  insertUser(User user);
}

编写xml文档

复制完整路径 快捷键是Ctrl+Alt+Shift+c

namespae 是**@Mapper接口的具体路径**

id 是接口方法的名称

sql 语句

语法格式 操作的意义
<insert id="接口方法">INSERT INTO 表 字段名 Values 值</insert> 插入数据
<update id="接口方法">UPDATE 表名 <set><if test="判断条件">设置语句</if></set> WHERE 字段名=值</update> 更新数据
<delete id="接口方法"> DELETE FROM 表名 WHERE 字段名=值</delete> 删除数据
<select id ="接口方法" resultType="返回的封装实体类VO">SELECT 字段名 FROM 表名 (看情况) WHERE 字段名=值</select> 查询数据
[xml 语法格式]

✈🚀插入数据

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="cn.tedu.demoforcsdn.mappers.UserMapper">
    <insert id="insertUser">
        INSERT INTO  user (username,password,nickname,created) VALUES (#{username},#{password},#{nickname},#{created})
    </insert>

</mapper>

这边在去Test进行测试(上次将mybatis基础知识点讲过测试类测试 写文章-CSDN创作中心)

java 复制代码
package cn.tedu.demoforcsdn;

import cn.tedu.demoforcsdn.mappers.UserMapper;
import cn.tedu.demoforcsdn.pojo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

@SpringBootTest
class DemoForCsdnApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
    }
    @Test
    void insertUser(){
        User user = new User();
        user.setUsername("赵四");
        user.setPassword("123456");
        user.setNickname("老四");
        user.setCreated(new Date());
        System.out.println(userMapper.insertUser(user));


    }

测试结果

数据库结果

✈🚀 更新数据

接口方法

java 复制代码
int updateUserByUsername(UserUpdateVO userUpdateVO);

这边我只需要返回 nickname,username,password

这边我定义了一个vo类用于接受数据库的返回值

数据库的字段名 userUpdateVo类的属性值
username private String username
password private String password
nickname private String nickname

xml 编写

引入新的概念

<set> 标签

<set> 标签用于包裹 UPDATE 语句的 SET 部分,并自动处理字段间的逗号分隔。如果在动态生成的 SQL 语句中最后一个 <if> 条件不满足,那么 <set> 标签会自动移除最后一个多余的逗号,这可以避免 SQL 语法错误。

注意处理多字段必须以逗号分割,必须写WHERE

<if> 标签

<if> 标签用于条件判断。它根据 test 属性的值来决定是否包含其内部的 SQL 片段。如果 test 属性的值为 true,则包含该 SQL 片段;如果为 false,则忽略该片段。

XML 复制代码
<update id="updateUserByUsername">
        UPDATE  user
        <set>
            <if test="password!=null">password=#{password},</if>
            <if test="nickname!=null">nickname=#{nickname}</if>
        </set>
        WHERE username =#{username};
    </update>

测试

java 复制代码
@Test
    void updateUser(){
        UserUpdateVO userUpdateVO = new UserUpdateVO();
        userUpdateVO.setUsername("赵四");
        userUpdateVO.setPassword("abcdf");
        userUpdateVO.setNickname("扛把子");
        System.out.println(userMapper.updateUserByUsername(userUpdateVO));


    }

运行结果

数据库状态

✈🚀删除数据

接口方法

java 复制代码
 int deleteUserByUsername(String username);

xml

XML 复制代码
<delete id="deleteUserByUsername">
        DELETE FROM user WHERE username=#{username}
    </delete>

测试

java 复制代码
@Test
    void deleteUserByUsername(){
        System.out.println(userMapper.deleteUserByUsername("赵四"));
    }

运行结果

✈🚀查询数据

🚏查看单字段查询

接口方法

java 复制代码
  UserUpdateVO selectByUsername(String username);

xml

resultType

resultType 的主要作用是将 SQL 查询结果集中的每一行数据映射到指定的 Java 类型对象上。当 MyBatis 执行查询操作并获取到结果集后,它会根据 resultType 指定的类型,自动将结果集中的每一行数据转换(或映射)为相应的 Java 对象。

注意:写<select> sql语句会返回结果集,我们需要接受结果集 常用resultType接受

resultType填写的是结果集,我这边返回的是个封装的数据库返回的实体类,其包括 password,nickname,username

XML 复制代码
<select id="selectByUsername" resultType="cn.tedu.demoforcsdn.pojo.vo.UserUpdateVO">
        SELECT password,nickname,username FROM user WHERE username=#{username}
    </select>

测试

java 复制代码
 @Test
    void  selectUserByUsername(){
        System.out.println(userMapper.selectByUsername("张三"));
    }

运行结果

打算用下篇说明
相关推荐
憨子周27 分钟前
2M的带宽怎么怎么设置tcp滑动窗口以及连接池
java·网络·网络协议·tcp/ip
霖雨2 小时前
使用Visual Studio Code 快速新建Net项目
java·ide·windows·vscode·编辑器
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
Fiercezm2 小时前
JUC学习
java
无尽的大道3 小时前
Java 泛型详解:参数化类型的强大之处
java·开发语言
ZIM学编程3 小时前
Java基础Day-Sixteen
java·开发语言·windows
我不是星海3 小时前
1.集合体系补充(1)
java·数据结构
P.H. Infinity3 小时前
【RabbitMQ】07-业务幂等处理
java·rabbitmq·java-rabbitmq
爱吃土豆的程序员3 小时前
java XMLStreamConstants.CDATA 无法识别 <![CDATA[]]>
xml·java·cdata
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端