6 MybatisPlus快速上手

6.1 ORM介绍

image.png
image.png

6.2 MyBatis-Plus介绍

image.png
第一步:pom.xml中添加依赖
image.png
第二步:全局配置
配置数据库相关信息
image.png
添加@MapperScan注解
image.png

6.3 MyBatis CURD注解

image.png
第一步:新建SpringBoot项目(详细过程见上篇)
pom.xml中添加依赖

        <!--MyBatisPlus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <!--mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <!--数据连接池druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>

第二步:新建mydb数据库,在库中新建user表(将user表中的id设置为主键、自增)
image.png
第三步:新建mapper包(所有跟数据库相关的操作都放在该包下)
image.png
第四步:在启动类中加注解“@MapperScan(mapper全限定包名)”,可以使mapper包中的类都生效
第五步:在mapper包下新建UserMapper(mapper文件名称一般是“表名+mapper”,接口类型)
第六步:创建User类,类中变量的数据类型和名称要和数据库中保持一致,alt+insert快捷键生成getter、setter、toString方法
image.png
第七步:写查询方法,@Select后面的语句会自动查询连接的数据库中的表,查询结果会自动封装成user对象,然后放到List中;类上写“@Mapper”指定该类是mapper方法,MapperScanner会自动扫描到该类,进行解析

@Mapper
public interface UserMapper {
    //查询所有用户
    @Select("select * from user")
    public List<User> find();

}

第八步:UserController类

@RestController
public class UserController {
    @Autowired//注入userMapper,从而可以在类中正常使用userMapper的方法
    private UserMapper userMapper;

    @GetMapping("/user")
    public String query(){
        List<User> list = userMapper.find();
        System.out.println(list);
        return "查询用户";
    }
}

启动项目,报错:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

由于使用的是MySQL 8.0,所以数据库连接配置需要修改为:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8&useSSL=false&serverTimezone=UTC

再次启动,可正常访问
image.png
控制台:
image.png
第九步:修改返回类型及返回值,返回的对象会被自动转为json

    @GetMapping("/user")
    public List query(){
        List<User> list = userMapper.find();
        System.out.println(list);
        return list;
    }

image.png
插入方法同理:UserMapper中

    @Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
    public int insert(User user);

Controller中:

    @PostMapping("/user")
    public String save(User user){
        int i = userMapper.insert(user);
        if(i>0){
            return "插入成功";
        }else{
            return "插入失败";
        }
    }

请求:
image.png
测试结果:
image.png

6.3.1 接下来使用MybatisPlus

1.mapper类继承BaseMapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

2.controller修改query方法,insert方法不用变

    @GetMapping("/user")
    public List query(){
        List<User> list = userMapper.selectList(null);
        System.out.println(list);
        return list;
    }

3.测试
image.png
image.png
两个方法均可正常使用。
如果表名和实体类不一致,类上方可以加“@TableName("表名")”映射到实体类,变量名不一致用“@TableField”。
@TableId可以将变量设置为主键,IdType.AUTO意思是自增,再次测试,插入数据时,user传入数据时会带上id,尽管请求时并没有设置id。
image.png
测试:
image.png
image.png
如果用了MybatisPlus,默认表名和实体类名对应,字段名和变量名对应,具体细节可以查看官方文档。

7 MybatisPlus多表查询及分页查询

实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。(MyBatis Plus仅对单表查询进行了增强,没有修改多表查询)
image.png
目标:实现查询用户时,查到该用户名下所有订单
第一步:新建订单表u_order(id设置为主键、自增)
注意表名不能设为order,不然访问时,sql语法会出错(“select *from order where uid = #{uid}”),无法执行sql语句。因为sql语句中不能出现sql关键词,否则会报错,sql关键词有order、form、dec等等。
image.png
第二步:新建Order类,以及get、set、constructor、toString方法

@TableName("u_order")
public class Order {
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String orderTime;
    private double total;
    @TableField(exist = false)
    private User user;//uid字段对应的属性

第三步:新建OrderMapper、OrderController

@Mapper
public interface OrderMapper extends BaseMapper<Order> {
    @Select("select * from u_order where uid = #{uid}")
    List<Order> selectByUid(int uid);
    //查询所有的订单,同时查询订单的用户
    @Select("select * from u_order")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "order_time",property = "orderTime"),
            @Result(column = "total",property = "total"),
            @Result(column = "uid",property = "user",javaType = User.class,
                one=@One(select = "com.example.mybatisplusdemo.mapper.UserMapper.selectById")
            )
    })
    List<Order> selectAllOrderAndUser();
}
@RestController
public class OrderController {
    @Autowired
    private OrderMapper orderMapper;

    @GetMapping("/order/findAll")
    public List findAll(){
        List orders = orderMapper.selectAllOrderAndUser();
        return orders;
    }
}

第四步:
UserMapper添加查询用户、查询所有订单的方法selectAllUserAndOrders()

    //查询用户,根据用户id查询信息
    @Select("select * from user where id = #{id}")
    User selectById(int id);
    
    //查询用户及其所有订单
    @Select("select * from user")
    @Results(
            {
                    @Result(column = "id",property = "id"),
                    @Result(column = "username",property = "username"),
                    @Result(column = "password",property = "password"),
                    @Result(column = "birthday",property = "birthday"),
                    @Result(column = "id",property = "orders",javaType = List.class,
                            many =@Many(select = "com.example.mybatisplusdemo.mapper.OrderMapper.selectByUid")

                    )

            }
    )
    List<User>  selectAllUserAndOrders();

第五步:UserController中添加对应方法

    @GetMapping("/user/findAll")
    public List<User> find(){
        return userMapper.selectAllUserAndOrders();
    }

@Results是结果集,@Result作用是每一个字段赋值
测试(查询用户及其所有订单):
image.png
测试(查询所有的订单,同时查询订单的用户):
image.png

7.1 MyBatis Plus的条件查询和分页查询

image.png
QueryWrapper是MyBatis Plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等。

7.1.1条件查询

方法:

  //条件查询
    @GetMapping("/user/find")
    public List<User> findByCond(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.eq("username","zhangsan");
        return userMapper.selectList(queryWrapper);
    }

结果:
image.png

7.1.2分页查询

第一步:创建MyBatis Plus拦截器,新建配置类MyBatisPlusConfig

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor paginationInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInterceptor);
        return interceptor;
    }
}

第二步:Controller方法

    //分页查询
    @GetMapping("/user/findByPage")
    public IPage findByPage(){
        //设置起始值及每页条数
        Page<User> page = new Page<>(0,2);
        IPage iPage = userMapper.selectPage(page,null);
        return iPage;
    }

Page对象是用来描述从哪查,查几条数据;iPage是描述结果集的对象。
结果:
image.png


飞呀
1 声望4 粉丝