简介

mybatis

Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的工作。Mybatis可以通过Mapper映射文件直接将Java对象映射到SQL语句中,实现了Java对象与数据库记录的无缝映射。

  • 基于JDBC的持久层框架,相对于Hibernate等ORM框架,Mybatis更加贴近SQL语句,更加灵活。
  • 支持定制化SQL、存储过程以及高级映射。
  • 映射文件使用XML编写或直接使用注解开发,易于维护和修改。
  • 支持动态SQL,可以根据不同的条件生成不同的SQL语句。

mybatis-plus

Mybatis-Plus是一款Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。Mybatis-Plus提供了许多常用的增删改查操作,同时支持自动生成代码和分页查询等功能。

  • 提供了常用的增删改查操作,开发效率高。
  • 支持自动生成代码,减少了重复劳动。
  • 支持分页查询,提高了查询效率。
  • 支持Lambda表达式,可以像写Java代码一样编写SQL语句。

数据库准备

首先在 teacher 库里建一个 User 表:

CREATE TABLE User (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  score INT NOT NULL,
  subject VARCHAR(20) NOT NULL
);

随机插入些数据:

INSERT INTO User (name, score, subject) VALUES
  ('张三', 80, '语文'),
  ('张三', 90, '数学'),
  ('张三', 70, '英语'),
  ('李四', 85, '语文'),
  ('李四', 95, '数学'),
  ('李四', 75, '英语'),
  ('王五', 83, '语文'),
  ('王五', 92, '数学'),
  ('王五', 78, '英语'),
  ('赵六', 87, '语文'),
  ('赵六', 91, '数学'),
  ('赵六', 73, '英语'),
  ('钱七', 89, '语文'),
  ('钱七', 93, '数学'),
  ('钱七', 76, '英语'),
  ('孙八', 81, '语文'),
  ('孙八', 96, '数学'),
  ('孙八', 69, '英语'),
  ('周九', 90, '语文'),
  ('周九', 97, '数学'),
  ('周九', 71, '英语'),
  ('吴十', 89, '语文'),
  ('吴十', 82, '数学'),
  ('吴十', 99, '英语'),
  ('郑十一', 72, '语文'),
  ('郑十一', 86, '数学'),
  ('郑十一', 95, '英语'),
  ('王十二', 74, '语文'),
  ('王十二', 81, '数学'),
  ('王十二', 93, '英语'),
  ('李十三', 70, '语文'),
  ('李十三', 96, '数学'),
  ('李十三', 85, '英语'),
  ('张十四', 88, '语文'),
  ('张十四', 97, '数学'),
  ('张十四', 73, '英语'),
  ('赵十五', 89, '语文'),
  ('赵十五', 91, '数学'),
  ('赵十五', 76, '英语'),
  ('孙十六', 80, '语文'),
  ('孙十六', 95, '数学'),
  ('孙十六', 72, '英语'),
  ('钱十七', 83, '语文'),
  ('钱十七', 92, '数学'),
  ('钱十七', 97, '英语'),
  ('吴十八', 71, '语文'),
  ('吴十八', 84, '数学'),
  ('吴十八', 90, '英语'),
  ('周十九', 98, '语文'),
  ('周十九', 75, '数学'),
  ('周十九', 87, '英语'),
  ('郑二十', 89, '语文'),
  ('郑二十', 96, '数学'),
  ('郑二十', 76, '英语');

resources-application.yml

配置文件里填一下数据库驱动,连接的ip地址、端口、库以及数据库账号密码。

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/teacher?serverTimezone=UTC
    username: root
    password: root

domain

User.java

比照数据库字段建一个实体类,方便接收数据。

package com.example.mybatisplus_test.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName(value="user")
public class User {

    @TableId(value="id", type=IdType.AUTO)
    @TableField(value="id")
    private Long id;

    @TableField(value="name")
    private String name;

    @TableField(value="score")
    private Integer score;

    @TableField(value="subject")
    private String subject;
}

repository

UserMapper.java

创建数据访问层代码,一般使用Mapper或者Dao后缀。继承mybatis-plus提供的BaseMapper后可以直接使用很多基础的增删改查功能,可以少些很多sql语句。当然也可以使用mybatis提供的@Select、@Insert、@Delect、@Update等注解额外整点自定义sql语句。

package com.example.mybatisplus_test.repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus_test.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;


@Mapper
public interface UserMapper extends BaseMapper<User> {

    @Select("SELECT name, AVG(score) AS avg_score FROM user GROUP BY name DESC")
    List<Map<String, Object>> groupByName();

    @Select("SELECT * FROM user WHERE name=#{name}")
    List<User> selectByName(String name);

    @Select("SELECT *, score/10 AS score2 FROM user")
    List<Map<User, Object>> selectUsersAddColumn();
}

Service

UserService.java

这里写服务层的接口。

package com.example.mybatisplus_test.service;

import com.example.mybatisplus_test.domain.User;

import java.util.List;
import java.util.Map;


public interface UserService {

    List<User> getGeScore(int score);

    List<User> selectByName(String name);

    List<Map<String, Object>> groupByName();

}

impl

UserServiceImpl.java

服务层接口的实现类。

package com.example.mybatisplus_test.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.mybatisplus_test.domain.User;
import com.example.mybatisplus_test.repository.UserMapper;
import com.example.mybatisplus_test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> getGeScore(int score) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda().ge(User::getScore, score).orderByDesc(User::getScore);
        return userMapper.selectList(wrapper);
    }

    @Override
    public List<User> selectByName(String name) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(User::getName, name);
        return userMapper.selectList(wrapper);
    }

    @Override
    public List<Map<String, Object>> groupByName() {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.select("name", "AVG(score) AS score").groupBy("name");
        return userMapper.selectMaps(wrapper);
    }
}

controller

UserController.java

web层代码。

package com.example.mybatisplus_test.controller;

import com.example.mybatisplus_test.domain.User;
import com.example.mybatisplus_test.repository.UserMapper;
import com.example.mybatisplus_test.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private UserMapper userMapper;
    // 添加行
    @PostMapping("/users")
    public boolean addUser(@RequestBody User user) {
        return userMapper.insert(user) > 0;
    }
    // 删除行
    @DeleteMapping("/users/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userMapper.deleteById(id) > 0;
    }
    // 修改行
    @PutMapping("/users")
    public boolean updateUser(@RequestBody User user) {
        return userMapper.updateById(user) > 0;
    }
    // 查询行
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        return userMapper.selectById(id);
    }
    // 根据用户名查其所有信息
    @GetMapping("/user/{name}")
    public List<User> selectByname(@PathVariable String name) {
        return userService.selectByName(name);
        // return userMapper.selectByName(name); // 或者直接使用mybatis写sql语句
    }

    /**
     * 条件查询:分数大于score的User
     * @param score
     * @return
     */
    @GetMapping("/geScore/{score}")
    public String getGeScore(@PathVariable int score) {
        return userService.getGeScore(score).toString();
    }

    /**
     * 按照name对分数求均值
     * @return
     */
    @GetMapping("/groupByName")
    public List<Map<String, Object>> groupByName() {
        return userService.groupByName();
        //return userMapper.groupByName(); // 或者使用mybatis直接写sql语句
    }

    /**
     * 选择所有值的同时对Score除10(测试额外增加一列)
     * @return
     */
    @GetMapping("/selectUsersAddColumn")
    public List<Map<User, Object>> selectUsersAddColumn() {
        return userMapper.selectUsersAddColumn();
    }
}

MybatisplusTestApplication.java

程序主入口。

package com.example.mybatisplus_test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MybatisplusTestApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisplusTestApplication.class, args);
    }
}
最后修改:2023 年 04 月 20 日
如果觉得我的文章对你有用,请随意赞赏