IDEA項目搭建八——使用MybatisPlus簡化數據庫交互


一、MybatisPlus簡化數據庫交互

我們使用Mybatis發現需要在mapper.xml中寫很多重復的簡單CRUD(增刪改查),使用MybatisPlus可以大大簡化這部分代碼,官方文檔http://mp.baomidou.com/

二、引入MybatisPlus

先看一下我的項目結構,我們一步一步來編寫這個Demo,我的Model對象是一個獨立模塊,所以請自行修改自己的實體對象

1、創建一個Maven項目引入spring boot,打開pom.xml增加以下引入,其中包括alibaba連接池druid、mysql數據庫連接插件、mybatis-plus插件,切記不要引入mybatis及mybatis spring可能會有沖突

    <dependencyManagement>
        <dependencies>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--import druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--import mysql connector-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.9</version>
        </dependency>
        <!--import mybatis plus 它會自動引入mybatis及mybatis spring切勿重復引用以免沖突-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>

2、建立resources文件夾並創建application.yml配置文件,增加以下配置,主要數據庫連接、mapper.xml、model實體的位置需要自己調整

#設置提供的服務名
spring:
  application:
    name: javademo-tyh-service-base
  #配置數據庫
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://10.11.12.237:3306/tyh_test?useUnicode=true&characterEncoding=utf8
    username: root
    password: root

#設置自己啟動的端口
server:
  port: 12000

#mybatis plus
mybatis-plus:
  #指明mapper.xml掃描位置(classpath* 代表編譯后類文件根目錄)
  mapper-locations: classpath*:/mapper/**Mapper.xml
  #指明實體掃描(多個package用逗號或者分號分隔)
  typeAliasesPackage: javademo.tyh.model.base;javademo.tyh.model.hotel;
  global-config:
    #主鍵類型 0:數據庫ID自增, 1:用戶輸入ID,2:全局唯一ID (數字類型唯一ID), 3:全局唯一ID UUID
    id-type: 0
    #字段策略(拼接sql時用於判斷屬性值是否拼接) 0:忽略判斷,1:非NULL判斷,2:非空判斷
    field-strategy: 2
    #駝峰下划線轉換含查詢column及返回column(column下划線命名create_time,返回java實體是駝峰命名createTime,開啟后自動轉換否則保留原樣)
    db-column-underline: true
    #是否動態刷新mapper
    refresh-mapper: false
    #數據庫大寫命名下划線轉換
    #capital-mode: true

  3、在resources文件夾下創建mapper文件夾用於存放所有的mapper.xml文件,創建UserMapper.xml文件編寫一個自定義sql

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 指明當前xml對應的Mapper -->
<mapper namespace="javademo.tyh.service.base.mapper.UserMapper">
    <select id="listCount" resultType="Integer">
      select count(*) from user_info;
    </select>
</mapper>

  4、打開main方法所在類,修改代碼指明掃描mapper接口所在包的位置

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

@SpringBootApplication
@MapperScan("javademo.tyh.service.base.mapper")//標記掃描的mapper位置
public class AppServiceBase
{
    public static void main( String[] args )
    {
        SpringApplication.run(AppServiceBase.class,args);
    }
}

 5、創建config文件夾用於存放mybatisplus的插件配置,目前只需要一個分頁插件

import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MybatisPlusConfig {
    // 分頁攔截器
    @Bean
    public PaginationInterceptor paginationInterceptor(){
        return new PaginationInterceptor();
    }
}

 6、創建mapper文件夾用於存放底層與xml的關聯mapper接口,要繼承BaseMapper並傳遞一個Model對象當作泛型,再寫一個自定義方法

import com.baomidou.mybatisplus.mapper.BaseMapper;
import javademo.tyh.model.base.UserModel;
import org.springframework.stereotype.Component;

@Component
public interface UserMapper extends BaseMapper<UserModel> {
    //自定義方法
    int listCount();
}

 7、創建service文件夾用於存放業務操作邏輯,此時自動注入mapper后可以調用很多mybatis plus提供的方法,基本的CRUD都不需要單獨寫了

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import javademo.tyh.model.base.UserModel;
import javademo.tyh.service.base.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {

    @Autowired
    UserMapper mapper;

    public int insert(UserModel model) {
        return mapper.insert(model);
    }
    public int delete(int id) {
        return mapper.deleteById(id);
    }
    public int update(UserModel model) {
        //更新全部字段,但可以跟application.yml中的field-strategy字段策略相配合,不更新為null或為空的字段
        return mapper.updateById(model);
        //更新全部字段,且不可為NULL
        //return mapper.updateAllColumnById(model);
    }
    public UserModel get(int id) {
        return mapper.selectById(id);
    }
    public List<UserModel> list() {
        EntityWrapper ew = new EntityWrapper();
        ew.where("1={0}", 1);
        return mapper.selectList(ew);
    }
    //調用自定義方法
    public int listCount(){
        return mapper.listCount();
    }
}

 8、創建controller文件夾用於接收請求和測試

import javademo.tyh.model.base.UserModel;
import javademo.tyh.service.base.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.time.LocalDateTime;
import java.util.List;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private DiscoveryClient client;

    @Autowired
    UserService service;

    @ResponseBody
    @RequestMapping("/insert")
    public int insert() {
        UserModel model = new UserModel();
        model.setUsername("taiyonghai");
        model.setPassword("111111");
        model.setSex(1);
        model.setAge(30);
        model.setCreateTime(LocalDateTime.now());
        return service.insert(model);
    }

    @ResponseBody
    @RequestMapping("/delete")
    public int delete(int id) {
        return service.delete(id);
    }

    @ResponseBody
    @RequestMapping("/update")
    public int update() {
        UserModel model = new UserModel();
        model.setId(1);
        model.setUsername("taiyonghai"+LocalDateTime.now());
        model.setPassword("111111");
        model.setSex(1);
        model.setAge(30);
        return service.update(model);
    }

    @ResponseBody
    @RequestMapping("/get")
    public UserModel get(int id) {
        return service.get(id);
    }

    @ResponseBody
    @RequestMapping("/list")
    public List<UserModel> list() {
        List<UserModel> list = service.list();
        return list;
    }

    @ResponseBody
    @RequestMapping("/listCount")
    public int listCount() {
        return service.listCount();
    }
}

 9、標記Model實體的注解,我就不粘貼get/set方法了自己生成吧

import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;

import java.io.Serializable;
import java.time.LocalDateTime;

//標記表名(此注解為必須,下面的字段注解可選)
@TableName("user_info")
public class UserModel implements Serializable {
    //標記數據表主鍵
    @TableId(value = "id", type = IdType.AUTO)
    private int id;
    private String username;
    private String password;
    private int sex;
    private int age;
    private LocalDateTime createTime;
    //標記數據表中不存在的字段
    @TableField(exist = false)
    private String showName;
    //標記數據表中的column名
    @TableField("username")
    private String showUsername;
}

由於我的模塊Model是獨立的所以需要對Model模塊增加pom.xml引用,由於不需要跟spring boot自動注入有什么關系所以直接只引用基本的即可

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>2.3</version>
</dependency>

OK ,到此我們的MybatisPlus就引入完成,運行http://localhost:12000/user/list測試一下效果,官方文檔中推薦使用IService及ServiceImpl的接口及實現類的方式,這部分可以簡化,簡化后的效果就是這個Demo的樣子

 

注意:由於兩個模塊需要mybatis plus我有個父級pom.xml,而pom.xml文件有上下級繼承關系,如果父級有用到xxx-xxx-boot-starter的組件引用,子模塊中卻沒有相應的配置注入則會提示錯誤,要在main()方法對應的類中增加注解來解決

@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)//禁止tomcat DataSource注入到spring boot中
@SpringBootApplication
public class AppEureka
{
    public static void main( String[] args ) {
        SpringApplication.run(AppEureka.class, args);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM