前言
SpringBoot加上Mybatis是如今Java Web开发的标配。因为作者现在在开发自己的一个小项目,也是用到该开发模式。所以今天就讨论如何整合SpringBoot和Mybatis。
创建SpringBoot基础项目
使用IntelliJ IDEA的Spring 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即可。至此,SpringBoot和Mybatis轻量整合完成。