【mybatis】基本操作:详解Spring通过注解和XML的方式来操作mybatis

mybatis 的常用配置

配置数据库连接

#驱动类名称

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#数据库连接的url

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mybatis_test

characterEncoding=utf8&useSSL=false

#连接数据库的名

spring.datasource.username=root

#连接数据库的密码

spring.datasource.password=root

打印志

#指定mybatis输出志的位置, 输出控制台

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

开启驼峰命名

mybatis:

configuration:

map-underscore-to-camel-case: true #配置驼峰动转换

MyBatis 的 XML 件配置

配置 mybatis xml 的件路径,在 resources/mapper 创建所有表的 xml 件

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

Spring 通过注解方式操作 mybatis

MyBatis 是一个强大的 Java 数据持久化框架,可通过注解简化 SQL 操作。下面将详细介绍几个常用的 MyBatis 注解及其用法,包括@Mapper@Select@Insert@Options@Delete@Update@Results@ResultMap

1. @Mapper

@Mapper注解用于标识一个接口为 MyBatis 的 Mapper 接口。该注解使 MyBatis 能够找到并生成实现类。

复制代码
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper {
    // 方法定义
}
2. @Select

@Select注解用于定义 SQL 查询。可以在接口方法上直接指定查询语句。

复制代码
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper {
    
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}
3. @Insert

@Insert注解用于执行插入操作。与@Select类似,可以在方法上直接编写插入 SQL 语句。

复制代码
import org.apache.ibatis.annotations.Insert;

@Mapper
public interface UserMapper {

    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    void insertUser(User user);
}
4. @Options

@Options注解用于配置执行 SQL 语句时的选项,比使用生成的主键值、指定更新用的 SQL 类型等。

复制代码
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;

@Mapper
public interface UserMapper {

    @Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);
}
5. @Delete

@Delete注解用于定义删除操作的 SQL 语句。

复制代码
import org.apache.ibatis.annotations.Delete;

@Mapper
public interface UserMapper {

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(int id);
}
6. @Update

@Update注解用于定义更新操作的 SQL 语句。

复制代码
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserMapper {

    @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
    void updateUser(User user);
}
7. @Results

@Results注解用于定义查询结果的映射关系。通常与@Select一起使用,可以指定将 SQL 查询结果中的列映射到对象的属性。

复制代码
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "name", column = "name"),
        @Result(property = "age", column = "age")
    })
    User getUserById(int id);
}
8. @ResultMap

@ResultMap注解可以用来引用已定义的结果集映射。它提供了一种更灵活的方式来重用映射,特别是在多个查询中使用相同的结果映射时。

复制代码
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Result;

@Mapper
public interface UserMapper {

    @Results(id = "userResultMap", value = {
        @Result(property = "id", column = "id"),
        @Result(property = "name", column = "name"),
        @Result(property = "age", column = "age")
    })
    User getUserById(int id);

    @Select("SELECT * FROM users WHERE age > #{age}")
    @ResultMap("userResultMap")
    List<User> getUsersOlderThan(int age);
}

Spring 通过XML方式操作 mybatis

使用 MyBatis 通过 XML 方式进行数据库操作是一个常见的模式。以下是通过 XML 配置 MyBatis 的基本步骤和示例,包括如何配置 MyBatis、映射 SQL 语句以及进行数据库操作的步骤。

1. 添加 MyBatis 依赖

如果你使用 Maven,可以在pom.xml中添加 MyBatis 的依赖:

复制代码
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version> <!-- 请根据需要选择版本 -->
</dependency>
2. 创建 MyBatis 配置文件

创建一个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 default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
                <property name="username" value="your_username"/>
                <property name="password" value="your_password"/>
            </dataSource>
        </environment>
    </environments>
    
    <mappers>
        <mapper resource="path/to/YourMapper.xml"/>
    </mappers>
</configuration>
3. 创建 Mapper XML 文件

创建一个 Mapper XML 文件,例如YourMapper.xml,定义 SQL 语句和对应的映射。

复制代码
<?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.example.mapper.YourMapper">

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

    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (name, age) VALUES (#{name}, #{age})
    </insert>

</mapper>
4. 创建实体类

创建一个与数据库表对应的实体类,例如User.java

复制代码
package com.example.model;

public class User {
    private int id;
    private String name;
    private int age;

    // Getters and Setters
}
5. 创建 Mapper 接口

为了使用 MyBatis 提供的方法,需要创建一个 Mapper 接口,例如YourMapper.java

复制代码
package com.example.mapper;

import com.example.model.User;
import java.util.List;

public interface YourMapper {
    User selectUserById(int id);
    void insertUser(User user);
}
6. 使用 MyBatis 进行数据库操作

在你的主程序中,使用 SqlSessionFactory 和 SqlSession 来进行数据库操作。

复制代码
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 java.io.IOException;
import java.io.Reader;

public class Main {
    public static void main(String[] args) {
        try {
            // 读取 mybatis-config.xml 配置文件
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
            
            // 获取 SqlSession
            try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
                YourMapper mapper = sqlSession.getMapper(YourMapper.class);

                // 插入用户
                User newUser = new User();
                newUser.setName("Alice");
                newUser.setAge(25);
                mapper.insertUser(newUser);
                sqlSession.commit(); // 提交事务

                // 查询用户
                User user = mapper.selectUserById(1);
                System.out.println(user.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

定义数据库字段与Java属性的映射

在 MyBatis 中,通过 XML 文件定义数据库字段和 Java 属性的映射是实现数据持久化的重要步骤。这个映射过程允许你将 SQL 结果集中的列与 Java 对象的属性相对应,确保数据在两者之间正确转换。

1. 创建数据库表和 Java 实体类

假设有一个数据库表users,其结构如下:

复制代码
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(100),
    password VARCHAR(100),
    email VARCHAR(100)
);

我们将创建一个与该表对应的 Java 实体类User

复制代码
package com.example.model;

public class User {
    private int id;
    private String username;
    private String password;
    private String email;

    // Getters and Setters
    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
2. 定义 Mapper XML 文件进行映射

在 Mapper XML 文件中,使用resultMap元素来定义 SQL 查询结果与 Java 对象字段之间的映射关系。下面是一个示例的UserMapper.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.example.mapper.UserMapper">

    <!-- 定义结果映射 -->
    <resultMap id="userResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
    </resultMap>

    <!-- 使用结果映射进行查询 -->
    <select id="selectUserById" resultMap="userResultMap">
        SELECT id, username, password, email FROM users WHERE id = #{id}
    </select>

    <!-- 插入用户 -->
    <insert id="insertUser" parameterType="com.example.model.User">
        INSERT INTO users (username, password, email) VALUES (#{username}, #{password}, #{email})
    </insert>

</mapper>
3. 解释映射的元素
  • resultMap : 用于定义一组映射规则,id为映射的唯一标识符,type指定要映射到的 Java 对象的全限定类名。
  • idresult :
    • <id property="id" column="id"/>指定了主键的映射关系。property对应 Java 对象的属性名,column对应数据库表中的列名。
    • <result property="username" column="username"/>表示将数据库中username列的值映射到 Java 对象的username属性上。
相关推荐
郝开22 分钟前
Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
java·spring boot·spring
知兀1 小时前
【Spring/SpringBoot】SSM(Spring+Spring MVC+Mybatis)方案、各部分职责、与Springboot关系
java·spring boot·spring
伊布拉西莫3 小时前
Spring 6.x HTTP interface 使用说明
spring·restclient
老友@4 小时前
一次由 PageHelper 分页污染引发的 Bug 排查实录
java·数据库·bug·mybatis·pagehelper·分页污染
YDS8295 小时前
苍穹外卖 —— Spring Cache和购物车功能开发
java·spring boot·后端·spring·mybatis
Elieal5 小时前
Spring 框架核心技术全解析
java·spring·sqlserver
组合缺一5 小时前
(对标 Spring)OpenSolon v3.7.0, v3.6.4, v3.5.8, v3.4.8 发布(支持 LTS)
java·后端·spring·web·solon
♡喜欢做梦5 小时前
Spring IOC
java·后端·spring
凌波粒14 小时前
MyBatis完整教程IDEA版(2)--ResultMap/注解/一对多/多对一/lombok/log4j
java·intellij-idea·mybatis
葡萄城技术团队15 小时前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js