Springboot integra Mybatis para realizar adição, exclusão, modificação e verificação

Comum é apenas duas palavras: preguiça e preguiça;
sucesso é apenas duas palavras: dificuldade e diligência;
excelência são apenas duas palavras: você e eu.
Siga-me para aprender JAVA, balde da família de primavera e conhecimento de operação e manutenção do Linux a partir de 0, e levá-lo de um adolescente ignorante ao auge da vida, e se casar com Bai Fumei!
Siga a conta pública do WeChat [ TI é muito confiável ] e compartilhe experiência técnica todos os dias ~  

 

Springboot integra Mybatis para realizar adição, exclusão, modificação e verificação

 1. Introdução      

      Existem muitos frameworks de camada de persistência e implementações comuns de framework de camada de persistência incluem spring-data-jpa, mybatis (mybatis-plus) e hibernate. Este tutorial tomará a estrutura da camada de persistência mybatis como um exemplo para detalhar o processo de springboot integrando a estrutura mybatis e, finalmente, realizar a operação de adição, exclusão e modificação de dados (CRUD) por meio de anotação e xml.

 

2 O que é mybatis?

      Explicação no documento oficial mybatis: MyBatis é uma excelente estrutura de camada de persistência que suporta SQL personalizado, procedimentos armazenados e mapeamento avançado. MyBatis elimina quase todo o código JDBC e o trabalho de definir parâmetros e obter conjuntos de resultados. MyBatis pode configurar e mapear tipos primitivos, interfaces e POJOs Java (Plain Old Java Objects) como registros no banco de dados através de XML simples ou anotações.

      Ou seja, mybatis encapsulou muito as operações do banco de dados, para que os desenvolvedores possam usá-lo imediatamente e reduzir os custos de desenvolvimento. Ao mesmo tempo, mybatis suporta métodos de mapeamento de anotação e xml e também oferece suporte para sql nativo.

 

3 Crie um projeto springboot

      O processo de criação de um projeto springboot é muito simples e foi omitido aqui. A seguir está a estrutura de diretório do projeto springboot que foi construído.

      Nome do projeto: mybatis-demo

 

4 Instale o banco de dados mysql

4.1 Instalar banco de dados mysql      

      levemente! Preste atenção à conta pública do WeChat: TI é muito confiável , responda " Eu quero o tutorial de instalação do mysql " para recebê-lo gratuitamente ~

 

4.2 Criar tabela e inicializar dados

      As informações de conexão do banco de dados mysql são as seguintes:

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

       Tabela de banco de dados criada : user_t ,  adicione um índice exclusivo à tabela de banco de dados user_t. O campo de índice é: mobile e o nome do índice: udx_user_mobile. O script sql para criar a tabela é o seguinte:

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;

 

     

      Vamos primeiro inserir os 4 dados a seguir na tabela de banco de dados user_t para teste de consulta!

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 springboot integra mybatis

5.1 Apresentando o pacote jar

      Adicione driver de banco de dados mysql, pool de conexão de banco de dados e pacotes de dependência relacionados a mybatis ao arquivo pom.xml do projeto.

    <!--持久化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 fonte de dados

      Inclua a seguinte configuração no arquivo de configuração application.properties ou application.yml.

      1) Configure a fonte de dados

      2) Especifique o caminho do arquivo de recurso Mapper.xml

      3) Abra o log do 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 Interface do 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 Escreva o código para adicionar e excluir CRUD

6.1 Criar classe de entidade

       Classe de entidade:  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 Criar Classe de Interface do Mapeador

      Classe de interface do mapeador: 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 Criar 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 Criar Classe de Interface de Camada de Negócios

      Crie uma classe de interface da camada de negócios: 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 Criar uma classe de implementação de interface da camada de negócios

      Crie uma classe de implementação de interface da camada de negócios: 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 Criar classe de API de camada de controle

      Crie a classe de API da camada de controle: 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 teste

7.1 Consultar um dado com base na id

      Consulte os dados com id 2.

 

7.2 Consulta Fuzzy

      Consulta difusa à esquerda. Consulte os dados do nome do usuário que terminam em "Five".

 

7.3 Salvar um dado

      Insira um registro com o nome de usuário "Old Seven".

      Salve o resultado:

 

7.4 Atualizar um dado

      Atualize o nome de usuário dos dados com id 5 para "Old Qiqi" e a idade para 75.

      Resultados após atualização:

 

7.5 Excluir um dado

      Exclua os dados com id 5.

      Resultados após exclusão:

 

7.6 Teste de controle de transação (transação)

      Chame a interface de API de teste de controle de transação (a camada de negócios da interface excluirá os dois dados com id 1 e 2), mas enterramos artificialmente um código que lança uma exceção (int b = 10 / a;). Resultado ideal: como o código lança uma exceção, nenhum dos dois dados será excluído, pois a transação é revertida!

      Chame a interface e exclua os dois dados com id 1 e 2:

      Os resultados do teste são os seguintes, pode-se ver que a transação foi revertida. Os dados com id 1 e 2 não foram excluídos com sucesso. Prove a atomicidade e consistência das operações do MySQL na mesma transação.

      Siga a conta pública do WeChat e responda " Eu quero código-fonte integrado mybatis " para obter o código-fonte mybatis-demo deste tutorial gratuitamente ~

Acho que você gosta

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