mybatis-plus
-
mybatis-plus主键id生成使用的是雪花算法所以会比较长,使用bigint类型(在实体中是long类型)
-
MySQL驱动8就用:driver-class-name: com.mysql.cj.jdbc.Driver
-
MySQL驱动8需要加时区连接地址URL
-
MySQL驱动5就用:driver-class-name: com.mysql.jdbc.Driver
-
yml文件用#注释
-
wrapper就是mybatisplus得条件构造器
-
alt+enter生成对象(idea)
-
这是编译后的结果可以查看
-
mybatis-plus控制台打印sql语句,在yml配置文件
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
baseMapper方法
package com.atguigu.mybatisplus;
import com.atguigu.mybatisplus.mapper.UserMapper;
import com.atguigu.mybatisplus.pojo.User;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cglib.beans.BeanMap;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class MybatisTest {
@Autowired
private UserMapper userMapper;
@Test
public void testSelectList(){
//查询条件构造器查询一个list集合,没有条件,则可以设置null参数
List<User> list = userMapper.selectList(null);
list.forEach(System.out::println);
}
@Test
public void testInert(){
User user = new User();
user.setName("ab");
user.setAge(18);
user.setId(555555555L);
user.setEmail("1814356884@qq.com");
int s = userMapper.insert(user);
System.out.println("增加了"+s+"数据");
System.out.println("id:"+user.getId());
}
@Test
public void testDelete(){
int i = userMapper.deleteById(5);
System.out.println("结果"+i);
//根据map集合中设置的条件作为参数,删除数据
Map<String,Object> map = new HashMap<>();
map.put("name", "ab");
map.put("age", 18);
int i = userMapper.deleteByMap(map);
System.out.println(i);
//集合 idlist要删除的多个id,批量删除
//Arrays.asList该方法是将数组转化成List集合的方法
List<Long> list = Arrays.asList(1L, 2L, 3L);
int ids = userMapper.deleteBatchIds(list);
System.out.println("结果"+ids);
}
@Test
public void testUpdate(){
//修改用户信息
User user = new User();
user.setId(4L);
user.setName("梁伟浩");
user.setEmail("11111111.com");
int i = userMapper.updateById(user);
System.out.println("结果"+i);
}
@Test
public void testSelect(){
//通过id查询用户信息
User user = userMapper.selectById(1l);
System.out.println("数据"+user);
// 根据多个id,传入的是一个list集合(逗号隔开)
List<Long> list = Arrays.asList(1l,2l);
List<User> users = userMapper.selectBatchIds(list);
users.forEach(System.out::println);
// 根据map来查询
Map<String,Object> map = new HashMap<>();
map.put("name", "jack");
map.put("age", 20);
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
System.out.println("00000000"+users);
//查询所有数据
List<User> users = userMapper.selectList(null);
System.out.println("11111"+users);
//自定义的sql
Map<String, Object> map = userMapper.selectMapById(1l);
System.out.println("2222"+map);
}
}
-
增删改得返回值都是其影响的行数
-
有时候int类型过长,在后面加上L转换成long类型即可
-
该方法是将数组转化成List集合的方法。
List<String> list = Arrays.asList("a","b","c");
-
save是新增和修改,保存新增是没有id的修改是有id的
-
remove是删除方法
-
get和list的查询方法
-
M是我们当前的mapper,T就是当前我们使用得实体
-
因为在service继承了iservice所以在实现类中也要继承其的service
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
常用注解
-
@TableId:将这个属性对应的字段作为主键,数据库一般把id作为主键
-
假如实体主键是id但是数据库主键id是uid,那么用注解加上value即可 @TableId("uid") type属性:主键生成策略,@TableId(value = "uid", type = IdType.AUTO),默认是雪花算法
-
@TableName("user"):设置实体类所对应的表名,如果不加就用实体类决定
-
@TableField("user_name"):指定属性所对应的字段名
-
@TableLogic:逻辑删除,加了之后只会查出逻辑删除为0未删除得数据
-
@Repository在mapper上加上表明是持久层组件,在其他地方注入使用便不会报错
-
@EnumValue //将注解所标识的属性的值存储到数据库中
-
@DS("master")//在serviceimpl,指定数据源
-
@Service//在serviceimpl,表明是service组件
Iservice方法
package com.atguigu.mybatisplus;
import com.atguigu.mybatisplus.mapper.UserMapper;
import com.atguigu.mybatisplus.pojo.User;
import com.atguigu.mybatisplus.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
public class mybatispulsservicetest {
@Autowired
private UserService userService;
@Test
public void testGetCount(){
//查询总记录数
// SELECT COUNT( * ) FROM user
long count = userService.count();
System.out.println("总记录数"+count);
}
@Test
public void testInsertMore(){
//批量添加
//单个的sql语句循环添加
List<User> list = new ArrayList<>();
for (int i = 0; i <=10 ; i++) {
User user = new User();
user.setId(11l+i);
user.setName("ab"+i);
user.setAge(20+i);
list.add(user);
}
boolean b = userService.saveBatch(list);
System.out.println(b);
}
}
wapper构造器
- 子查询
-
其实构造器就是他的条件
-
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
-
gt大于
-
or()是或,默认是and
package com.atguigu.mybatisplus;
import com.atguigu.mybatisplus.mapper.UserMapper;
import com.atguigu.mybatisplus.pojo.User;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.xml.stream.events.EndDocument;
import java.util.List;
import java.util.Map;
/**
* Date:2022/2/14
* Author:ybc
* Description:
*/
@SpringBootTest
public class MyBatisPlusWrapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void test01(){
//查询用户名包含a,年龄在20到30之间,邮箱信息不为null的用户信息
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name", "a")
.between("age", 20, 30)
.isNotNull("email");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test1(){
//查询用户包含a,年龄到20-30,邮箱不为null
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "a")
.between("age", 20, 30)
.isNotNull("email");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test02(){
//查询用户信息,按照年龄的降序排序,若年龄相同,则按照id升序排序
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,uid ASC
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("age")
.orderByAsc("uid");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test2(){
//查询用户信息,按照降序排序
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("age")
.orderByAsc("id");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test03(){
//删除邮箱地址为null的用户信息
//UPDATE t_user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("email");
int result = userMapper.delete(queryWrapper);
System.out.println("result:"+result);
}
@Test
public void test3(){
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("email");
int delete = userMapper.delete(queryWrapper);
System.out.println("删除成功"+delete);
}
@Test
public void test04(){
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
//UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (age > ? AND user_name LIKE ? OR email IS NULL)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20)
.like("user_name", "a")
.or()
.isNull("email");
User user = new User();
user.setName("小明");
user.setEmail("test@atguigu.com");
int result = userMapper.update(user, queryWrapper);
System.out.println("result:"+result);
}
@Test
public void test4(){
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 20)
.like("name", "a")
.or()
.isNull("email");
User user = new User();
user.setName("小米");
user.setEmail("xiaomi.com");
int i = userMapper.update(user, queryWrapper);
System.out.println("result:"+i);
}
@Test
public void test05(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
//lambda中的条件优先执行
//UPDATE t_user SET user_name=?, email=? WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("user_name", "a")
.and(i->i.gt("age",20).or().isNull("email"));
User user = new User();
user.setName("小红");
user.setEmail("test@atguigu.com");
int result = userMapper.update(user, queryWrapper);
System.out.println("result:"+result);
}
@Test
public void test5(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改,
// i表示条件构造器
//lambda条件优先执行
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "a")
.and(i->i.gt("age", 20).or().isNull("email") );
User user = new User();
user.setName("小888");
user.setEmail("test@atguigu.com");
int result = userMapper.update(user, queryWrapper);
System.out.println("result:"+result);
}
@Test
public void test06(){
//查询用户的用户名、年龄、邮箱信息
//SELECT user_name,age,email FROM t_user WHERE is_deleted=0
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("user_name", "age", "email");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
@Test
public void test6(){
//查询用户的用户名、年龄、邮箱信息
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name","age","email");
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
@Test
public void test07(){
//查询id小于等于100的用户信息
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 100))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("uid", "select uid from t_user where uid <= 100");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test7(){
//查询id小于等于100的用户信息
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.inSql("id", "select id from user where id <= 3");
List<User> users = userMapper.selectList(userQueryWrapper);
users.forEach(System.out::println);
}
@Test
public void test08(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.like("user_name", "a")
.and(i -> i.gt("age", 20).or().isNull("email"));
updateWrapper.set("user_name", "小黑").set("email","abc@atguigu.com");
int result = userMapper.update(null, updateWrapper);
System.out.println("result:"+result);
}
@Test
public void test8(){
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.like("name", "a")
.and(i->i.gt("age", 20).or().isNull("email"));
updateWrapper.set("name", "小白" ).set("email", "asasasa@com" );
int update = userMapper.update(null, updateWrapper);
System.out.println("result:"+update);
}
@Test
public void test09(){
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if(StringUtils.isNotBlank(username)){
//isNotBlank判断某个字符创是否不为空字符串、不为null、不为空白符
queryWrapper.like("user_name", username);
}
if(ageBegin != null){
queryWrapper.ge("age", ageBegin);
}
if(ageEnd != null){
queryWrapper.le("age", ageEnd);
}
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test9(){
String name = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(name)){
queryWrapper.like("name",name);
}
if (ageBegin != null){
queryWrapper.ge("age", ageBegin);
}
if (ageBegin != null){
queryWrapper.le("age", ageEnd);
}
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
@Test
public void test10(){
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username)
.ge(ageBegin != null, "age", ageBegin)
.le(ageEnd != null, "age", ageEnd);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test010(){
//condition条件
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username), "name",username)
.ge(ageBegin!=null,"age",ageBegin)
.le(ageEnd!=null, "age",ageEnd);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test11(){
//SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age <= ?)
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
@Test
public void test011(){
//函数式接口,User::getAge
String username = "a";
Integer ageBegin = null;
Integer ageEnd = 30;
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(StringUtils.isNotBlank(username),User::getName,username)
.ge(ageBegin!=null,User::getAge,ageBegin)
.le(ageEnd!=null,User::getAge,ageEnd);
List<User> users = userMapper.selectList(lambdaQueryWrapper);
users.forEach(System.out::println);
}
@Test
public void test12(){
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(User::getName, "a")
.and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
updateWrapper.set(User::getName, "小黑").set(User::getEmail,"abc@atguigu.com");
int result = userMapper.update(null, updateWrapper);
System.out.println("result:"+result);
}
@Test
public void test012(){
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.like(User::getName, "a")
.and(i->i.gt(User::getAge, 20).or().isNull(User::getEmail));
updateWrapper.set(User::getName, "小白" ).set(User::getEmail, "asasasa@com" );
int update = userMapper.update(null, updateWrapper);
System.out.println("result:"+update);
}
}
分页插件
- 添加一个配置类(MybatisPlusInterceptor)
@Configuration
//扫描mapper接口所在的包
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
-
test
@SpringBootTest public class MyBatisPlusPluginsTest { @Autowired private UserMapper userMapper; @Autowired private ProductMapper productMapper; @Test public void testPage(){ Page<User> page = new Page<>(2, 3); userMapper.selectPage(page, null); System.out.println(page.getRecords()); System.out.println(page.getPages()); System.out.println(page.getTotal()); System.out.println(page.hasNext()); System.out.println(page.hasPrevious()); } @Test public void testpage1(){ Page<User> page = new Page<>(1,3); userMapper.selectPage(page,null); System.out.println(page.getRecords());//所有信息 System.out.println(page.getCurrent());//页码 System.out.println(page.getTotal());//总记录数 System.out.println(page.hasNext());//是否有下一页 System.out.println(page.hasPrevious());//是否有上一页 }
-
自定义分页
测试controller层
@Autowired
private UserMapper userMapper;
@Autowired
private ProductMapper productMapper;
@Test
public void testpagevo1(){
Page<User> page = new Page<>(1,3);
userMapper.selectPageVo(page,20 );
System.out.println(page.getRecords());//所有信息
System.out.println(page.getCurrent());//页码
System.out.println(page.getTotal());//总记录数
System.out.println(page.hasNext());//是否有上一页
System.out.println(page.hasPrevious());//是否有下一页
}
mapper接口层
/**
* 通过年龄查询用户信息并分页
* @param page MyBatis-Plus所提供的分页对象,必须位于第一个参数的位置
* @param age
* @return
*/
//@Param()设置参数
Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);
xml持久层
<!--Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);-->
<select id="selectPageVo" resultType="User">
select id,name,age,email from user where age > #{age}
</select>
- 乐观锁
- 悲观锁:就是两个人同事操作一个数据,其中一个被锁死不能动在阻塞中,等到另外一个完成操作后,才可以操作
- 乐观锁:加上版本号version字段,更新数据次版本号就变,版本号不一致操作会不成功
建表
CREATE TABLE t_product
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
price INT(11) DEFAULT 0 COMMENT '价格',
VERSION INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
PRIMARY KEY (id)
);
添加数据
INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
配置文件添加乐观锁插件
@Configuration
//扫描mapper接口所在的包
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//添加乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
添加实体
@Data
public class Product {
private Long id;
private String name;
private Integer price;
@Version //标识乐观锁版本号字段
private Integer version;
}
mapper接口继承mybatis的mapper
@Repository在mapper上加上表明是持久层组件,在其他地方注入使用便不会报错
public interface ProductMapper extends BaseMapper<Product> {}
controller测试类
@SpringBootTest
public class MyBatisPlusPluginsTest {
@Autowired
private UserMapper userMapper;
@Autowired
private ProductMapper productMapper;
@Test
public void testproduct(){
// 小李查询商品价格
Product productLi = productMapper.selectById(1);
System.out.println("小李查询的商品价格"+productLi.getPrice());
// 小梁查询商品价格
Product productLiang = productMapper.selectById(1);
System.out.println("小梁查询的商品价格"+productLiang.getPrice());
//小李将商品价格+50
productLi.setPrice(productLi.getPrice()+50);
productMapper.updateById(productLi);
//小梁将价格-30 同时查出的是100,-30最后保存价格就是70
//加了注解后version=0,准备保存数据的时候此时版本经过小李修改数据版本号version=1,版本号不一致,所以无法执行保存修改数据语句
productLiang.setPrice(productLiang.getPrice()-30);
productMapper.updateById(productLiang);
//优化,如果没有修改成功,查出新的版本号,再修改数据
int result = productMapper.updateById(productLiang);
if(result == 0){
//操作失败,重试
Product productNew = productMapper.selectById(1);
productNew.setPrice(productNew.getPrice()-30);
productMapper.updateById(productNew);
}
//老板查询商品价格 控制台输出:老板查询的商品价格70
//version=0,在实体加上 @Version注解后,再次输出:老板查询的商品价格150
Product productBoss = productMapper.selectById(1);
System.out.println("老板查询的商品价格"+productBoss.getPrice());
}
}
通用枚举
- 固定的值可以使用枚举
- 先加注解在实体类上 @EnumValue //将注解所标识的属性的值存储到数据库中
- 在yml配置类配置扫描通用枚举的包
# 扫描通用枚举的包
type-enums-package: com.atguigu.mybatisplus.enums
枚举类
@Getter
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue //将注解所标识的属性的值存储到数据库中
private Integer sex;
private String sexName;
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
实体类
@Data
//设置实体类所对应的表名
@TableName("user")
public class User {
//将属性所对应的字段指定为主键
//@TableId注解的value属性用于指定主键的字段
//@TableId注解的type属性设置主键生成策略
//@TableId(value = "uid", type = IdType.AUTO)
// @TableId("uid")
private Long id;
//指定属性所对应的字段名
// @TableField("user_name")
private String name;
private Integer age;
private String email;
private SexEnum sex;//这里这里
@TableLogic
private Integer isDeleted;
}
多数据源
- yml配置文件
spring:
# 配置数据源信息
datasource:
dynamic:
# 设置默认的数据源或者数据源组,默认值即为master
primary: master
# 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
strict: false
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
- 创建两个数据库对应的数据库表实体(pojo)
Product表
@Data
public class Product {
private Integer id;
private String name;
private Integer price;
private Integer version;
}
User表
@Data
public class User {
@TableId
private Integer id;
private String name;
private Integer age;
private Integer sex;
private String email;
private Integer isDeleted;
}
- mapper接口
@Repository
public interface ProductMapper extends BaseMapper<Product> {
}
@Repository
public interface UserMapper extends BaseMapper<User> {
}
- service业务层
public interface UserService extends IService<User> {
}
@Service//表明是service的组件
@DS("master")//表明当前使用的数据源
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
public interface ProductService extends IService<Product> {
}
@Service
@DS("slave_1")
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
- controller测试类
@SpringBootTest
class MybatisPlusDatasourceApplicationTests {
@Autowired
private UserService userService;
@Autowired
private ProductService productService;
@Test
public void test1(){
//控制台输出:User(id=1, name=Jone, age=18, sex=null, email=test1@baomidou.com, isDeleted=0)
//Product(id=1, name=外星人笔记本, price=120, version=0)
System.out.println(userService.getById(1));
System.out.println(productService.getById(1));
}
}
mybatisX
- 代码生成
- mybatisX,alt+enter自动补全