写此文的原因在于,由于软件版本迭代的太快了,网上的许多教程已经不合适了,同时有许多命令并不太懂其含义。
如果觉得本篇章对您有所帮助,希望能给我一个赞,稍稍鼓励一下,非常感谢。
传送门
首先创建一个Spring boot(Gradle)项目,具体教程与此入门教程传送门一致
安装相关依赖
Spring Boot
Maven:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
Gradle:
compile group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.1'
implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.1'
版本号version可以根据官方的进行具体的修改
其他配置
dependencies {
//SpringBoot 基础配置
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//Mybatis-plus(简称MP)依赖
implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.1'
//lombok java库依赖
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//devtool 用于配置热部署的,可以删去
developmentOnly 'org.springframework.boot:spring-boot-devtools:2.6.3'
//mysql数据库依赖
runtimeOnly 'mysql:mysql-connector-java'
//其他
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
配置 MapperScan 注解(打开Application类)这是Spring Boot的配置,Spring具体配置请参考官方文档
MapperScan里面的地址怎么填,我按照官方教程里面的com.baomidou.mybatisplus.samples.quickstart.mapper
然后发现会报错Process 'command 'C:/Program Files/Java/jdk-17.0.1/bin/java.exe'' finished with non-zero exit value 1
所以尝试根据目录修改如下(这里我用的还是jdk17,不过换成jdk8也一样会报错)
如果根据目录修改不行的话,也可以修改成com.baomidou.mybatisplus.core.mapper
关于目录下找不到mapper文件的解决方法(网上搜的,仅供参考)
- gradle默认只会把resource文件夹当成资源文件,如果你的mapper文件放在java目录,则编译后不会被进入编译输出目录,
- 只需在build.gradle中加入以下
sourceSets.main.resources.srcDirs = ["src/main/java","src/main/resources"]gradle
就会把java目录也当成资源目录,编译后会将mapper文件输出至目录
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
至此,安装配置已经基本完成
@MapperScan 可以指定要扫描的Mapper类的包的路径
package com.example.demo.user;
import com.baomidou.mybatisplus.annotation.TableName;
@TableName(value = "user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
@TableId
描述:主键注解
使用位置:实体类主键字段
更多注释传送们
在安装地方配置依赖
Gradle:
implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter-test', version: '3.5.1'
maven:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-test</artifactId>
<version>3.5.1</version>
</dependency>
我的build.gradle如下
plugins {
id 'org.springframework.boot' version '2.6.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
//spring boot 基础依赖
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//mybatis-plus 依赖
implementation group:'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.1'
//lombok java库依赖
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//mysql数据库依赖
runtimeOnly 'mysql:mysql-connector-java'
//其他
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
tasks.named('test') {
useJUnitPlatform()
}
我的application.properties配置如下
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
我的数据库名字是test,可以根据自己的数据库名字进行修改
(另,如果是jdk8的话可能需要在末尾加上?serverTimezone=GMT%2B8
就如上所示一致
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
@MybatisPlusTest
class MybatisPlusSampleTest {
@Autowired
private SampleMapper sampleMapper;
@Test
void testInsert() {
Sample sample = new Sample();
sampleMapper.insert(sample);
assertThat(sample.getId()).isNotNull();
}
}
然后实现以下内容,编写实体类User.java,User.java类中内容
import lombok.Data;
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
然后,可以直接使用Mybatis-plus让Usermapper继承BaseMapper的接口就可以了
package com.example.demo.user;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface Usermapper extends BaseMapper<User> {
}
添加测试类,进行功能测试 (根据官方调试也可以)
package com.example.demo;
import com.example.demo.user.User;
import com.example.demo.user.Usermapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
//@MybatisPlusTest
class DemoApplicationTests {
@Autowired
private Usermapper usermapper;
@Test
public void contextLoads() {
List<User> user = usermapper.selectList(null);
System.out.println(user);
}
}
如果运行不成功的话,可以尝试以下方法
1.检查实现的实体类是否符合要求,表名字是否符合,内容是否对应
2.尝试注释掉官方文档使用的 @MybatisPlusTest
3.在mapper的包中的Usermapper的类前面添加@Mapper
我的文件目录截图如下,
application.properties
plugins {
id 'org.springframework.boot' version '2.6.4'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
//spring boot 基础依赖
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'junit:junit:4.13.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//mybatis-plus 依赖
implementation group:'com.baomidou', name: 'mybatis-plus-boot-starter', version: '3.5.1'
//mybatis-plus 测试依赖
implementation group:'com.baomidou', name: 'mybatis-plus-boot-starter-test', version: '3.5.1'
//lombok java库依赖
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
//mysql数据库依赖
runtimeOnly 'mysql:mysql-connector-java'
//其他
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
//代码生成器(新)
implementation group:'com.baomidou', name: 'mybatis-plus-generator', version: '3.5.2'
//implementation "io.springfox:springfox-boot-starter:3.0.0"
}
tasks.named('test') {
useJUnitPlatform()
}
sourceSets.main.resources.srcDirs = ["src/main/java","src/main/resources"]
build.gradle如下
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#mybatis log
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
Assert.assertEquals();
及其重载方法:
- 如果两者一致, 程序继续往下运行.
- 如果两者不一致, 中断测试方法, 抛出异常信息
- 在Usermapper文件中的类前面是否添加了
@mapper
注释
注解 @MybatisPlusTest
的作用在于我们可以不用启动整个数据库,仅仅启动我们所需要的模块进行测试
#mybatis log
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这样就可以在控制台看到具体SQL和操作
通用Service CRUD封装IService接口,进一步封装CRUD采用 get
查询单行,remove
删除list
集合查询page
分页前缀命名方式区分Mapper层防止混淆。
插入一条记录,我是在测试类当中进行操作的
前提:User类中已经通过@data即lombok建立好了User类中一些构造方法等
我的User类
package com.example.demo.user;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
@TableName(value = "user")
public class User {
@Getter
@Setter
private Long id;
@TableField(value = "rname")
@Getter
@Setter
private String name;
@Setter
@Getter
private Integer age;
@Setter
@Getter
private String email;
public User(long l, String s, int i, String s1) {
this.id = l;
this.age = i;
this.name = s;
this.email = s1;
}
}
package com.example.demo;
import com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTest;
import com.example.demo.user.User;
import com.example.demo.mapper.Usermapper;
import lombok.Getter;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.cassandra.DataCassandraTest;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
//@MybatisPlusTest
class DemoApplicationTests {
@Autowired
private Usermapper usermapper;
@Test
public void contextLoads() {
List<User> user = usermapper.selectList(null);
System.out.println(user);
}
@Test
public void testInsert() {
User user1 = new User(11L, "111", 111, "[email protected]");
usermapper.insert(user1);
}
}
运行testInsert可以得到如下结果
假如想要使用@data的getter和setter去尝试是否能用或者可行
那么我们在user类中建立一个无参构造函数,然后测试类当中这么写
public void testInsert() {
User user2 = new User();
user2.setAge(222);
user2.setEmail("[email protected]");
user2.setId(22L);
user2.setName("222");
usermapper.insert(user2);
}
Error updating database. Cause: java.sql.SQL
类似错误。// 插入一条记录(选择字段,策略插入) 实体对象
boolean save(T entity);
// 插入(批量)实体对象集合
boolean saveBatch(Collection<T> entityList);
// 插入(批量)插入批次数量
boolean saveBatch(Collection<T> entityList, int batchSize);
// 根据 entity 条件,删除记录、实体对象
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除、实体对象封装操作类
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录、实体对象集合
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)、插入批次数量
boolean removeByIds(Collection<? extends Serializable> idList);
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
QAQ
以上内容实现后,基本入门了,后面的就可以根据官方文档进行实现了,就没有那么多由于版本不同的乱七八糟的错误了。
(问题全部以二级标题书写,并非格式错误,而是为了方便查询)
在网上搜索教程的过程中,可以发现许多的教程中编写的都是appication.yml,而从始至终都没有提及application.properties,为此便产生了疑问,二者是否是同一种东西,是否是版本不同的产物?
答案是,相似但不一致
通过短暂接触我们可以发现SpringBoot是经常的通过外部配置去定义属性的。
二者的差别在于加载顺序不同,以及yml分层比properties更为清晰
原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2459.html
H2是一個Java編寫的關係型資料庫,它可以被嵌入Java應用程式中使用,或者作為一個單獨的資料庫伺服器執行。 H2資料庫的前身是 HypersonicSQL,它的名字的含義是 Hypersonic2,但是它的代碼是從頭開始編寫的,沒有使用HypersonicSQL或者HSQLDB的代碼。
(来源维基百科)
Process 'command 'C:/Program Files/Java/jdk-17.0.1/bin/java.exe'' finished with non-zero exit value 1
类似错误时解决方法
server.port=8082
This happens when you have DB plugins in your project but you did not specify DB details in application.property file.
就是存在数据库插件,但是你没有进行相应的配置,所导致的错误,所以可以检查下相应配置是否有出现问题
添加@MapperScan(“com.xxx”)注解以后,com.xxx包下面的接口类,在编译之后都会生成相应的实现类,从而解决了Mapper要逐一进行注释的冗余。
(根据网上信息,@Mapper并不是在编译期间生成实现类,而是在运行时,通过动态代理生成的,来源)
另,MapperScan还可以同时注解多个包
@MapperScan("com.xxx", "com.yyy")
传送门
Mybatis-plus学习笔记
官方文档
Mybatis plus入门教程