mybatis快速入门(基于Mapper接口编程)

news2025/1/21 12:01:08

1、准备数据模型,建库建表

CREATE DATABASE `mybatis-example`;

USE `mybatis-example`;

CREATE TABLE `t_emp`(
  emp_id INT AUTO_INCREMENT,
  emp_name CHAR(100),
  emp_salary DOUBLE(10,5),
  PRIMARY KEY(emp_id)
);

INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66);
INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);

2、pom.xml(添加依赖:mysql,mybatis)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>

        <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--junit5测试-->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

3、Employee.java(pojo)

package com.atguigu.mybatis.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private Integer empId;
    private String empName;
    private Double empSalary;
}

4、EmpMapper.java

package com.atguigu.mybatis.mapper;
import com.atguigu.mybatis.pojo.Employee;
import java.util.List;
public interface EmpMapper {

    List<Employee> getEmployeeList();

    Employee getEmployeeById(Integer empId);
}

5、mybatis-config.xml(mybatis的总配置文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
    <environments default="development">
        <!-- environment表示配置Mybatis的一个具体的环境 -->
        <environment id="development">
            <!-- Mybatis的内置的事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 配置数据源 -->
            <dataSource type="POOLED">
                <!-- 建立数据库连接的具体信息 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
        <!-- mapper标签:配置一个具体的Mapper映射文件 -->
        <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
        <!--    对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
        <mapper resource="mapper/EmpMapper.xml"/>
    </mappers>

</configuration>

6、EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace等于mapper接口类的全限定名,这样实现对应 -->
<mapper namespace="com.atguigu.mybatis.mapper.EmpMapper">

    <!-- 查询使用 select标签
            id = 方法名
            resultType = 返回值类型
            标签内编写SQL语句
     -->
    <select id="getEmployeeList" resultType="com.atguigu.mybatis.pojo.Employee">
        <!-- #{empId}代表动态传入的参数,并且进行赋值!后面详细讲解 -->
        select
        emp_id empId,
        emp_name empName,
        emp_salary empSalary
        from t_emp
    </select>
    <select id="getEmployeeById" resultType="com.atguigu.mybatis.pojo.Employee">
        select
        emp_id empId,
        emp_name empName,
        emp_salary empSalary
        from t_emp
        where emp_id = #{value}
    </select>
</mapper>

7、MybatisTest.java

package com.atguigu.mybatis;
import com.atguigu.mybatis.mapper.EmpMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class MybatisTest {

    SqlSessionFactory sqlSessionFactory;
    SqlSession sqlSession;
    EmpMapper empMapper;

    @BeforeEach
    public void setup() throws IOException {
        // 获取资源流,读取"mybatis-config.xml"文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        // 使用资源流创建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 使用SqlSessionFactory打开一个Session
        sqlSession = sqlSessionFactory.openSession();
        // 使用Session获取EmpMapper的Mapper对象
        empMapper = sqlSession.getMapper(EmpMapper.class);
    }


    // 在每个测试用例之后执行的清理方法
    @AfterEach
    public void teardown() {
        sqlSession.close();  // 关闭SqlSession
    }


    @Test
    public void getEmployeeListTest() {
        empMapper.getEmployeeList().forEach(System.out::println);
    }
    //Employee(empId=1, empName=tom, empSalary=200.33)
    //Employee(empId=2, empName=jerry, empSalary=666.66)
    //Employee(empId=3, empName=andy, empSalary=777.77)

    @Test
    public void getEmployeeByIdTest() throws IOException {
        System.out.println(empMapper.getEmployeeById(1));
        //Employee(empId=1, empName=tom, empSalary=200.33)
    }
}

 8、#{value}

      在MyBatis中,#{value}是一种预编译的参数占位符,用于在SQL语句中插入参数值。它能够防止SQL注入攻击,提高SQL语句的安全性。当使用#{value}作为参数占位符时,MyBatis会将参数值直接插入到SQL语句中,并在执行时进行数据类型转换和字符转义处理。这种预编译的参数占位符可以有效地提高SQL语句的性能和安全性。

     在MyBatis中,#{value}是一种预编译的参数占位符,用于在SQL语句中插入参数值。它能够防止SQL注入攻击,提高SQL语句的安全性。

     当使用#{value}作为参数占位符时,MyBatis会将参数值直接替换到SQL语句中,并在执行时进行数据类型转换和字符转义处理。这样可以确保SQL语句的正确性和安全性,避免了手动拼接SQL语句的麻烦和潜在的安全风险。

     需要注意的是,#{value}只适用于参数值是安全的情况下,如果参数值来自不可信的来源,应该使用其他安全措施来防止SQL注入攻击。

在MyBatis中,#{value}主要有以下作用:

  1. 参数占位符:#{value}用作SQL语句中的参数占位符,表示一个参数值的位置。在执行SQL语句时,MyBatis会将该占位符替换为实际的参数值。
  2. 防止SQL注入:使用#{value}可以有效地防止SQL注入攻击。MyBatis会对参数值进行预编译处理,确保参数值在SQL语句中的正确性和安全性。这样可以避免恶意用户通过拼接SQL语句来执行恶意操作。
  3. 自动类型转换:MyBatis会根据参数值的类型自动进行类型转换。无论参数值是Java的基本类型、包装类型还是其他自定义类型,MyBatis都能够正确处理并将其转换为SQL语句中对应的数据类型。
  4. 简化参数处理:使用#{value}可以简化参数的处理过程。开发者只需要关注SQL语句的编写,而不需要手动拼接参数值或处理参数值的转义问题。MyBatis会自动处理这些细节,提高了开发效率和代码的可读性。

综上所述,#{value}在MyBatis中起到了参数占位符、防止SQL注入、自动类型转换和简化参数处理的作用,提高了SQL语句的安全性和开发效率。

在MyBatis中,预编译占位符有三种,分别是:

  1. #{value}:这是最常用的预编译占位符,用于插入参数值,可以防止SQL注入攻击。
  2. ${value}:这是非预编译占位符,直接将参数值插入到SQL语句中,需要注意避免SQL注入攻击。
  3. #{}:这是参数占位符,用于插入参数值,但不会进行预编译处理,因此不能防止SQL注入攻击。

需要注意的是,在MyBatis中,使用#{value}是最安全和推荐的方式,因为它可以有效地防止SQL注入攻击,提高SQL语句的安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1268819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第20章:多线程

20.1 线程简介 在Java中&#xff0c;并发机制非常重要&#xff0c;程序员可以在程序中执行多个线程&#xff0c;每个线程完成一个功能&#xff0c;并与其他线程并发执行&#xff0c;这种机制被称为多线程。但是&#xff0c;并不是所有编程语言都支持多线程。 线程的特点&#…

GC算法和常见垃圾回收器

一、GC算法 GC Algorithms(常见的垃圾回收算法)&#xff0c;找到这个垃圾之后怎么进行清除的算法 。GC常用的算法有三 种如下&#xff1a; 1&#xff1a;Copying(拷贝) 2&#xff1a;Mark-Sweep(标记清除) 3&#xff1a;Mark-Compact(标记压缩) 第一个是Copying&#xff08;拷…

Linux常用命令----cp 命令

文章目录 1. 基本用法2. 保留文件属性3. 递归复制4. 仅复制更新的文件5. 交互式复制6. 创建符号链接而非复制7. 复制并备份目标文件8. 指定备份后缀9. 详细输出总结 Linux操作系统中&#xff0c;cp 命令是一个非常基础且强大的工具&#xff0c;用于复制文件或目录。本文将详细介…

C语言进阶指南(16)(自定义数据类型——结构体)

欢迎来到博主的专栏——C语言进阶指南 博主id&#xff1a;reverie.ly 文章目录 结构体类型结构体类型的声明结构体变量的声明 结构体变量的初始化结构体变量结构体变量的赋值结构体变量的成员结构体变量的使用结构体变量的内存存储 前面使用的变量都是简单类型的变量&#xff0…

赴日开发做什么?日本签证很难拿?

日本的IT行业历史比较悠久&#xff0c;业务以上层前端业务为主&#xff0c;如设计和构建软件。日本IT公司组织庞大&#xff0c;行业内部有着严格的分工和部署&#xff0c;工作会被细分化。分配给个人的工作量不会太大&#xff0c;难度也不会很高。 在日本IT公司就业&#xff0…

XUbuntu22.04之隐藏顶部任务栏(一百九十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java常见CodeReview及编码规范

鉴于自己的开发经验,以及常见容易产生bug及性能问题的点做个记录. 1.数据库 如果开发人员的经验不足,Java通过ORM(Mybatis)对数据库的操作的性能问题比较隐蔽.因为不压测或者异常case没发生的时候一般发现不了问题.特别是异常case发生的时候. 除配置表以外的sql都要经过expl…

悠络客荣获“供应链服务之星”“供应链服务之星最佳人气奖”两项殊荣

11月28日&#xff0c;由AC汽车主办的第八届汽车后市场连锁百强&TOP品牌颁奖典礼在上海盛大举行。超300家企业欢聚一堂&#xff0c;共同见证一年一度的荣耀时刻&#xff01; 经过线上征集、评选组提名、网络投票和专家评审等多轮评选&#xff0c;悠络客在全国众多参赛品牌中…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

二叉树(判断是否为对称二叉树)

题目&#xff08;力扣&#xff09;&#xff1a; 观察题目&#xff0c;只需判断该二叉树是否对称。 判断二叉树是否对称&#xff0c;就可以换位去判断该二叉树的左子树和右子树是否对称。 这时就可以写一个辅助函数来方便判断。 该函数是判断两颗树是否镜像对称&#xff0c;这…

分布式文件系统之HDFS

前言 一、HDFS简介 1.1 HDFS产出背景及定义 1&#xff09;HDFS产生背景 先给大家介绍一下什么叫HDFS&#xff0c;我们生活在信息爆炸的时代&#xff0c;随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&a…

C++中用于动态内存的new和delete操作符

文章目录 1、动态分配内存的应用2、动态分配内存与分配给普通变量的内存有什么不同?3、C 中如何分配/释放内存4、new 操作符4.1 使用new的语法4.2 初始化内存4.3 分配内存块4.4 普通数组声明 Vs 使用new4.5 如果运行时没有足够内存可用怎么办&#xff1f; 5、delete 操作符 C/…

【知识】简单理解为何GCN层数越多越能覆盖多跳邻居聚合信息范围更广

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 大多数博客在介绍GCN层数时候&#xff0c;都会提到如下几点(经总结)&#xff1a; 在第一层&#xff0c;节点聚合来自其直接邻居的信息。在第二层&#xff0c;由于每个节点现在包含了其直接邻居的信息&a…

flink源码分析之功能组件(四)-slotpool组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现&#xff1a; 前提须知&#xff1a; 前序&#xff1a; 中序&#xff1a; 后序&#xff1a; 链式二叉树的构建&#xff1a; 定义结构体&#xff1a; 初始化&#xff1a; 构建左右子树的指针指向&#xff1a; 前序遍历的实现&#xff1a; 中序…

J-Flash工具的使用---擦除、烧录及校验

文章目录 前言一、打开J-Flash工具二、使用步骤1.创建工程&#xff0c;选择MCU&#xff0c;配置端口2.打开要烧录的文件3.连接J-Link4.擦除Flash5. 烧录固件 总结 前言 不使用IDE&#xff08;如keil、Iar&#xff09;如何来烧录固件。当我们的程序需要保密&#xff0c;不需要被…

汽车悬架底盘部件自动化生产线3d检测蓝光三维测量自动化设备-CASAIM-IS(2ND)

随着汽车工业的不断发展&#xff0c;对于汽车零部件的制造质量和精度要求也在不断提高。汽车悬架底盘部件作为汽车的重要组成部分&#xff0c;其制造质量和精度直接影响到整车的性能和安全性。因此&#xff0c;采用CASAIM-IS&#xff08;2ND&#xff09;蓝光三维测量自动化设备…

滴滴也崩了!

昨日&#xff0c;据国内多家媒体报道&#xff0c;从11月27日晚上开始&#xff0c;滴滴因系统故障导致App服务异常&#xff0c;不显示定位且无法打车。 这次瘫痪事件持续了12个小时&#xff0c;根据滴滴公布的2023年第三季度财报&#xff0c;滴滴出行日均单量达到3130万单&#…

【老文新发】Otsu大津法详解及python实现

原文&#xff1a;A Threshold Selection Method from Gray-Level Histograms A Fast Algorithm for Multilevel Thresholding 前言 大津法包含两个重要的概念&#xff1a;类间方差&#xff08;between-class variance&#xff09;和类内方差&#xff08;within-class varianc…