SpringBoot系列 整合MyBatisPlus入门

官网:

https://mybatis.plus/    

https://mp.baomidou.com/

由于MyBatisPlus并未被收录到idea的系统内置配置,无法直接选择加入

 pom

<dependency>    

        <groupId>com.baomidou</groupId>    

        <artifactId>mybatis-plus-boot-starter</artifactId>    

        <version>3.4.1</version>

</dependency>

定义数据接口

@Mapper

public interface UserDao extends BaseMapper<User> {

}

测试类测试:

@SpringBootTest

public class Mybatisplus01QuickstartApplicationTests {    

        @Autowired    

        private UserDao userDao;    

        @Test    

        public void  testGetAll() {        

                List<User> userList = userDao.selectList(null);                         userList.forEach(System.out::println);    

        }

}

功能                    自定义接口
新增                    boolean save(T t)
删除                    boolean delete(int id)
修改                    boolean update(T t)
根据id查询          T getById(int id)
查询全部             List<T> getAll()
分页查询             PageInfo<T> getAll(int page, int size)
按条件查询          List<T> getAll(Condition condition)

分页功能:

设置分页拦截器作为Spring管理的bean(分页功能基于拦截器实现,要加载分页功能对应的拦截器bean,分页查询的结果封装在IPage对象中)

@Configuration

public class MpCongfig {    

        @Bean    

        public MybatisPlusInterceptor pageInterceptor(){        

                MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();                         interceptor.addInnerInterceptor(new PaginationInnerInterceptor());        

                return interceptor;    

        }

}

执行分页查询

IPage page = new Page(2,3);

userDao.selectPage(page, null);

System.out.println("当前页码:"+page.getCurrent());

System.out.println("每页数据总量:"+page.getSize());

System.out.println("总页数:"+page.getPages());

System.out.println("数据总量:"+page.getTotal());

System.out.println("当前页数据:"+page.getRecords());

开启日志

mybatis-plus:  

  configuration:    

    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

DQL编程控制

条件查询方式

QueryWrapper<User> qw = new QueryWrapper<User>();

List<User> userList = userDao.selectList(null);

System.out.println(userList);

格式一:常规格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lt("age",65); qw.ge("age",18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

格式二:链式编程格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lt("age",65).ge("age",18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

格式三:lambda格式

QueryWrapper<User> qw = new QueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

qw.lambda().lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(qw);

System.out.println(userList);

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

组合查询条件

and

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

or

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

//查询年龄大于等于18岁,小于65岁的用户

lqw.lt(User::getAge,65).or().ge(User::getAge,18);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

null值处理

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();

lqw.ge(null != userQuery.getAge(),User::getAge,userQuery.getAge()) .lt(null != userQuery.getAge2(),User::getAge, userQuery.getAge2());

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

查询投影

只要部分字段:

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.select(User::getId,User::getName,User::getAge);

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

QueryWrapper<User> qm = new QueryWrapper<User>();

qm.select("count(*) as nums,gender");

qm.groupBy("gender");

List<Map<String, Object>> maps = userDao.selectMaps(qm);

System.out.println(maps);

查询条件设定

eq

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.eq(User::getName, userQuery.getName()).eq(User::getPassword, userQuery.getPassword()); User loginUser = userDao.selectOne(lqw);

System.out.println(loginUser);

le;ge

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.eq(User::getName, userQuery.getName()).eq(User::getPassword, userQuery.getPassword()); User loginUser = userDao.selectOne(lqw);

System.out.println(loginUser);

like

LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.likeLeft(User::getTel,userQuery.getTel());

List<User> userList = userDao.selectList(lqw);

System.out.println(userList);

官网的条件查看:

条件构造器 | MyBatis-Plus

字段映射与表名映射

当代码字段和数据库字段不匹配时,一般都不改数据库,而是在代码上处理对应字段:

//当前类对应与数据库表进行映射,tbl_user是数据库的表名

@TableName("tbl_user")

public class User {  

        // pwd为数据库中的字段

        @TableField(value="pwd")    

        //如果有不想被查出来的数据,如密码,就将select属性设置为false

        @TableField(value="pwd",select = false)

        private String password;  

        //online是代码中有,而数据库中没有的字段

        @TableField(exist = false)    

        private Integer online;  

}

DML编程控制

id生成策略控制,

AUTO(0):使用数据库id自增策略控制id生成

NONE(1):不设置id生成策略

INPUT(2):用户手工输入id

ASSIGN_ID(3):雪花算法生成id(可兼容数值型与字符串型)

        0   00100110111011010101100001101010011000110   10000   10001   000000000010

   占位                        时间戳(41)                                                机器码(5+5)        序列号(12)

ASSIGN_UUID(4):以UUID生成算法作为id生成策略

public class User {    

        @TableId(type = IdType.AUTO)    

        private Long id;

}

全局配置id和表前缀

mybatis-plus:  

  global-config:    

    db-config:      

      id-type: auto      

      table-prefix: tbl_

批量操作:

删除

List<Long> ids= Arrays.asList(new Long[]{2,3});

userDao.deleteBatchIds(ids);

查询

List<Long> ids= Arrays.asList(new Long[]{2,3});

List<User> userList = userDao.selectBatchIds(ids);

逻辑删除

数据库中添加一个字段用来标记数据是否可用。

public class User {    

        private Long id;    

        @TableLogic    

        private Integer deleted;    

配置逻辑删除字面值

mybatis-plus:  

  global-config:    

    db-config:      

      logic-delete-field: deleted      

      logic-not-delete-value: 0      

      logic-delete-value: 1  #删除后的值

实际执行的sql是这样的:UPDATE tbl_user SET deleted=1 WHERE id=? AND deleted=0

乐观锁

应对并发问题。

数据库表中添加锁标记字段:

public class User {    

        private Long id;    

        @Version    

        private Integer version;

配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装:

@Configuration

public class MpConfig {    

        @Bean    

        public MybatisPlusInterceptor mpInterceptor() {        

                MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();                         mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());        

                return mpInterceptor;    

        }

}

使用乐观锁

在修改前先获取到对应数据的verion方可用到乐观锁功能。

代码生成器

<dependency>    

        <groupId>com.baomidou</groupId>    

        <artifactId>mybatis-plus-generator</artifactId>    

        <version>3.4.1</version>

</dependency>

<dependency>    

        <groupId>org.apache.velocity</groupId>    

        <artifactId>velocity-engine-core</artifactId>    

        <version>2.3</version>

</dependency>

CodeGenerator

public class CodeGenerator {
    public static void main(String[] args) {
        //1.获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatisplus_04_generator/src/main/java");    //设置代码生成位置
        globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("joshua");    //设置作者
        globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略
        autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.aaa");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageInfo.setEntity("domain");    //设置实体类包名
        packageInfo.setMapper("dao");   //设置数据层包名
        autoGenerator.setPackageInfo(packageInfo);

        //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("tbl_user");  //设置当前参与生成的表名,参数为可变参数
        strategyConfig.setTablePrefix("tbl_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = tbl_user - tbl_
        strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
        autoGenerator.setStrategy(strategyConfig);
        //2.执行生成操作
        autoGenerator.execute();
    }
}

Generator

public class Generator {
    public static void main(String[] args) {

        //创建代码生成器对象,执行生成代码操作
        AutoGenerator autoGenerator = new AutoGenerator();

        //数据源相关配置:读取数据库中的信息,根据数据库表结构生成代码 DataSourceConfig

        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        autoGenerator.setDataSource(dataSource);

        autoGenerator.execute();
    }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呀吼呀吼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值