SpringBoot整合Mybatis入门

641 阅读3分钟

前言

SpringBoot加上Mybatis是如今Java Web开发的标配。因为作者现在在开发自己的一个小项目,也是用到该开发模式。所以今天就讨论如何整合SpringBootMybatis

创建SpringBoot基础项目

使用IntelliJ IDEASpring Initializr初始化创建一个SpringBoot项目。因为过程比较简单,具体的创建过程本文就不再深究了。创建完成后的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.woailqw</groupId>
  <artifactId>simple-vote</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>simple-vote</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>org.junit.vintage</groupId>
          <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.1.3</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

配置数据源

基础项目创建完成后,就需要配置数据源,让SpringBoot可以连接到对应的数据库,本文使用的是MySQL数据源。连接池使用Hikari。具体数据源Java配置如下:

package com.woailqw.simplevote.config;

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Data source config.
 *
 * @author Jack Pan
 * @version 1.00 2020-08-10
 */
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource dataSource() {
        return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }
}

因为这里使用了自定义的@ConfigurationProperties,所以在application.properties(或者application.yaml)中使用该前缀(本文中为app.datasource),具体的application.properties配置文件信息如下:

app.datasource.jdbc-url=jdbc:mysql://localhost:3306/vote-sys?useUnicode=true&characterEncoding=utf-8
app.datasource.username=root
app.datasource.password=1234
app.datasource.maximum-pool-size=30
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver

MyBatis配置

使用Mybatis的起步依赖后,Mybatis会自动检测数据源,因为本文中使用的是单数据源,就不需要再进行显性配置了。现在则需要配置Mybatis xml和Mapper Dao的映射配置。本文使用一个常见的用户模块例子来进行阐述。
1.定义一个User类,如下:

package com.woailqw.simplevote.entity;

import java.time.LocalDateTime;

/**
 * user class
 *
 * @author Jack Pan
 * @version 1.0 2020-08-08
 */
public class User extends BaseEntity {

    private String loginName;

    private String password;

    private String mobile;

    private String name;

    private String userType;

    private String loginIp;

    private LocalDateTime loginDate;

    private String loginFlag;

    /**
     * Gets loginName.
     *
     * @return Value of loginName.
     */
    public String getLoginName() {
        return this.loginName;
    }

    /**
     * Sets loginName.
     *
     * @param loginName Simple param.
     */
    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    /**
     * Gets password.
     *
     * @return Value of password.
     */
    public String getPassword() {
        return this.password;
    }

    /**
     * Sets password.
     *
     * @param password Simple param.
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Gets mobile.
     *
     * @return Value of mobile.
     */
    public String getMobile() {
        return this.mobile;
    }

    /**
     * Sets mobile.
     *
     * @param mobile Simple param.
     */
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    /**
     * Gets name.
     *
     * @return Value of name.
     */
    public String getName() {
        return this.name;
    }

    /**
     * Sets name.
     *
     * @param name Simple param.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Gets userType.
     *
     * @return Value of userType.
     */
    public String getUserType() {
        return this.userType;
    }

    /**
     * Sets userType.
     *
     * @param userType Simple param.
     */
    public void setUserType(String userType) {
        this.userType = userType;
    }

    /**
     * Gets loginIp.
     *
     * @return Value of loginIp.
     */
    public String getLoginIp() {
        return this.loginIp;
    }

    /**
     * Sets loginIp.
     *
     * @param loginIp Simple param.
     */
    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }

    /**
     * Gets loginDate.
     *
     * @return Value of loginDate.
     */
    public LocalDateTime getLoginDate() {
        return this.loginDate;
    }

    /**
     * Sets loginDate.
     *
     * @param loginDate Simple param.
     */
    public void setLoginDate(LocalDateTime loginDate) {
        this.loginDate = loginDate;
    }

    /**
     * Gets loginFlag.
     *
     * @return Value of loginFlag.
     */
    public String getLoginFlag() {
        return this.loginFlag;
    }

    /**
     * Sets loginFlag.
     *
     * @param loginFlag Simple param.
     */
    public void setLoginFlag(String loginFlag) {
        this.loginFlag = loginFlag;
    }
}

2.定义一个UserMapper类,用来获取数据库数据记录,具体如下:

package com.woailqw.simplevote.dao;

import com.woailqw.simplevote.entity.User;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;

/**
 * User mapper.
 *
 * @author Jack Pan
 * @version 1.00 2020-08-10
 */
@Mapper
public interface UserMapper {

    /**
     * Save user.
     *
     * @param user User info
     * @return Effect rows
     */
    int save(User user);

    /**
     * User list.
     *
     * @return User list
     */
    List<User> list();
}

3.定义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.woailqw.simplevote.dao.UserMapper" >
  <!--<cache />-->
  <resultMap id="baseResultMap" type="com.woailqw.simplevote.entity.User" >
    <id column="id" property="id" javaType="java.lang.String" />
    <result column="create_by" property="createBy" javaType="java.lang.String" />
    <result column="create_date" property="createDate" javaType="java.time.LocalDateTime" />
    <result column="update_by" property="updateBy" javaType="java.lang.String" />
    <result column="update_date" property="updateDate" javaType="java.time.LocalDateTime" />
    <result column="remarks" property="remarks" javaType="java.lang.String" />
    <result column="del_flag" property="delFlag" javaType="java.lang.String" />
    <result column="login_name" property="loginName" javaType="java.lang.String" />
    <result column="password" property="password" javaType="java.lang.String" />
    <result column="mobile" property="mobile" javaType="java.lang.String" />
    <result column="name" property="name" javaType="java.lang.String" />
    <result column="user_type" property="userType" javaType="java.lang.String" />
    <result column="login_ip" property="loginIp" javaType="java.lang.String" />
    <result column="login_flag" property="loginFlag" javaType="java.lang.String" />
    <result column="login_date" property="loginDate" javaType="java.time.LocalDateTime" />
  </resultMap>

  <select id="list" resultMap="baseResultMap">
      select * from user
  </select>

  <insert id="save" parameterType="com.woailqw.simplevote.entity.User">
    insert into user
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="loginName != null">
        login_name,
      </if>
      <if test="password != null">
        password,
      </if>
      <if test="name != null">
        name,
      </if>
      <if test="mobile != null">
        mobile,
      </if>
      <if test="userType != null">
        user_type,
      </if>
      <if test="loginIp != null">
        login_ip,
      </if>
      <if test="loginDate != null">
        login_date,
      </if>
      <if test="loginFlag != null">
        login_flag,
      </if>
      <if test="createBy != null">
        create_by,
      </if>
      <if test="createDate != null">
        create_date,
      </if>
      <if test="updateBy != null">
        update_by,
      </if>
      <if test="updateDate != null">
        update_date,
      </if>
      <if test="remarks != null">
        remarks,
      </if>
      <if test="delFlag != null">
        del_flag,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,javaType=java.lang.String},
      </if>
      <if test="loginName != null">
        #{loginName,javaType=java.lang.String},
      </if>
      <if test="password != null">
        #{password,javaType=java.lang.String},
      </if>
      <if test="name != null">
        #{name,javaType=java.lang.String},
      </if>
      <if test="mobile != null">
        #{mobile,javaType=java.lang.String},
      </if>
      <if test="userType != null">
        #{userType,javaType=java.lang.String},
      </if>
      <if test="loginIp != null">
        #{loginIp,javaType=java.lang.String},
      </if>
      <if test="loginDate != null">
        #{loginDate,javaType=java.time.LocalDateTime},
      </if>
      <if test="loginFlag != null">
        #{loginFlag,javaType=java.lang.String},
      </if>
      <if test="createBy != null">
        #{createBy,javaType=java.lang.String},
      </if>
      <if test="createDate != null">
        #{createDate,javaType=java.time.LocalDateTime},
      </if>
      <if test="updateBy != null">
        #{updateBy,javaType=java.lang.String},
      </if>
      <if test="updateDate != null">
        #{updateDate,javaType=java.time.LocalDateTime},
      </if>
      <if test="remarks != null">
        #{remarks,javaType=java.lang.String},
      </if>
      <if test="delFlag != null">
        #{delFlag,javaType=java.lang.String},
      </if>
    </trim>
  </insert>
</mapper>

4.最后将对应的文件路径在application.properties进行配置,配置如下:

#mybatis entity scan packages
mybatis.type-aliases-package=com.woailqw.simplevote.entity
#Mapper.xml location
mybatis.mapper-locations=classpath:mapper/*.xml

总结

以上配置完成后,在Controlloer类直接使用@Autowired注入UserMapper即可。至此,SpringBootMybatis轻量整合完成。