我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

本文不往后扩展,而是回到项目的初始阶段。对数据库进行连接的部分,使用的是基于JPA/HibernateEntity+Serive文件。在本文中,它将增加使用MyBatisMapper文件。并不是说jpamybatis两者完全冲突,但是,想让它们两个和谐相处,也是比较费劲的。所以,全面改成mybatis也是有它的需求点存在的。

苏南大叔:SpringBoot开发,如何使用MyBatis全面代替JPA? - mybatis-jpa
SpringBoot开发,如何使用MyBatis全面代替JPA?(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10openjdk@23.0.2IntelliJ IDEA 2024.3.4.1maven@3.3.2spring boot@2.5.4java@17mysql@5.7.26MyBatis@2.2.0mybatis的存在点叫做mapper文件,代替的是传统的jpa中的repository文件。

基础代码

本文是基于如下系列文章,进一步展开叙述的。所以,没有详细展开的代码内容,可以在下面的连接里面找到答案。

mybatis

苏南大叔的使用感受上来说,mybatis更加凸显是sql语句,这和传统的模型的概念冲突的非常厉害。但是,实际功用上来说,它代替的确实就是model/entityMyBatisJPA的主要差异在于设计哲学,MyBatis偏向于面向过程,而JPA则将面向对象发挥到极致。

MyBatis是一个可以灵活编写SQL语句的框架。它更偏向于数据库,因此需要手写SQL语句。MyBatis完全避免了几乎全部的JDBC代码和手动设置参数以及获取结果集,相比JDBC更方便。另外,MyBatis提供了很高的灵活性,可以通过定制化的SQL语句实现各种复杂的查询操作。

安装依赖

修改pom.xml,添加mybatis-spring-boot-starter,(去除spring-boot-starter-data-jpa)。

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
XML

执行mvn install命令。

苏南大叔:SpringBoot开发,如何使用MyBatis全面代替JPA? - mybatis-config
SpringBoot开发,如何使用MyBatis全面代替JPA?(图3-2)

修改配置

src\main\resources\application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/boot
spring.datasource.username=root
spring.datasource.password=root

# spring.jpa.hibernate.ddl-auto=update
# spring.jpa.show-sql=true
# spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
# spring.jpa.properties.hibernate.format_sql=true
# logging.level.org.hibernate.SQL=DEBUG
# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

mybatis.mapper-locations=classpath*:mappers/*.xml
logging.level.com.example.demo.mapper=DEBUG
logging.level.org.mybatis=DEBUG
logging.level.jdbc.sqlonly=DEBUG
Ini
JPAMyBatis还共享了设置:spring.datasource

代码修改

【第一步】,model/entity文件,没有任何变化。但是,这里增加了一个便于调试的.toString()方法。

package com.example.demo.entity;
import org.apache.ibatis.type.Alias;

@Alias("User")
public class User {
    private Integer id; // Ensure the ID field is Integer
    private String name;
    private String password;

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

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
Java

【第二步】,mapper文件代替了repository文件。mapper文件选择了更简单的.java形式。
src\main\java\com\example\demo\mapper\UserMapper.java:

package com.example.demo.mapper;

import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user")
    List<User> findAll();

    @Select("SELECT * FROM user WHERE id = #{id}")
    User findById(Long id);

    @Select("SELECT * FROM user WHERE name = #{name}")
    User findByName(String name);

    @Insert("INSERT INTO user(name, password) VALUES(#{name}, #{password})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);

    @Update("UPDATE user SET name = #{name}, password = #{password} WHERE id = #{id}")
    void update(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    void deleteById(Long id);

    @Select("SELECT COUNT(*) FROM user")
    int count();
}
Java

苏南大叔:SpringBoot开发,如何使用MyBatis全面代替JPA? - 文件对比
SpringBoot开发,如何使用MyBatis全面代替JPA?(图3-3)

【第三步】修改serice文件以及controller文件(如果有必要)。

由于是mapper平替修改repository文件的。所以,对于service文件以及controller文件来说,比如有引用修改的情况发生。

src\main\java\com\example\demo\service\UserService.java

//...
import com.example.demo.mapper.UserMapper;
//...

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;
    //...
    public List<User> getAllUsers() {
        return userMapper.findAll();
    }

    public User getUserById(Long id) {
        if (id == null) {
            throw new IllegalArgumentException("ID不能为空");
        }
        return userMapper.findById(id);
    }
    //...
}
Java

src\main\java\com\example\demo\controller\LoginController.java

//...
import com.example.demo.mapper.UserMapper;
//...
@Controller
public class LoginController {
    @Autowired
    private UserMapper userMapper;
    //...
    private boolean isValidUser(String username, String password) {
        User user = userMapper.findByName(username);
        if (user != null && user.getPassword().equals(password)) {
            return true;
        }
        return false;
    }
}
Java

对比表格

名称模型文件sql语句其余
JPAentity + repository框架完成搭配service
MyBatisentity + mapper自己完成搭配service

所以,对于springboot项目来说,可以选择传统的JPA,也可以选择新兴的MyBatis。选择前者的话,就是编辑entity文件,选择后者的话,就是编辑mapper文件。前者由框架来组织sql语句,后者你自己写sql语句。别的基本上就差不多了。

结语

本文的代码,在实际测试的时候,创建新的user的时候,id总是会变成长整型。多方调整代码都不行,最终删除数据表,重建数据表成功。可能是autoincreace key出了问题。

本文以快速入门mybatis为主要目的,苏南大叔的更多java相关经验文字,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   java