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("张三"));
    }

运行结果

打算用下篇说明
相关推荐
浮游本尊19 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥2 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧3 小时前
Spring Secutiy基本原理及工作流程
java
Java水解4 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆6 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole6 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊6 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端