SpringbootはMybatisを統合して、追加、削除、変更、チェックを実現します

普通はたった2つの言葉です:怠惰と怠惰;
成功はたった2つの言葉:苦難と勤勉;
卓越性はたった2つの言葉:あなたと私です。
私に従って、JAVA、春の家族のバケツ、Linuxの操作と保守の知識を0から学び、無知なティーンエイジャーから人生の頂点にあなたを連れて行き、Bai Fumeiと結婚してください!
WeChatパブリックアカウント[ ITは非常に信頼性が高い]をフォローし、技術的な経験を毎日共有してください〜  

 

SpringbootはMybatisを統合して、追加、削除、変更、チェックを実現します

 1はじめに      

      多くの永続化レイヤーフレームワークがあります。一般的な永続化レイヤーフレームワークの実装には、spring-data-jpa、mybatis(mybatis-plus)、および休止状態が含まれます。このチュートリアルでは、mybatis永続化レイヤーフレームワークを例として取り上げ、mybatisフレームワークを統合するspringbootのプロセスを詳しく説明し、最後に注釈とxmlを使用してデータの追加、削除、および変更(CRUD)操作を実現します。

 

2 mybatisとは何ですか?

      mybatisの公式ドキュメントでの説明:MyBatisは、カスタムSQL、ストアドプロシージャ、および高度なマッピングをサポートする優れた永続化レイヤーフレームワークです。MyBatisは、ほとんどすべてのJDBCコードと、パラメーターの設定および結果セットの取得の作業を排除します。MyBatisは、単純なXMLまたは注釈を介して、プリミティブタイプ、インターフェイス、およびJava POJO(プレーンオールドJavaオブジェクト)をデータベース内のレコードとして構成およびマッピングできます。

      つまり、mybatisはデータベース操作の多くのカプセル化を行っているため、開発者はそれをすぐに使用して開発コストを削減できます。同時に、mybatisはアノテーションとxmlマッピングメソッドの両方をサポートし、ネイティブsqlのサポートも提供します。

 

3スプリングブートプロジェクトを作成します

      springbootプロジェクトを作成するプロセスは非常に単純であり、ここでは省略されています。以下は、ビルドされたspringbootプロジェクトのディレクトリ構造です。

      プロジェクト名:mybatis-demo

 

4mysqlデータベースをインストールします

4.1mysqlデータベースをインストールします      

      少し!WeChatパブリックアカウントに注意してください:ITは非常に信頼性が高く、「mysqlインストールチュートリアルが欲しい返信して無料で受け取ります〜

 

4.2テーブルを作成してデータを初期化する

      mysqlデータベースの接続情報は次のとおりです。

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

       作成されたデータベーステーブル:user_tデータベーステーブルuser_t 一意のインデックスを追加します。インデックスフィールドはmobile、インデックス名はudx_user_mobileです。テーブルを作成するためのsqlスクリプトは次のとおりです。

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;

 

     

      まず、クエリテストのために次の4つのデータをuser_tデータベーステーブルに挿入しましょう。

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スプリングブーツ統合mybatis

5.1jarパッケージの紹介

      mysqlデータベースドライバー、データベース接続プール、およびmybatis関連の依存関係パッケージをプロジェクトpom.xmlファイルに追加します。

    <!--持久化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データソースの構成

      application.propertiesまたはapplication.yml構成ファイルに次の構成を追加します。

      1)データソースを構成します

      2)Mapper.xmlリソースファイルのパスを指定します

      3)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スキャンマッパーインターフェイス

//注意这里需要引入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);
  }
}

 

6CRUDを追加および削除するコードを記述します

6.1エンティティクラスの作成

       エンティティクラス:  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マッパーインターフェイスクラスの作成

      マッパーインターフェイスクラス: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.3UserMapper.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ビジネスレイヤーインターフェイスクラスの作成

      ビジネスレイヤーインターフェイスクラスを作成します: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ビジネスレイヤーインターフェイス実装クラスを作成する

      ビジネスレイヤーインターフェイス実装クラスを作成します: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コントロールレイヤーのapiクラスを作成する

      コントロールレイヤーのapiクラスを作成します: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

7.1IDに基づいてデータをクエリする

      ID2のデータを照会します。

 

7.2ファジークエリ

      ファジークエリを残しました。「Five」で終わるユーザー名データを照会します。

 

7.3データを保存する

      ユーザー名「OldSeven」のレコードを挿入します。

      結果を保存します。

 

7.4データを更新する

      ID 5のデータのユーザー名を「OldQiqi」に、年齢を75に更新します。

      更新後の結果:

 

7.5データの一部を削除する

      ID5のデータを削除します。

      削除後の結果:

 

7.6トランザクション制御(トランザクション)テスト

      トランザクション制御テストapiインターフェイスを呼び出します(インターフェイスのビジネスレイヤーはID 1と2の2つのデータを削除します)が、例外をスローするコードを人為的に埋めました(int b = 10 / a;)。理想的な結果:コードが例外をスローするため、トランザクションがロールバックされるため、2つのデータはどちらも削除されません。

      インターフェイスを呼び出し、ID1と2の2つのデータを削除します。

      テスト結果は次のとおりです。トランザクションがロールバックされていることがわかります。ID1および2のデータは正常に削除されませんでした。同じトランザクションでMySQL操作の原子性と一貫性を証明します。

      WeChatパブリックアカウントをフォローし、「mybatis統合ソースコードが欲しい」と返信して、このチュートリアルのmybatis-demoソースコードを無料で入手してください〜

おすすめ

転載: blog.csdn.net/IT_Most/article/details/109198677