springboot2.0+大家应该都了解过吧,2.0+的配置跟1.5的配置其实差不多,有一些略微的不同。面对SSM的复杂配置,springboot+mybatis的整合是真的非常方便,接下来我会展示一些springboot2.0+mybatis的整合过程,也会提供2个已经实现并且直接使用的demo地址。还有2个报错注意点。
csdn下载地址:https://download.csdn.net/download/sneakyrogue/10939274
github下载地址:https://github.com/luxin763323387/springboot_mybatis_demo
1首先创建一个springboot项目
点击next
group 是你的包名
artifack是你的项目名
->next
勾一个Web吧,其实也无所谓后面直接pom 复制粘贴一波就有了。
->finish
OK,接下来我们就来一波CV操作
对pom.xml进行一波复制粘贴,吧dependencys 和 build里面替换一下
<?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 http://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.0.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cn.lx</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</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>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</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>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<dependencies>
<dependency>
<groupId> mysql</groupId>
<artifactId> mysql-connector-java</artifactId>
<version> 5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>package</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<!--允许移动生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆盖 -->
<overwrite>true</overwrite>
<!-- 自动生成的配置 -->
<configurationFile>
src/main/resources/mybatis-generator.xml
</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
OK,替换好后在idea的右下方会提示更新插件,更新。
我吗再去创建一个application文件,我一般喜欢用yml的格式 (复制粘贴的时候注意空格)
没用的文件夹我喜欢先删除,
server:
port: 8080 #端口号
spring:
datasource:
name: mysql_test
type: com.alibaba.druid.pool.DruidDataSource
druid:
filters: stat
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC #你的数据库
username: root #你的账户
password: root #你的密码
initial-size: 1
min-idle: 1
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 'x'
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
mybatis:
mapper-locations: classpath:mapping/*.xml #你的mybatis生成的xml文件
type-aliases-package: com.cn.lx.entity #你的实体类
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
returnPageInfo: check
在pom.xml中有个generator的生成 我们去创建一下。
CV一波
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接地址账号密码-->
<!--##需要修改-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/test" userId="root" password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成Model类存放位置-->
<javaModelGenerator targetPackage="com.cn.lx.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="mapping" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.cn.lx.dao" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--生成对应表及类名-->
<table tableName="t_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
我会在demo中放一个.sql的文件,到时候直接导入一下就OK了
使用generator自动生成。
OK生成成功。
接下来我们写一下service和controller 简单的测试一下。
创建好后再来一波cv
package com.cn.lx.service;
import com.cn.lx.entity.User;
public interface UserService {
int add(User user);
User queryById(Integer id);
}
package com.cn.lx.service.Impl;
import com.cn.lx.dao.UserMapper;
import com.cn.lx.entity.User;
import com.cn.lx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "userService")
public class DefaultUserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public int add(User user) {
return userMapper.insert(user);
}
@Override
public User queryById(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
}
package com.cn.lx.controller;
import com.cn.lx.entity.User;
import com.cn.lx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/test/")
public class UserCotroller {
@Autowired
private UserService userService;
@RequestMapping(value = "add",method = RequestMethod.POST)
public int add(User user){
return userService.add(user);
}
@RequestMapping(value = "queryUserInfo",method = RequestMethod.GET)
public User queryUserInfo(@RequestParam(name = "id")Integer id){
return userService.queryById(id);
}
}
serviceImpl 的@Service 注解要加上(value = "userService") ,其中@AutoWired 红线报错没事
最后不要忘记在 Application 添加@MapperScan注解 里面写自动生成的dao层
好接下来启动,(保佑不要报错)
OK,没有报错,用postman测试
数据库查询
OK基本整合就这样完成了 ,接下来说一下我遇到的写bug。
有时候generator 虽然开启了相同项目合并但还是会出现问题,我们看一下。
我们再次使用generator生成一次文件。里面对应的还都是只有一个,我run一下。
出问题了,说是UserMapper 重复
Result Maps collection already contains value for xxx.xx.xx.xx.xxxMapper.BaseResultMap
出现了这种错误需要把之前生成的文件删除重新生成。
所以,创建新的文件时要把generator 把之前的文件注释一下。