Springboot+Echarts(五)

发布时间 2023-09-27 16:53:40作者: Arkiya

Mybatis-plus操作的多表查询和分页查询 今天首先回顾了之前所学的基本的单表增删改查 这里想再自己写一遍 是为了方便自己以后的开发流程顺利 首先 创建Springboot项目,选择java8和Springboot2.x.x 之后选择Web依赖 然后添加依赖

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.0.7</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.5</version>
        </dependency>

从上到下依次是mybatis-plus,mysql连接,mybatis,德鲁伊连接池

解释一下德鲁伊连接池,是对mysql数据库进行多次连接的,说人话就是循环连接,连不上一直连,因为数据库的启动需要一个时间,就我自己来说,开发Android应用连接SQL Lite的时候确实也用到过类似的操作

之后是设置properties的内容

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis??useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=****
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这里jdbc编码一栏有些问题,我进行了修改,把编码改成了UTF-8

做完这些之后,就可以进行Springboot+Mybatis的开发了

一般来说分以下几个包

Mapper:用于定义接口,说人话就是实现方法的逻辑

Entity:用于封装类,说人话就是javabean

Controller:用于调用接口,实例化接口对象,接收Get和Post请求完成操作

主方法类:Springboot项目的启动入口

第一步对主类添加MapperScan的注解

@MapperScan("com.example.mybatisplus.mapper")

是为了启动主类的时候自动扫描mapper包,找到@Mapper的接口类

然后创建封装类,基础的构造和get、set方法

然后创建Controller包和Mapper包

创建mapper类的时候注意是接口类型(选class下边绿色的那个)

然后添加@Mapper的注解声明它是一个接口类

然后可以让它继承BaseMapper<>,这个尖括号中写的是实体类的名字,就是Entity中实体类的名字

一般来说对应的mapper写对应的类的名字即可

例如UserMapper

public interface UserMapper extends BaseMapper<User>{}......

然后基础的增删改查就很好实现了:

    @Select("select * from user")
    public List<User> find();
    @Insert("insert into user values(#{id},#{username},#{password},#{birthday})")
        public int insert(User user);
    @Delete("delete from user where id = #{id}")
        public int delete(String id);
    @Update("update user set username = #{username},password = #{password},birthday = #{birthday} where id = #{id}")
        public int update (User user);

要注意的是 调用的属性名都用#{}括起来,这样mybatis会自动寻找实体类中的变量进行操作

这些都完成之后就可以在Controller中进行操作了

首先对controller类要添加一个@RestController注解,声明这是一个controller类

然后需要在类中定义一个@Autowired,这是为了实例化一个mapper对象以调用方法

具体代码为

@RestController
public class UserController {

    @Autowired
    private UserMapper userMapper;

然后就是

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

对不传入数值的一般是get方法,然后直接返回即可

对传入数值的一般使用post方法

------------------------------------------------------------------------------------------------------------------------分隔符----------------------------------------------------------------------------------------------------------------------------------

然后是今天所学的 多表联查,上述所讲都是对单个表的增删改查,那么举例来说,如果我有另一个叫order的表,其中包含id,order_time,total,uid四个属性,其中,uid对应user表中的id,当我查询用户的时候,我希望能查询出用户对应的订单,我该如何做呢?

流程如下

首先,需要对order创建相同的entity、mapper、controller,controller不必须,但是考虑到后续可能还需要对order单表进行操作,因此先进行了定义

然后在entity中对order进行封装,定义构造、get&set、tostring方法等。

之后,在User的封装类中,需要定义一个order变量,因为我们想返回的是订单的信息,从面向对象的角度来说,它应该是返回一个List类型,因此

 @TableField(exist = false)
    private List<Order> orders

首先说一下,如果不使用@TableName注解,则Mybatis会自动寻找和封装类名相同的表名,如果没有就会报错

这里使用的这个@TableField注解,意思是告诉Mybatis,我需要一个List<order>的属性,但是在user或者说在tablename指定的表中并没有这个字段,因此exist=false

重点是记得创建这个变量的get和set方法,例如private List<order> orders;

然后我们来到mapper类中,这里一共有两个mapper,一个是usermapper,一个是ordermapper,我们希望完成的操作的处理逻辑是这样的

我们在usermapper中,传入一个id,然后在ordermapper中定义另一个方法,通过传入的id查询对应的订单,然后返回给usermapper中的这个方法中的orders,然后一起返回到usermapper中对应的函数即可,具体代码:

 @Select("select * from t_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.mybatisplus.mapper.OrderMapper.selectByUid")
                    )
            }
    )
    List<User> selectAllUserAndOrders();

首先@Result是定义user表中的字段,重点放在最后,它是给出了一个名为id的字段,通过many = @Many这个操作,调用的是

com.example.mybatisplus.mapper.OrderMapper.selectByUid

这个方法,这个方法的具体定义如下

 @Select("select * from t_order where uid = #{id}")
    List<Order> selectByUid(String id);

所以说,是在一个mapper中调用了另一个mapper方法,把第二个mapper方法的返回值给了第一个mapper方法中的一个对应的实体类,然后带着实体类一起返回到第一个mapper方法中

然后在Controller中进行调用即可

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