Java学习之MyBatis

什么是Mybatis?

        数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中数据模型的统称。例如,文件的存储、数据的读取以及对数据表的增删改查等都是数据持久化操作

        MyBatis支持定制化SQL、存储过程以及高级映射,可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现。其封装低于Hibernate,但性能优秀、小巧、简单易学、应用广泛。

(ORM(Object Relational Mapping)对象关系映射

        是一种数据持久化技术,它在对象模型和关系型数据库之间建立起对应关系、并且提供了一种机制,通过JavaBean对象去操作数据库表中的数据)

        MyBatis前身为iBatis,2002年由ClintonBegin发布。2010年从Apache迁移到Google,并改名为MyBatis,2013年又迁徙到了Github。

        MyBatis的主要思想是将程序中的大量SQL语句剥离出来,使用XML文件或注解的方式实现SQL的灵活配置,将SQL语句与程序代码分离,在不修改程序代码的情况下,直接在配置文件中修改SQL语句。

        MyBatis与其他持久性框架最大的不同是,MyBatis强调使用SQL,而其他框架(例如Hibernate)通常使用自定义查询语言,即HQL(Hibernate查询语言)或EJB QL(Enterprise JavaBeans查询语言)

搭建MyBatis

添加Maven依赖

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>

在项目的resource的文件夹下创建application.yml,配置mybatis数据源

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

 创建启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EasySpringCApplication {
    public static void main(String[] args) {
        SpringApplication.run(EasySpringCApplication.class,args);
    }
}

如果启动项目成功,则搭建成功

实现增删改查

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

        在 Spring Boot 配置文件(如 application.properties 或 application.yml)中,mybatis.mapper-locations 设置指定了 MyBatis 映射器(Mapper)XML 文件的位置。这些 XML 文件包含了 SQL 映射语句,通常用于定义 SQL 查询、插入、更新和删除操作。这个配置项告诉 MyBatis 在哪里查找这些映射文件。

具体来说,mybatis.mapper-locations=classpath:mapper/*.xml 这段代码的含义如下:

  • classpath::表示 MyBatis 应该在 Java 类路径(classpath)上搜索映射文件。类路径是 Java 应用程序在运行时查找类文件和资源的位置集合。

  • mapper/:是放置 MyBatis 映射器 XML 文件的目录。这个目录通常位于项目的资源(resources)目录下。例如,在 Maven 或 Gradle 项目中,它通常位于 src/main/resources/mapper。

  • *.xml:是一个通配符,表示 MyBatis 应该加载 mapper 目录下的所有 .xml 文件。每个 XML 文件通常对应于一个映射器接口(Mapper Interface),其中包含了 SQL 语句和对应的方法。

        这种配置方式使得 MyBatis 可以自动找到并加载这些映射文件,进而将 XML 文件中定义的 SQL 语句关联到对应的映射器接口。这样,当在应用程序中调用映射器接口的方法时,MyBatis 会执行相应的 SQL 语句。

在resource目录下新建mapper文件夹,在mapper文件夹中创建.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.IDepartmentDao">
    <insert id="addDepartment">
        insert into department(code,name)
        value(#{code},#{name})
    </insert>
    <insert id="delDepartment">
        delete from department where id=#{id}
    </insert>
    <update id="editDepartment">
        update department set code=#{code},name=#{name} where id=#{id}
    </update>
    <select id="findDepartment" parameterType="java.lang.Integer" resultType="com.easy.bean.Department">
        select * from department where id=#{id}
    </select>
</mapper>

创建bean类

public class Department {
    private int id;
    private String code;
    private String name;

    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;
    }

    @Override
    public String toString() {
        return "Department{" +
                "id=" + id +
                ", code='" + code + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

创建Mapper接口IStaff

        @Mapper注解是由Mybatis框架中定义的一个描述数据层接口的注解,注解往往起到的都是一个描述性作用,用于告诉Spring框架此接口的实现类由Mybatis负责创建,并将其实现类对象存储到spring容器中。

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

@Mapper
public interface IDepartmentDao {
    int addDepartment(Department department);
    int delDepartment(int id);
    int editDepartment(Department department);
    Department findDepartment(int id);
}

 在控制类中注入接口类,调用Mybatis实现的方法

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

@RestController
public class EasyController {
    @Autowired
    IDepartmentDao dao1;
    @PostMapping("department")
    public String addDepartment(Department department) {
        dao1.addDepartment(department);
        return "success";
    }
    @DeleteMapping("department/{id}")
    public String deleteDepartment(@PathVariable int id) {
        dao1.delDepartment(id);
        return "success";
    }
    @PutMapping("department")
    public String editDepartment(Department department) {
        dao1.editDepartment(department);
        return "success";
    }
    @GetMapping("department/{id}")
    public String findDepartment(@PathVariable int id) {
        return dao1.findDepartment(id).toString();
    }
}

预编译(#) 参数拼接($)

SQL语句执行分为两个过程:1.编译  2.执行指令

在mybatis中,#和$分别代表预编译参数和字符串拼接。它们在处理SQL语句中的参数时有着不同的行为

预编译(#) 

1、作用:#用于表示预编译参数,它可以防止SQL注入攻击。当使用#时,MyBatis会将参数值进行转义处理,确保参数值不会被当作SQL代码执行。

2、语法:在SQL语句中,使用#{}包围参数名称,如:SELECT * FROM users WHERE id = #{id}。

3.示例

<select id="getUser" parameterType="int" resultType="com.example.User">
    SELECT * FROM users WHERE id = #{id}
</select>

4、特点:使用#可以确保SQL代码的安全性,防止sql注入和加快批处理的效率,但可能会影响性能。因为预编译参数需要对每个参数值进行转义处理,所以在处理大量参数时可能会导致性能下降。

参数拼接($)

1、作用:用于表示字符串拼接,它可以将参数值直接插入到sql语句中。当使用用于表示字符串拼接,它可以将参数值直接插入到SQL语句中。当使用时,MyBatis不会对参数值进行转义处理,因此需要注意防止SQL注入攻击。

2、语法:在SQL语句中,使用包围参数名称,如:SELECT * FROM users WHERE name = ${name}。

3.示例

<select id="getUser" parameterType="string" resultType="com.example.User">
    SELECT * FROM users WHERE name = ${name}
</select>

4、特点:使用$可以直接将参数值插入到SQL语句中,可以提高性能。但由于没有进行转义处理,需要注意防止SQL注入攻击。在使用时,应确保参数值是可信的,或对参数值进行手动转义处理。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值