Mybatis 详解

admin2024-04-03  0

Mybatis作用

简化dao层开发,通过简单的XML或注解来配置和映射原生信息,从而避免了许多繁琐的JDBC代码和手动设置参数以及获取结果集。 上手还快

使用

1.导入依赖

使用spring容器管理mybatis的话 我们需要导入springframe依赖和mybatis依赖 后续的根据需求自行添加

<dependencies>
  <!-- mybatis依赖 -->
  <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
  </dependency>

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

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

2.书写对应的接口

实体类准备
package com.ssmLearn.pojo;

import lombok.Data;

/**
 * @Title: Employee
 * @Author 小菜蛋
 * @Date 2024-03-03 19:34
 * @description: 员工类
 */
@Data
public class Employee {
    private int empId;
    private double empSalary;
    private String empName;
}
接口准备
package com.ssmLearn.mapper;

import com.ssmLearn.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @Title: EmpMapper
 * @Author 小菜蛋
 * @Date 2024-03-03 19:34
 * @description: 员工操作接口
 */
public interface EmpMapper {
    public List<Employee> queryAll();
}
配置文件准备
Myabtis配置文件
<?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>
Mapper映射文件
<?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">
<mapper namespace="com.ssmLearn.mapper.EmpMapper">

    <select id="queryAll" resultType="com.ssmLearn.pojo.Employee">
        select emp_id empId,emp_name empName ,emp_salary empSalary from t_emp;
    </select>
</mapper>

注意映射文件要和mapper接口文件保持目录一致
Mybatis 详解,在这里插入图片描述,第1张

测试类

import com.ssmLearn.mapper.EmpMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.Test;

import java.io.IOException;

/**
 * @Title: TestMybatis
 * @Author 小菜蛋
 * @Date 2024-03-03 19:39
 * @description: 测试mybatis的操作是否成功
 */
public class TestMybatis {

    @Test
    public void testQueryAll() throws IOException {
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis-config.xml")).openSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        System.out.println(empMapper.queryAll());
    }
}

SQL传参地不同

参数传递有两种形式一种时#{参数}一种时${参数} 其中#{参数}这种方式会更加安全,使用#参数传递地形式地话 会在sql语句中在参数地位置生成占位符,可以有效地防止sql注入。
使用方法
举例使用

<delete id="方法名" >
	delete from table_name where id = #{id}
</delete>

规范1.mapper层不允许对方法进行重载 我们需要知道的是mapper层的Java代码是通过xml文件映射实现的具体功能,其中xml文件映射对应功能的时候是按照方法名进行对应的,那么当进行方法的重载的时候会出现无法匹配现象这是不允许的。

mapper如何接受不同类型的参数传递

1.单个简单类型的传递 (基本类型的数据传递)

直接将参数名填写到对应的sql语句位置即可

2.实体类型的参数传递

实体类型的参数传递的时候当我们需要使用到某一属性的时候 我们可以直接在sql语句中使用这个属性 ,只需要按照Java的实体类中的属性名称进行填写即可使用该属性的内容
例如:

public class Dog{
	private int idDog;
	private String nameDog;
	private int ageDog;
}

当我需要根据狗的id进行更新操作的时候使用mybati操作编写xml映射文件 然后编写对应的sql语句

<update>
update table_name set name = #{nameDog},age=#{ageDog} where id = #{idDog}
</update>

3.零散简单数据类型

当使用的mapper接口中有两个或以上的参数的时候,我们可以直接使用#{参数}的形式进行参数的传递,当使用的参数姓名和数据的字段名不同时,我们可以使用注解@Param修改注解中的属性value进行起别名的形式,或者时使用数据库sql语句中对数据库中的字段名起别名使得形式保持一致

4.传入map形式的参数类型

比如说Map<String,int> parge ,当我们想要使用参数的时候 只需要直接填写对应的键即可使用这个参数中的值
注意注解@Param的使用 该注解可以对传入mapper层接口中的参数在xml文件映射的时候做到对应 即@Param(“name”) String Username
编写xml文件的时候就只可以使用name进行参数的传递

返回值类型

返回值的填写是在标签中的resultType中进行填写这个内容的 一般是使用

1.普通类型的返回值

直接填写对应的类型 比如说String类型的数据,使用mybatis书写的时候使用返回的话 可以直接指定resultType = “string”,Mybatis 内部给常用的数据类型设定了很多别名。 以 int 类型为例,可以写的名称有:int、integer、Integer、java.lang.Integer、Int、INT、INTEGER 等等。

2.实体类对象的返回

实体类型的数据进行返回的时候需要指定返回类型的全类名的引用路径,或者是在xml配置文件中使用别名的形式进行替换。

3.集合类型的数据返回

集合类型的数据进行返回的时候只需要直接将集合中的引用类型的全类名填写到resultType的位置即可,不需要额外添加其他内容。

4.返回主键值

应用场景:当我们的网站中需要进行数据库操作 向数据库中添加一个用户的时候,添加成功之后我们需要将这个用户的信息返回到前端时,我们需要根据用户的id进行sql查询 ,将查询成功后的用户类传递到前端。此时我们可以使用主键返回,利用插入之后返回的主键来搜索这个刚插入的用户的信息

主键回显

主键回显 就是得到插入数据库中的信息在数据库中的主键值,这个一般根据数据表的创建进行设置是那种类型的增加
使用方式
需要在xml映射文件对应的标签上加入属性 userGenerateKeys = “true” 这个意味着使用数据库的自增长类型的主键,KeyColumn = “需要返回的内容在数据库中的字段名、列名” KeyProperty = “对应返回主键在Java实体类中的属性名”
当添加这三个属性之后我们就可以在Java代码中使用主键返回的内容了
例如:

public voide demo(){
	int row = mapper.insert(user);
	//直接返回即可 row就是需要的内容
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!