Springboot integra Mybatis para realizar adiciones, eliminaciones, modificaciones y verificación

Ordinario son solo dos palabras: pereza y pereza; el
éxito son solo dos palabras: dificultad y diligencia;
excelencia son solo dos palabras: tú y yo.
Sígueme para aprender JAVA, Spring Family Bucket y el conocimiento de operación y mantenimiento de Linux de 0, y llevarte de un adolescente ignorante al pináculo de la vida y casarte con Bai Fumei.
Siga la cuenta pública de WeChat [ TI es muy confiable ] y comparta su experiencia técnica todos los días ~  

 

Springboot integra Mybatis para realizar adiciones, eliminaciones, modificaciones y verificación

 1. Introducción      

      Hay muchos marcos de capa de persistencia. Las implementaciones de marco de capa de persistencia comunes incluyen spring-data-jpa, mybatis (mybatis-plus) e hibernate. Este tutorial tomará el marco de la capa de persistencia mybatis como ejemplo para detallar el proceso de springboot integrando el marco mybatis, y finalmente realizar la operación de adición, eliminación y modificación de datos (CRUD) a través de anotación y xml.

 

2 ¿Qué es mybatis?

      Explicación en el documento oficial de mybatis: MyBatis es un excelente marco de trabajo de capa de persistencia que admite SQL personalizado, procedimientos almacenados y mapeo avanzado. MyBatis elimina casi todo el código JDBC y el trabajo de establecer parámetros y obtener conjuntos de resultados. MyBatis puede configurar y mapear tipos primitivos, interfaces y POJOs Java (Plain Old Java Objects) como registros en la base de datos a través de XML simple o anotaciones.

      Es decir, mybatis ha encapsulado mucho las operaciones de la base de datos, por lo que los desarrolladores pueden usarla de inmediato y reducir los costos de desarrollo. Al mismo tiempo, mybatis admite métodos de anotación y mapeo xml, y también brinda soporte para sql nativo.

 

3 Crea un proyecto springboot

      El proceso de creación de un proyecto Springboot es muy simple y se omite aquí. La siguiente es la estructura de directorios del proyecto springboot que se ha construido.

      Nombre del proyecto: mybatis-demo

 

4 Instalar la base de datos mysql

4.1 Instalar la base de datos mysql      

      ¡ligeramente! Preste atención a la cuenta pública de WeChat: TI es muy confiable , responda " Quiero tutorial de instalación de mysql " para recibirlo gratis ~

 

4.2 Crear tabla e inicializar datos

      La información de conexión de la base de datos mysql es la siguiente:

url: jdbc:mysql://localhost:3306/test_mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
username: root
password: root

       Tabla de base de datos creada: user_t ,  agregue un índice único a la tabla de base de datos user_t. El campo de índice es: móvil y el nombre del índice: udx_user_mobile. El script sql para crear la tabla es el siguiente:

CREATE TABLE `user_t`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `mobile` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户手机号',
  `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `age` tinyint(4) NULL DEFAULT NULL COMMENT '年龄',
  `create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '最后更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `udx_user_mobile`(`mobile`) USING BTREE COMMENT '用户手机号唯一索引'
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

 

     

      ¡Primero insertemos los siguientes 4 datos en la tabla de la base de datos user_t para probar las consultas!

INSERT INTO `user_t` VALUES (1, '13111111111', '张三', 10, '2020-10-22 15:58:51', '2020-10-22 18:26:31');
INSERT INTO `user_t` VALUES (2, '13555555555', '李四', 20, '2020-10-22 15:58:59', '2020-10-22 18:26:33');
INSERT INTO `user_t` VALUES (3, '13666666666', '王五', 20, '2020-10-22 15:59:15', '2020-10-22 18:26:35');
INSERT INTO `user_t` VALUES (4, '15222222222', '小六', 40, '2020-10-22 17:30:21', '2020-10-22 18:26:39');

 

 

5 integración de springboot mybatis

5.1 Presentación del paquete jar

      Agregue el controlador de la base de datos mysql, el grupo de conexiones de la base de datos y los paquetes de dependencia relacionados con mybatis al archivo pom.xml del proyecto.

    <!--持久化api依赖包:与数据库交互,比如Java bean和数据库表的对应关系-->
    <dependency>
      <groupId>javax.persistence</groupId>
      <artifactId>persistence-api</artifactId>
      <version>1.0</version>
    </dependency>

    <!--mybatis依赖包-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.1</version>
    </dependency>

    <!-- mybatis通用Mapper依赖包:提供了基本的增删改查Mapper -->
    <dependency>
      <groupId>tk.mybatis</groupId>
      <artifactId>mapper-spring-boot-starter</artifactId>
      <version>1.2.4</version>
    </dependency>

    <!--mysql数据库驱动包-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.35</version>
    </dependency>

    <!--Druid数据库连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.10</version>
    </dependency>

 

5.2 Configurar fuente de datos

      Agregue la siguiente configuración en el archivo de configuración application.properties o application.yml.

      1) Configurar la fuente de datos

      2) Especifique la ruta del archivo de recursos Mapper.xml

      3) Abrir registro SQL

#mysql配置数据源
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_mybatis?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
    username: root
    password: root

#指定Mapper.xml所在路径
mybatis:
  mapper-locations: classpath:mapping/*Mapper.xml
  type-aliases-package: com.hc.mybatisdemo.entity

#打印sql日志
logging:
  level:
    com:
      hc:
        mybatisdemo:
          mapper: debug

 

5.3 Interfaz de Scan Mapper

//注意这里需要引入tk.mybatis这个依赖
import tk.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.hc.mybatisdemo.mapper") //扫描的mapper包路径
public class MybatisDemoApplication {

  public static void main(String[] args) {
    SpringApplication.run(MybatisDemoApplication.class, args);
  }
}

 

6 Escriba el código para agregar y eliminar CRUD

6.1 Crear clase de entidad

       Clase de entidad:  User.java

import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * 用户实体类
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user_t")
public class User {

  /**
   * 主键id
   */
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Long id;

  /**
   * 用户手机号
   */
  @Column(name = "mobile")
  private String mobile;

  /**
   * 用户名
   */
  @Column(name = "user_name")
  private String userName;

  /**
   * 年龄
   */
  @Column(name = "age")
  private Integer age;

  /**
   * 创建时间
   */
  @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") //写入数据库时格式化
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") //数据库查询后json格式化
  @Column(name = "create_time")
  private Date createTime;

  /**
   * 创建时间
   */
  @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
  @Column(name = "update_time")
  private Date updateTime;
}

 

6.2 Crear clase de interfaz de mapeador

      Clase de interfaz del asignador : UserMapper.java

import com.hc.mybatisdemo.entity.User;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * UserMapper接口
 */
@Mapper
public interface UserMapper extends BaseMapper<User>, MySqlMapper<User> {

  /**
   * 根据id查询
   */
  User findById(Long id);

  /**
   * 根据用户名获取用户信息 注意:like模糊查询的占位符用${},不能用#{}
   */
  @Select(value = "select id, mobile, user_name as userName, age, create_time as createTime, update_time as updateTime from user_t where user_name like '%${userName}'")
  List<User> findByUserName(@Param("userName") String userName);

  /**
   * 更新id数据的用户名和年龄信息方式1
   */
  @Update(value = "update user_t set user_name = #{userName}, age = #{age} where id = #{id}")
  Integer updateById1(@Param("userName") String userName, @Param("age") Integer age, @Param("id") Long id);

  /**
   * 删除id数据方式1
   */
  @Delete(value = "delete from user_t where id = #{id}")
  Integer deleteById1(@Param("id") Long id);

  /**
   * 更新数据方式2
   */
  Integer updateById2(User user);

  /**
   * 删除id数据方式2
   *
   * @param id 被删除的数据id
   */
  Integer deleteById2(Long id);
}

 

6.3 Crear 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.hc.mybatisdemo.mapper.UserMapper">

  <resultMap id="BaseResultMap" type="com.hc.mybatisdemo.entity.User">
    <result column="id" jdbcType="VARCHAR" property="id"/>
    <result column="mobile" jdbcType="VARCHAR" property="mobile"/>
    <result column="user_name" jdbcType="VARCHAR" property="userName"/>
    <result column="age" jdbcType="INTEGER" property="age"/>
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
  </resultMap>

  <select id="findById" resultMap="BaseResultMap">
    select * from user_t where id = #{id}
  </select>

  <!--<select id="findById" resultType="com.hc.mybatisdemo.entity.User">-->
  <!--select * from user_t where id = #{id}-->
  <!--</select>-->

  <update id="updateById" parameterType="com.hc.mybatisdemo.entity.User">
    update user_t set user_name = #{userName}, age = #{age} where id = #{id};
  </update>

  <delete id="deleteById" parameterType="String">
    delete from user_t where id = #{id};
  </delete>
</mapper>

 

6.4 Crear clase de interfaz de capa empresarial

      Cree una clase de interfaz de capa empresarial: IUserService.java

import com.hc.mybatisdemo.entity.User;
import java.util.List;
import org.springframework.stereotype.Service;

/**
 * 用户service接口
 */
@Service
public interface IUserService {

  /**
   * 查询一个
   */
  User findOne(Long id);

  /**
   * 根据用户名获取用户列表
   */
  List<User> findByUserName(String userName);

  /**
   * 插入一条数据
   */
  Integer insert(User user);

  /**
   * 更新一条数据
   */
  Integer updateById(User user);

  /**
   * 删除一条数据
   */
  Integer deleteById(Long id);

  /**
   * 事务控制测试--删除id1和id2两条数据
   */
  Integer transactionTest(Long id1, Long id2);
}

 

6.5 Crear una clase de implementación de interfaz de capa empresarial

      Cree una clase de implementación de interfaz de capa empresarial: UserServiceImpl.java

import com.hc.mybatisdemo.entity.User;
import com.hc.mybatisdemo.mapper.UserMapper;
import com.hc.mybatisdemo.service.IUserService;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

/**
 * 用户service实现类
 */
@Slf4j
@Service
public class UserServiceImpl implements IUserService {

  @Autowired
  private UserMapper userMapper;

  /**
   * 查询一个
   */
  @Override
  public User findOne(Long id) {
    return userMapper.findById(id);
  }

  /**
   * 根据用户名获取用户列表
   */
  @Override
  public List<User> findByUserName(String userName) {
    return userMapper.findByUserName(userName);
  }

  /**
   * 新增一条数据
   */
  @Override
  public Integer insert(User user) {
    return userMapper.insertSelective(user);
  }

  /**
   * 更新一条数据
   */
  @Override
  public Integer updateById(User user) {
//        return userDao.updateById1(user.getUserName(), user.getAge(), user.getId());
    return userMapper.updateById2(user);
  }

  /**
   * 删除一条数据
   */
  @Override
  public Integer deleteById(Long id) {
//        return userDao.deleteById1(id);
    return userMapper.deleteById2(id);
  }

  /**
   * 事务控制测试--删除id1和id2两条数据
   */
  @Override
  @Transactional(rollbackFor = Exception.class)
  public Integer transactionTest(Long id1, Long id2) {
    try {
      userMapper.deleteById1(id1);
      userMapper.deleteById1(id2);
      int a = 0;
      int b = 10 / a;//模拟抛出异常
    } catch (Exception e) {
      TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
      return 0;
    }
    return 1;
  }
}

 

6.6 Crear clase api de capa de control

      Cree la clase api de la capa de control: UserController.java

import com.hc.mybatisdemo.entity.User;
import com.hc.mybatisdemo.service.IUserService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户控制器
 */
@RestController
@RequestMapping(value = "/user")
public class UserController {

  @Autowired
  private IUserService userService;

  /**
   * 根据id查询
   */
  @GetMapping(value = "findOne")
  public User findOne(Long id) {
    User user = userService.findOne(id);
    return user;
  }

  /**
   * 根据用户名获取用户列表
   */
  @GetMapping(value = "findByUserName")
  public List<User> findByUserName(String userName) {
    return userService.findByUserName(userName);
  }

  /**
   * 新增一条数据
   */
  @PostMapping(value = "insert")
  public Integer insert(@RequestBody User user) {
    return userService.insert(user);
  }

  /**
   * 更新一条数据
   */
  @PutMapping(value = "update")
  public Integer update(@RequestBody User user) {
    return userService.updateById(user);
  }

  /**
   * 根据用户名获取用户列表
   */
  @DeleteMapping(value = "delete")
  public Integer delete(Long id) {
    return userService.deleteById(id);
  }

  /**
   * 事务控制测试
   */
  @GetMapping(value = "transactionTest")
  public Integer transactionTest(Long id1, Long id2) {
    return userService.transactionTest(id1, id2);
  }
}

 

7 API de prueba

7.1 Consultar un dato basado en id

      Consultar los datos con id 2.

 

7.2 Consulta difusa

      Consulta difusa izquierda. Consulte los datos del nombre de usuario que terminan en "Cinco".

 

7.3 Guardar un dato

      Inserte un registro con el nombre de usuario "Old Seven".

      Guarde el resultado:

 

7.4 Actualizar un dato

      Actualice el nombre de usuario de los datos con id 5 a "Old Qiqi" y la edad a 75.

      Resultados después de la actualización:

 

7.5 Eliminar un dato

      Elimina los datos con id 5.

      Resultados después de la eliminación:

 

7.6 Prueba de control de transacciones (Transacción)

      Llame a la interfaz api de prueba de control de transacciones (la capa comercial de la interfaz eliminará los dos datos con id 1 y 2), pero enterramos artificialmente un código que arroja una excepción (int b = 10 / a;). Resultado ideal: debido a que el código genera una excepción, no se eliminará ninguno de los dos datos, ¡porque la transacción se revierte!

      Llame a la interfaz y elimine los dos datos con id 1 y 2:

      Los resultados de la prueba son los siguientes, se puede ver que la transacción se revierte. Los datos con id 1 y 2 no se eliminaron correctamente. Demuestre la atomicidad y consistencia de las operaciones de MySQL en la misma transacción.

      Siga la cuenta pública de WeChat y responda " Quiero el código fuente integrado de mybatis " para obtener el código fuente mybatis-demo de este tutorial de forma gratuita ~

Supongo que te gusta

Origin blog.csdn.net/IT_Most/article/details/109198677
Recomendado
Clasificación