Mybatis使用系列-1-入门增删改查

125 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 今天开始将使用Mybatis得记录做一个总结,本篇介绍的是入门得增删改查说明及代码。

什么是 MyBatis?

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。

        ORM(Object relational mapping)类型框架的数据库操作发展到如今,我觉得就是两种分支,一种是以Hibernate为首的动态生成sql语句,可以少写代码,可移植性高,一种就是以Mybatis为首的纯sql操作,方言支持性差导致移植性差,但是运行效率高,灵活性高。两种各有优势,今天来看下在SpringBoot中集成Mybatis框架。

        创建好一个新项目后,按照以下流程添加代码:

一、pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xing</groupId>
  <artifactId>springBootMybatis</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>springBootMybatis</name>
  <description>Mybatis project for Spring Boot</description>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
    <relativePath/>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.15</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

以上依赖没啥说的,正确导入即可。

二、建立实体,对应表字段

package com.xing.entity;
...
/**
 * 实体
 */
@Data
public class UserEntity {
    private Integer id;
    private String userName;
    private String passWord;
    private String realName;
    get
    set
    toString
    ...
}

三、mapper接口

package com.xing.mapper;

import com.xing.entity.UserEntity;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
import java.util.List;

/**
 * 面向接口
 */
@Repository
public interface UserMapper {

    UserEntity getOne(int id);
    @Select("SELECT * FROM user")
    List<UserEntity> getAll();
    @Select("SELECT * FROM user WHERE id = #{id}")
    @Results({
            @Result(property = "id",  column = "id"),
            @Result(property = "userName", column = "userName")
    })
    UserEntity getOneById(Integer id);
    @Insert("INSERT INTO user(id, userName, passWord, realName) VALUES(#{id}, #{userName}, #{passWord}, #{realName})")
    void insert(UserEntity user);
    @Update("UPDATE user SET id=#{id},userName=#{userName},passWord=#{passWord},realName=#{realName} WHERE id =#{id}")
    void update(UserEntity user);
    @Delete("DELETE FROM user WHERE id =#{id}")
    void delete(Integer id);
}

此处是新建了一个接口,我们可以使用注解来编写SQL语句,也可以使用xml来映射对应的接口方法,如果不使用注解,比如下面这个方法并没有注解SQL语句,我们把语句写到xml配置中。

UserEntity getOne(int id);

resources包下建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.xing.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.xing.entity.UserEntity">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="userName" jdbcType="VARCHAR" property="userName" />
        <result column="passWord" jdbcType="VARCHAR" property="passWord" />
        <result column="realName" jdbcType="VARCHAR" property="realName" />
    </resultMap>
    <select id="getOne" resultType="com.xing.entity.UserEntity">
        select * from user where id = #{id}
    </select>
</mapper>

可以看到id="getOne" 和getOne(int id) 是一样的,通过映射可以建立关联关系。其他的使用了注解的就不需要了。

四、配置文件也贴一下:

server:
  port: 8080
spring:
  datasource:
    username: 用户名
    password: 密码
    url: jdbc:mysql://localhost:3306/xinghua?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: classpath:mapping/*Mapper.xml
  type-aliases-package: com.xing.entity
#showSql
logging:
  level:
    com:
      example:
        mapper : debug

五、将mapper扫描成组件


package com.xing;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.xing.mapper")
@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

这里@MapperScan("com.xing.mapper")注解可以把mapper包下所有的接口扫描到,当然也可以设置多个:

@MapperScan({"com.xing.mapper1","com.xing.mapper2"})

我们也可以直接在Mapper接口类上面添加注解@Mapper,这种方式要求每一个mapper接口类都需要添加此注解,所以还是配置扫描的方式最好。

六、写个controller测试下

也可以写单元测试,我还是习惯接口测试


package com.xing.controller;

import com.xing.entity.UserEntity;
import com.xing.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 控制类
 */
@RestController
@RequestMapping("/user")
public class UserController {

    final UserMapper userMapper;

    @Autowired
    public UserController(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    /**
     * 根据id获取一个user
     * @param id id
     * @return user
     */
    @RequestMapping("/getOneById/{id}")
    public String getOneById(@PathVariable int id){
        return userMapper.getOne(id).toString();
    }

    /**
     *  获取全部
     * @return user list
     */
    @RequestMapping("/getAll")
    public String getAll(){
        return userMapper.getAll().toString();
    }

    /**
     * 新增
     * @param user user
     * @return ok
     */
    @PostMapping("/insert")
    public String insert(@RequestBody UserEntity user){
        userMapper.insert(user);
        return "ok";
    }

    /**
     *  更新
     * @param user user
     * @return ok
     */
    @PostMapping("/update")
    public String update(@RequestBody UserEntity user){
        userMapper.update(user);
        return "update ok";
    }

    /**
     *  删除
     * @param id id
     * @return ok
     */
    @RequestMapping("/delete/{id}")
    public String delete(@PathVariable int id){
        userMapper.delete(id);
        return "ok";
    }
}

总结:

        SpringBoot中集成Mybatis并使用简单的增删改查。

源码:

        github.com/debugxingHu…

END