springboot整合mybatis操作数据库(2022-08-20-2328更新完成)

90 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

目录

整合mybatis

加入依赖

编写Mapper

之前使用 jpa 的方式

用户的业务层接口

用户的业务层实现类

用户的实体类(注:属性与对应数据库字段一样)

用户的控制器(表现层)


spring boot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过 JdbcTemplete 和  JPA 的整合,本次分享下Mybatis的整合。对于 mybatis 的使用,需要创建mapper类和mapper.xml文件,这种创建比较烦,并且基本都是模板样式的,回头会介绍 mybatis 的插件自动生成代码。由于本次是一个演示的demo,就直接手写相关代码。

整合mybatis

加入依赖

在 pom.xml 中加入以下依赖 ( 注意:上面两种注释了的,不是 springboot 的依赖 )

        <!-- mybatis的依赖
        -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis</groupId>-->
<!--            <artifactId>mybatis</artifactId>-->
<!--            <version>3.5.3</version>-->
<!--        </dependency>-->
        <!--mybatis和spring集成的依赖
        -->
<!--        <dependency>-->
<!--            <groupId>org.mybatis</groupId>-->
<!--            <artifactId>mybatis-spring</artifactId>-->
<!--            <version>2.0.3</version>-->
<!--        </dependency>-->

        <!--SpringBoot的Mybatis启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

编写Mapper

和之前的方式一样,只是多了两个注解

@Mapper:声明Mapper接口

@Select:声明这个接口所需要使用的sql,当然,有查询的注解,肯定就有增删改的注解

package com.example.demo.dao;

import com.example.demo.bean.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;


/**
 * 使用mybatis实现对数据库的操作接口
 * @Author yyh
 */
@Mapper //要求mybatis的版本3.3及以上
public interface IUserMapper {

    //${value}:${}是mybatis的占位符,value即为传过来的name的值
    @Select("select * from user where name like '%${value}%'")
    public List<User> findAllByName(String name);

}

之前使用 jpa 的方式

用户的持久层接口

package com.example.demo.dao;
 
import com.example.demo.bean.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
 
/**
 * 用户的持久层接口
 * @author yyh
 *
 * JpaRepository<User,Long>:
 * 两个泛型是指 1、你要操作那个类 2、你的实体类主键的数据类型
 *
 * @Repository 没有持久层,持久层是继承的,所以加此注解即可
 */
@Repository("userDao")
public interface IUserDao extends JpaRepository<User,Long> {
 
    /**
     * 查询所有用户
     * 如果用的是spring data jpa,然后也不想写这些方法,
     * 这个时候我们可以选择,让spring data jpa来帮我们实现,
     * 我们可以继承 JpaRepository<User,Long>
     * @return
     */
    //public List<User> findAll();
 
}

用户的业务层接口

用户的业务层接口,查询所有用户,根据名称查询用户信息

package com.example.demo.service;

import com.example.demo.bean.User;
import java.util.List;

/**
 * 用户的业务层接口
 * @author yyh
 */

public interface IUserService {

    /**
     * 查询所有用户
     * @return
     */
    List<User> findAllUser();


    /**
     * 根据名称查询用户信息
     * @param name
     * @return
     */
    List<User> findAllUserByName(String name);

}

用户的业务层实现类

用户的业务层实现类,由 jpa 升级为 mybatis 的实现

package com.example.demo.service.impl;

import com.example.demo.bean.User;
import com.example.demo.dao.IUserDao;
import com.example.demo.dao.IUserMapper;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;


/**
 * 用户的业务层实现类
 * @Author yyh
 */
@Service("userService")
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserDao userDao;//spring data jpa的实现

    @Autowired
    private IUserMapper userMapper;// 由 jpa 升级为 mybatis 的实现

    @Override
    public List<User> findAllUser() {
        return userDao.findAll();
    }


    @Override
    public List<User> findAllUserByName(String name) {
        System.out.println("name:"+name);
        return userMapper.findAllByName(name);
    }

}

用户的实体类(注:属性与对应数据库字段一样)

用户的实体类

package com.example.demo.bean;

import lombok.Data;
import javax.persistence.*;


/**
 * 用户的实体类
 * @author yyh
 *
 * Not a managed type
 * https://www.cnblogs.com/gaoqiao/p/10862176.html
 */

//导包 javax.persistence 包下的,代表是jpa规范
@Entity //表示当前类是一个实体类
@Table(name = "user") //表示跟哪一个表进行对应
@Data //提高代码的简洁,使用这个注解可以省去代码中大量的getter/setter、toString等方法;
public class User {

    @Id //表示当前这个属性是一个主键
    @Column(name="id") //表示跟数据库哪一列相对应
    @GeneratedValue(strategy = GenerationType.IDENTITY) //表示你这个id的值,如何得到
    //GenerationType.IDENTITY 表示为自增长。它的数据类型要求为:int、long、short 其中之一
    private Long id;

//    @Column(name="user_name")//在windows系统下mysql不区分大小写,在linux系统下严格区分
//    private String userName;//对应数据库字段user_name

    //jpa方式上面驼峰形式能查到,mybatis方式要跟数据库对应一样才能查到
    private String user_name;//对应数据库字段user_name

    private String passWord;//对应数据库字段pass_word
    private String name;//对应数据库字段name

}

用户的控制器(表现层)

用户的控制器(表现层),业务层调用持久层去查询

package com.example.demo.web.controller;

import com.example.demo.bean.User;
import com.example.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;


/**
 * 用户的控制器(表现层)
 * @author yyh
 */
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;


    //http://localhost:8080/user/findAll
    @RequestMapping("/findAll")
//    @RequestMapping("/searchlgbByIds")
    public List<User> findAllUser(){
        return userService.findAllUser();//业务层调用持久层去查询
    }


    //http://localhost:8080/user/findAllByName/张三
    /**
     * Spring REST编程风格
     * https://blog.csdn.net/qq_36697880/article/details/81630840
     * @param name
     * @return
     */
    @RequestMapping("/findAllByName/{name}")
    public List<User> findAllUserByName(@PathVariable("name")String name){
        return userService.findAllUserByName(name);
    }


}