【Spring实战】08 Mybatis

发布时间:2023年12月27日

Spring 集成 MyBatis 为 Java 项目提供了强大的持久层解决方案,同时也是我们使用最多的搭配组合。本文将介绍 Spring 如何集成 MyBatis 设定常用的配置以及实际开发过程中经常使用到的简单样例。

1. 定义

MyBatis 是一个开源的持久化框架,它通过 XML 或注解配置,将对象与数据库表进行映射,简化了数据库操作。

官网

https://mybatis.net.cn/

在这里插入图片描述

2. 添加依赖

需要在 pom.xml 中添加 mybatis 的依赖(如果使用 Gradle 的话,则需要添加对应的依赖)

	<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>3.0.3</version>
	</dependency>

※此处的 version 选择了目前最新的版本 3.0.3

3. 使用

1)共通配置

在 application.properties 属性文件中,配置 mybatis 的共通设定

mybatis.mapper-locations=classpath*:mapper/**/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
  • 指定 xml 的扫描路径,以便自动扫描并加载 XML 映射文件
  • 将数据库中下划线命名的字段自动映射为 Java 类中的驼峰命名属性

2)初始化表

schema.sql

使用程序启动时,默认执行的 schema.sql 来创建 t_user

CREATE TABLE IF NOT EXISTS `t_user` (
     `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
     `name`       VARCHAR(32) NOT NULL,
     `age`        INTEGER  NOT NULL
);

3)创建 model

User.java

创建一个实体类,这里跟 t_user 表结构相同

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

4)创建 Dao 及 Mapper

  • 插入多条

    UserDao.java

    int insertUsers(List<User> users);
    

    UserMapper.xml

        <insert id="insertUsers">
            insert into t_user (
            id,
            name,
            age
            ) values
            <foreach item="user" collection="users" open="(" separator="),(" close=")">
                #{user.id}, #{user.name}, #{user.age}
            </foreach>
        </insert>
    

    此处,使用了 XML 的方式写的 sql 文

  • 插入单条

    UserDao.java

    int insertUser(User user);
    

    UserMapper.xml

        <insert id="insertUser">
            insert into t_user (
                id,
                name,
                age
            ) values (
                #{id},
                #{name},
                #{age}
            )
        </insert>
    

    此处,使用了 XML 的方式写的 sql 文

  • 删除

    UserDao.java

        @Delete("delete from t_user where id = #{id}")
        int deleteUser(Integer id);
    

    此处,使用了注解的方式写的 sql 文

  • 更新

    UserDao.java

    int updateUser(User user);
    

    UserMapper.xml

        <update id="updateUser">
            update
                t_user
            set
                name = #{name},
                age = #{age}
            where
                id = #{id}
        </update>
    

    此处,使用了 XML 的方式写的 sql 文

  • 查询全部

    UserDao.java

        @Select("select * from t_user")
        List<User> selectUsers();
    

    此处,使用了注解的方式写的 sql 文

  • 查询指定ID

    UserDao.java

        @Select("select * from t_user where id = #{id}")
        User selectUser(Integer id);
    

    此处,使用了注解的方式写的 sql 文

5)验证

  • 插入单条

    UserController.java

        @GetMapping("insertUser")
        public String insertUser() {
            User user = User.builder().id(1).name("cheney").age(11).build();
            userDao.insertUser(user);
            return "登陆了一条用户信息:</br>" + user.toString();
        }
    

    网页请求

    在这里插入图片描述

  • 插入多条

    UserController.java

        @GetMapping("insertUsers")
        public String insertUsers() {
            List<User> users = new ArrayList<>();
            users.add(User.builder().id(2).name("aaa").age(12).build());
            users.add(User.builder().id(3).name("bbb").age(13).build());
            userDao.insertUsers(users);
            StringBuilder sb = new StringBuilder();
            sb.append("登陆了两条用户信息:</br>");
            for (User user : users) {
                sb.append(user).append("</br>");
            }
            return sb.toString();
        }
    

    网页请求

    在这里插入图片描述

  • 更新

    UserController.java

        @GetMapping("updateUser")
        public String updateUser() {
            User user = User.builder().id(1).name("cheney").age(22).build();
            userDao.updateUser(user);
            return "修改了用户ID是1的用户信息:</br>" + user.toString();
        }
    

    网页请求

    在这里插入图片描述

  • 查询指定ID

    UserController.java

        @GetMapping("selectUser")
        public String selectUser() {
            User user = userDao.selectUser(1);
            return "查询用户ID是1的用户信息:</br>" + user.toString();
        }
    

    网页请求

    在这里插入图片描述

  • 删除

    UserController.java

        @GetMapping("deleteUser")
        public String deleteUser() {
            userDao.deleteUser(3);
            return "删除了用户ID是3的用户信息";
        }
    

    网页请求

    在这里插入图片描述

  • 查询全部

    UserController.java

        @GetMapping("selectUsers")
        public String selectUsers() {
            List<User> users = userDao.selectUsers();
            StringBuilder sb = new StringBuilder();
            sb.append("查询所有数据库中的用户信息:</br>");
            for (User user : users) {
                sb.append(user).append("</br>");
            }
            return sb.toString();
        }
    

    网页请求

    在这里插入图片描述

4. 优点

  • 灵活性

    允许开发者自定义 SQL 查询语句,更灵活地进行数据库操作

  • 直观的 SQL

    SQL 语句直观、可读性强,开发者可以更容易地理解和调试 SQL

  • 轻量级

    MyBatis 更注重数据库操作,使得开发者可以更专注于 SQL 和数据层的细节

  • 缓存支持

    支持一级缓存和二级缓存,可以提高查询性能,特别是在高并发的情况下

5. 缺点

  • 不适合复杂逻辑

    对于包含复杂业务逻辑的项目,MyBatis 可能显得不够强大,因为它专注于数据库操作,而不提供全栈解决方案。

  • 需要手动编写 SQL

    对于一些开发者而言,需要手动编写 SQL 可能是一项负担。相对于基于对象的框架,这可能增加了一些工作量。

  • 不提供声明式事务

    MyBatis 不提供声明式的事务管理,事务需要在代码中显式处理。

  • 灵活性可能导致混乱

    MyBatis 的灵活性允许开发者使用任何 SQL 查询语句,但这也可能导致项目中的 SQL 混乱不堪,特别是对于大型团队。

6.代码详细

https://github.com/cheney09/spring-practical-combat/tree/main/08/demo

在这里插入图片描述

总结

以上就是 Spring 集成 MyBatis 的简要步骤,通过这种集成方式你可以更加便捷地使用 MyBatis 进行数据库操作,希望这篇博客将带你走进 Spring 和 MyBatis 进行持久化层开发。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135234103
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。