MyBatis(学习记录)

一、ORM

ORM是"对象关系映射"(Object-Relational Mapping)的缩写。这是一种编程技术,用于将对象模型与关系型数据库系统之间的数据进行转换。在面向对象的编程语言中,数据通常以对象的形式表示;而在关系型数据库中,数据则以表格的形式存储。

二、配置数据源

XML 复制代码
spring:
  #配置mybatis的数据源 DataSource
    datasource:
      username: root
      password: 429619
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/easydata

mybatis:
  mapper-locations: classpath:mapper/*.xml

logging:
  level:
    com.easy.dao: debug

1.配置了MyBatis的数据源(DataSource),包括用户名、密码、驱动类名和数据库连接URL。

2.指定了MyBatis的mapper文件路径,使用通配符*.xml表示所有以xml结尾的文件。

3.设置了日志级别,将com.easy.dao包下的日志输出级别设为debug,以便在调试时输出更多详细信息。

三、$#的区别

$ 符号:

文本替换:

当你在XML映射文件中使用 $ 符号时,MyBatis会将它后面的表达式直接替换成对应的值。这种方式类似于简单的字符串替换。

如果 username 的值是 'admin' OR '1'='1,那么最终的SQL语句将会是:

sql 复制代码
SELECT * FROM user WHERE username = 'admin' OR '1'='1'

# 符号

预编译参数:

当使用 # 符号时,MyBatis会将它后面的表达式作为预编译语句(PreparedStatement)的参数。这种方式更加安全,因为它会自动处理SQL注入的问题。

将SQL语句的语义确定,之后无论传递任何参数都不会改变SQL语句语义,可以有效防止SQL注入 也可以加快批处理的效率

类型转换:

如果 username 是一个字符串 "admin",那么最终的SQL语句将会是:、

sql 复制代码
SELECT * FROM user WHERE username = ?

四、增删改

1. 创建数据模型类 (Staff.java)

首先,我们创建一个数据模型类,也就是实体类Staff,它对应数据库中的Staff表。

java 复制代码
package com.easy.bean;

import java.math.BigDecimal;

public class Staff {
    private int id;
    private String code;
    private String name;
    private BigDecimal salary;
    private String username;
    private String userpass;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getSalary() {
        return salary;
    }

    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUserpass() {
        return userpass;
    }

    public void setUserpass(String userpass) {
        this.userpass = userpass;
    }
}

2. 创建数据访问对象接口 (IStaffDao.java)

接着,我们创建一个DAO接口IStaffDao,它定义了对Staff表的操作方法。

java 复制代码
package com.easy.dao;

import com.easy.bean.Staff;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface IStaffDao {

    String getNow();
//    操作数据的行数
    int addStaff(Staff staff);
    int delStaff(int id);
    int editStaff(Staff staff);
}

3. 编写Mapper文件 (Staff_Mapper.xml)

然后,我们创建对应的Mapper 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.easy.dao.IStaffDao">
<!--    在这里写SQL语句-->
    <select id="getNow" resultType="string">
      select now()
    </select>
<!--    预编译# 将SQL语句的语义确定,之后无论传递任何参数都不会改变SQL语句语义,可以有效防止SQL注入
也可以加快批处理的效率-->
    <insert id="addStaff">
        insert into staff(code,name,salary,username,userpass)
        value(#{code},#{name},#{salary},#{username},#{userpass})
    </insert>
    <delete id="delStaff">
        delete from staff where id=#{id}
    </delete>
    <update id="editStaff">
        update staff set name=#{name},salary=#{salary},username=#{username},userpass=#{userpass} where id=#{id}
    </update>
</mapper>

4. 创建控制器类 (Controller) (EasyController.java)

最后,我们创建一个控制器类EasyController,用来处理HTTP请求,并通过注入IStaffDao来完成实际的数据操作。

java 复制代码
package com.easy.controller;

import com.easy.bean.Staff;
import com.easy.dao.IStaffDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;

@RestController
public class EasyController {
    @Autowired
    IStaffDao dao;
    @GetMapping("now")
    public String now(){
        return dao.getNow();
    }
    @PostMapping("staff")
    public String addStaff(Staff staff){
//        Staff staff=new Staff();
//        staff.setCode("10001");
//        staff.setName("何容与");
//        staff.setSalary(new BigDecimal(10000));
//        staff.setUsername("hry");
//        staff.setUserpass("123456");
        dao.addStaff(staff);
        return "添加成功";
    }
    @DeleteMapping("staff/{id}")
    public String delStaff(@PathVariable int id){
        dao.delStaff(id);
        return "删除成功";
    }
    @PutMapping("staff")
    public String editStaff(Staff staff){
        dao.editStaff(staff);
        return "修改成功";
    }
}
相关推荐
honey ball29 分钟前
EMC内参二(1-33页)学习【技术进阶】
开发语言·单片机·嵌入式硬件·学习
阿巴阿巴拉1 小时前
Scala相关知识学习总结5
开发语言·学习·scala
丶Darling.1 小时前
深度学习与神经网络 | 邱锡鹏 | 第四章学习笔记 神经网络
深度学习·神经网络·学习
气π3 小时前
【Vue-组件】学习笔记
vue.js·笔记·学习
技术小白Byteman4 小时前
蓝桥刷题note13(排序)
开发语言·数据结构·c++·学习·算法·visualstudio
小郝 小郝4 小时前
【C语言】内存函数 (续)
c语言·开发语言·学习
Acxymy5 小时前
MySQL学习笔记四
笔记·学习
无所谓จุ๊บ5 小时前
VTK知识学习(51)- 交互与Widget(二)
学习·vtk
kovlistudio5 小时前
红宝书第三十一讲:通俗易懂的包管理器指南:npm 与 Yarn
开发语言·前端·javascript·学习·npm·node.js
Direct_Yang6 小时前
计算机网络学习前言
学习·计算机网络