依赖
<?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.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.johnfnash.learn.mybatis</groupId>
<artifactId>springboot-mybatisplus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-mybatisplus</name>
<description>springboot-mybatisplus</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>com.baomidou</groupId>
<artifactId>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件
##端口号
server.port=8080
##数据库url
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false
##数据库用户名
spring.datasource.username=username
##数据库密码
spring.datasource.password=password
##数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
##日志级别
logging.level.com.johnfnash.learn.mybatisplus.mapper.UserMapper=debug
##mybatis-plus mapper xml 文件地址
mybatis-plus.mapper-locations=classpath*:mapper/*Mapper.xml
##mybatis-plus type-aliases 文件地址
mybatis-plus.type-aliases-package=com.johnfnash.learn.mybatisplus.entity
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
mybatis-plus.global-config.id-type=0
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
MybatisPlus配置类
下面设置了一下数据库方言类型。
package com.johnfnash.learn.mybatisplus.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
// 设置方言类型
page.setDialectType("mysql");
return page;
}
}
实体类
package com.johnfnash.learn.mybatisplus.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
@TableName("tb_user")
public class User {
//新增时会自动设置主键ID的值
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
// 如果属性名与数据库的字段名一致或者可以转换(驼峰转下划线...),可以不添加下面的注解
//@TableField(value = "name")
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
// getter, setter
@Override
public String toString() {
return "User [id=" + id + ", userName=" + userName + ", password=" + password + "]";
}
}
注意
-注解 @TableName、@TableId以及 @TableField的使用
- IdType.AUTO 设置主键自增,需要数据库的支持。例如,代码了设置了自增,但是 mysql 数据库表里相应字段没有设置自增,写入记录时,相应属性不会被设置值,就会报"Field xxx does not have a default value"的错。IdType的可选值还有 UUID 等
- mybatis-plus 默认开启了类属性与数据库表字段的转换,即字段名使用驼峰命名方式,在写入时会根据性需要自动转成数据库字段的下划线连接的方式。如上面实体类中的 userName 属性,会自动写入 user_name 字段中。查询的时候则相应的 user_name 字段的值会设置到 userName 属性中
Mapper 类
package com.johnfnash.learn.mybatisplus.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.johnfnash.learn.mybatisplus.entity.User;
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
注意:继承 mybatis-plus 的 BaseMapper 接口,BaseMapper 接口定义了一下常用的增删改查方法。
Service 层
接口
package com.johnfnash.learn.mybatisplus.service;
import com.baomidou.mybatisplus.service.IService;
import com.johnfnash.learn.mybatisplus.entity.User;
public interface UserService extends IService<User> {
}
注意:为了方便具体实现类中相关方法的使用,接口实现 mybatis-plus 中的接口。
具体实现类
package com.johnfnash.learn.mybatisplus.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.johnfnash.learn.mybatisplus.entity.User;
import com.johnfnash.learn.mybatisplus.mapper.UserMapper;
import com.johnfnash.learn.mybatisplus.service.UserService;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
注意:具体实现类继承自 mybatis-plus 的 ServiceImpl类,并实现 UserService 接口。当 mybatis-plus 中的已有方法无法实现需求时(如复杂的查询),可以自己在 UserService 中添加接口定义,并在实现类中实现。
测试
package com.johnfnash.learn.mybatisplus;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.johnfnash.learn.mybatisplus.entity.User;
import com.johnfnash.learn.mybatisplus.service.UserService;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisplusApplicationTests {
@Autowired
private UserService userService;
@Test
public void testAdd() {
User user = new User("aaa", "rrrrr");
boolean isSuccess = userService.insert(user);
if(isSuccess){
System.out.println("新增用户成功。");
}else{
System.out.println("新增用户失败。");
}
}
@Test
public void testList() {
List<User> list = userService.selectList(null);
System.out.println(list);
}
@Test
public void testListByName() {
Map<String, Object> params = new HashMap<String, Object>();
params.put("user_name", "xxx");
List<User> list = userService.selectByMap(params);
System.out.println(list);
}
@Test
public void testGetById() {
System.out.println(userService.selectById(1));
}
@Test
public void testListByPage() {
Page<User> page = new Page<>(1, 2);
EntityWrapper<User> wrapper = new EntityWrapper<>();
wrapper.like("user_name", "%");
Page<User> page2 = userService.selectPage(page, wrapper);
System.out.println(page2.getRecords());
}
@Test
public void testUpdate() {
// User user = userService.selectById(1);
// user.setPassword("pwd");
// userService.updateById(user);
// updateById 只会修改设置了值的字段,没设置值的字段不会修改
User user = new User();
user.setId(1);
user.setPassword("pwd");
userService.updateById(user);
}
}
注意:使用 EntityWrapper 进行查询时,需要使用数据表的字段名,而不是类的属性名(这种情况下驼峰命名方式的属性名不会与下划线连接的字段名进行转换)。