mybatis-puls学习总结

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自动补全
    请添加图片描述
  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java中的战斗机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值