天天看點

Mybatis plus案例

前言

  • 當表名為user時,會多生成2個實體類
  • Mybatis plus案例
    Mybatis plus案例
  • 正常情況下生成的類
  • Mybatis plus案例
  • 測試是否可以直接在目前​

    ​mybatis代碼生成器的項目​

    ​中開發
  • Mybatis plus案例
  • 啟動項目後測試,發現目前項目隻能用來生成代碼
  • Mybatis plus案例
  • 即使項目添加所需的開發依賴,啟動項目後依然無法找到接口​

    ​path​

    ​,或者報依賴沖突的錯誤
  • Mybatis plus案例
  • 解決方案,參考​

    ​gitee/chnx/cloud/seata/seata01​

    ​項目重新建構一個項目,将生成的代碼複制到新項目中
  • ​案例要求​

# 使用代碼生成器生成代碼
# 工具類:傳回對象工具類、分頁對象工具類
# 使用分頁、分頁連接配接查詢
# 傳入參數為對象、集合、集合對象      

案例一

  • ​使用mybatis代碼生成器生成代碼​

  • 使用的​

    ​mybatis代碼生成器項目案例​

    ​是gitee/chenx/mybatis-geneator
  • 未使用該方式開發的原因:
# 在該代碼生成器項目中生成代碼後,無法直接在該項目上繼續開發
# 将生成的代碼複制到1個建立的項目,需修改每個類的路徑,已經違背了使用代碼生成器的初衷      

案例二

  • ​​案例位址​​
  • ​使用mybatis plus代碼生成器生成代碼​

  • 首先​​參考​​​

    ​案例二​

    ​生成代碼
  • 生成代碼後,将pom.xml中的依賴删除,将application.properties中的配置删除,并重命名為application.yml
  • 注釋掉​

    ​測試類​

    ​中的main方法
  • 之後​​參考​​建構mybatis plus項目
  • 将maven配置為3.6.1或IDE自帶的maven,否者某些依賴無法導入
  • 導入如下依賴

點選檢視詳情

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.73</version>
        </dependency>
        <!-- 以下為代碼生成器中的依賴 -->
        <!-- freemarker模闆和velocity模闆依賴,後面配置的時候會2選其1 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>
        <!-- swagger -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.20</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.22.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>      
  • 編寫yml

點選檢視詳情

server:
  port: 8080

spring:
  application:
    name: mybatisplus
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.0.102:3306/dbtest?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
  mvc:
    view:
      suffix: ".html"

mybatis:
  configuration:
    map-underscore-to-camel-case: true
  mapperLocations: classpath:mapper/*.xml

logging:
  level:
    com:
      chnq:
        mybatisplus: debug      
  • 配置啟動類

點選檢視詳情

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

@SpringBootApplication
@MapperScan("com.chnq.mybatisplus.mapper")
public class MybatisplusApplication {

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

}      
  • 編寫mybatis plus 配置類

點選檢視詳情

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
 
@EnableTransactionManagement
@Configuration
@MapperScan("com.chnq.mybatisdemo.mapper")
public class MybatisPlusConfig {
 
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
 
}      
  • 檢查實體類中的​

    ​注解配置​

  • 檢查mapper層注解
  • 檢查service層注解,并注入mapper
  • 檢查controller層注解,并注入mapper、service
  • 在controller層調用mapper對象和service對象中的方法進行測試

點選檢視詳情

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

    @Resource
    UserService userService;

    @Resource
    UserMapper userMapper;

    // 測試
    // 調用service層接口查詢所有
    @GetMapping("/getUsers")
    public String getUserList(){
        List<User> user = userService.list();
        System.out.println(user);
        return RespResult.success("擷取成功!", user);
    }

    // 調用mapper層接口查詢所有
    @GetMapping("/getUsers2")
    @ResponseBody
    public String getUserTest(){
        List<User> users = userMapper.selectList(null);
        users.forEach(user-> System.out.println("user = " + user));
        return RespResult.success("擷取成功!", users);
    }

}      
  • 在service層和controller層注入對象時,​

    ​無法注入​

    ​,是因為之前使用代碼生成器的依賴被删除了,之後重新配置了mybatis plus開發所需的依賴,導緻還有緩存
  • 解決方案​​參考​​
  • Mybatis plus案例
  • 配置工具類
  • ​編寫req​

點選檢視詳情

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;

@Data
public class UserBookReq implements Serializable {
    private static final long serialVersionUID = 1L;

    // 使用者名
    private String username;

    // 性别
    private String sex;

    // 書名
    private String bookname;

    // 作者
    private String author;

    // 價格
    private BigDecimal price;

    // 目前頁
    private int pageNum = 1;

    // 每頁條數
    private int pageSize = 5;

}      
  • ​編寫resp​

點選檢視詳情

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

@Data
public class UserBookResp implements Serializable {
    private static final long serialVersionUID = 1L;

    private Integer uId;

    private String username;

    private String password;

    private String sex;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;

    private Integer bId;

    private String bookname;

    private String author;

    private BigDecimal price;

}      
  • ​編寫mapper​

點選檢視詳情

@Mapper
public interface UserMapper extends BaseMapper<User> {

    // 連接配接查詢
    List<User> findUser();

    // 分頁查詢
    List<User> findUsers();

    // 分頁連接配接查詢
    List<UserBookResp> getUserBook(UserBookReq userBookReq);

}      
  • ​編寫mapper.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.chnq.mybatisplus.mapper.UserMapper">

    <!-- 連接配接查詢 -->
    <select id="findUser" resultType="com.chnq.mybatisplus.entity.User">
        select u.id, u.username, u.password, u.sex, u.birthday, b.id, b.bookname, b.author, b.price from user u inner join book b on u.username = b.author;
    </select>
    <!-- 連接配接查詢:第3條開始的3條資料 -->
    <select id="findUsers" resultType="com.chnq.mybatisplus.entity.User">
        SELECT * FROM user LIMIT 2,3;
    </select>

    <!-- 分頁連接配接查詢 -->
    <select id="getUserBook" resultType="com.chnq.mybatisplus.resp.UserBookResp">
        select u.id, u.username, u.password, u.sex, u.birthday, b.id, b.bookname, b.author, b.price
        from user u inner join book b on u.username = b.author
        where
        <if test="username != null">
            u.username = #{username}
        </if>
        <if test="sex != null">
            or u.sex = #{sex}
        </if>
        <if test="bookname != null">
            or b.bookname = #{bookname}
        </if>
        <if test="author != null">
            or b.author = #{author}
        </if>
        <if test="price != null">
            or b.price = #{price}
        </if>
        <if test="pageNum !=null and pageSize != null">
            limit #{pageNum}, #{pageSize}
        </if>
    </select>

</mapper>      
  • ​編寫service​

點選檢視詳情

public interface UserService extends IService<User> {

    // 連接配接查詢
    List<User> findUser();

    // 分頁查詢
    List<User> findUsers();

    // 分頁連接配接查詢
    List<UserBookResp> getUserBook(UserBookReq userBookReq);

}      
  • ​編寫service實作類​

點選檢視詳情

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public List<User> findUser() {
        return userMapper.findUser();
    }

    @Override
    public List<User> findUsers() {
        return userMapper.findUsers();
    }

    @Override
    public List<UserBookResp> getUserBook(UserBookReq userBookReq) {
        return userMapper.getUserBook(userBookReq);
    }

}      
  • ​編寫controller​

點選檢視詳情

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

    @Resource
    UserMapper userMapper;

    // 連接配接查詢
    @GetMapping("/userList")
    @ResponseBody
    public String UserList(){
        List<User> users = userMapper.findUser();
        users.forEach(user-> System.out.println("user = " + user));
        return RespResult.success("擷取成功!", users);
    }

    // 分頁查詢
    @GetMapping("/usersList")
    @ResponseBody
    public String UsersList(){
        List<User> users = userMapper.findUsers();
        users.forEach(user-> System.out.println("user = " + user));
        return RespResult.success("擷取成功!", users);
    }

    // 分頁連接配接查詢
    @RequestMapping(value = "/listAll", method = RequestMethod.POST)
    public List<UserBookResp> listAll(@RequestBody UserBookReq req){
        return userService.getUserBook(req);
    }

}      
  • 測試

繼續閱讀