学习日志day56(2021-09-26)(1、高级查询 2、分页插件 3、Mybatis使用注解 )

news/2024/7/24 5:50:12 标签: spring, java, mybatis

学习内容:学习MyBatis框架(Day56)

1、高级查询
2、分页插件
3、Mybatis使用注解


1、高级查询

(1)Mybatis作为一个ORM框架,也对SQL的高级查询做了支持,即Mybatis下的一对一、一对多、多对多的查询。

一对一查询:查询订单,并且查询出下单人的信息,同时要把两个信息放在一块去。

方法1.需要扩展Order对象,来映射结果集。(把两个信息放到一块去)创建第三个实体类,即订单信息也有用户信息。
OrderUser.java

java">@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderUser extends Order{
    private String name;

    @Override
    public String toString() {
        return "OrderUser{" +
                "userId=" + getUserId() +
                ",name=" + name +
                ",orderId=" + getId() +
                ",order_number=" + getOrderNumber() +
                '}';
    }
}

mapper接口

java">public interface UserMapper {
    List<OrderUser> queryOrderUserByOrderNumber(@Param("orderNumber") String orderNumber);
}

mapper.xml文件

<select id="queryOrderUserByOrderNumber" resultType="OrderUser">
    SELECT
        *
    FROM
        tb_order
            LEFT JOIN tb_user ON tb_order.user_id = tb_user.id
    WHERE
        tb_order.order_number = #{orderNumber}
</select>

测试

java">@Test
public void queryOrderUserByOrderNumber(){
    List<OrderUser> orderUsers = userMapper.queryOrderUserByOrderNumber("20140921002");
    orderUsers.forEach(System.out::println);
}

方法2.面向对象的思想,在Order对象中添加User对象。
Order.java

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order {
    private Integer id;
    private Long userId;
    private String orderNumber;

    private User user;
}

mapper接口

java">Order queryOrderWithUserByOrderNumber(@Param("orderNumber") String orderNumber);

mapper.xml,使用association元素完成子对象的映射

<resultMap id="orderMap" type="Order" autoMapping="true">
    <id column="id" property="id"/>
    <!-- association:完成子对象的映射,property :表示子对象的属性名
    javaType :指定对象的数据类型,autoMapping="true"完成子对象的属性的自动映射-->
    <association property="user" javaType="User" autoMapping="true">
        <!--association中的元素参考resultMap的子标签-->
        <id column="user_id" property="id"/>
        <result column="user_name" property="userName"/>
    </association>
</resultMap>
<select id="queryOrderWithUserByOrderNumber" resultMap="orderMap">
    SELECT
        *
    FROM
        tb_order
            LEFT JOIN tb_user ON tb_order.user_id = tb_user.id
    WHERE
        tb_order.order_number = #{orderNumber}
</select>

测试

java">@Test
public void queryOrderWithUserByOrderNumber(){
    Order order = userMapper.queryOrderWithUserByOrderNumber("20140921002");
    System.out.println("order = " + order);
}

(2)一对多查询:查询订单,查询出下单人信息并且查询出订单详情,一个定单可以有多个定单详情。
在Order实体类中添加orderDetails集合变量

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Order {
    private Integer id;
    private Long userId;
    private String orderNumber;

    private User user;

    List<OrderDetail> orderDetails;
}

mapper接口

java">Order queryOrderWithUserAndOrderDetailByOrderNumber(@Param("orderNumber") String orderNumber);

mapper.xml,使用collection标签完成集合的映射

<resultMap id="orderMap2" type="Order" autoMapping="true">
    <id column="id" property="id"/>
    <!-- association:完成子对象的映射,property :表示子对象的属性名
    javaType:指定对象的数据类型,autoMapping="true"完成子对象的属性的自动映射-->
    <association property="user" javaType="User" autoMapping="true">
        <!--association中的元素参考resultMap的子标签-->
        <id column="user_id" property="id"/>
        <result column="user_name" property="userName"/>
    </association>
    <!--collection完成集合的映射,property :表示集合的变量名
    javaType:集合类型,ofType:集合中保存对象的数据类型-->
    <collection property="orderDetails" javaType="list" ofType="orderDetail" autoMapping="true">
        <id column="detail_id" property="id"/>
    </collection>
</resultMap>
<select id="queryOrderWithUserAndOrderDetailByOrderNumber" resultMap="orderMap2">
    SELECT
        *,d.id AS detail_id
    FROM
        tb_order AS o
            LEFT JOIN tb_user AS u ON o.user_id = u.id
            LEFT JOIN tb_orderdetail AS d ON d.order_id = o.id
    WHERE
        o.order_number = #{orderNumber};
</select>

测试

java">@Test
public void queryOrderWithUserAndOrderDetailByOrderNumber(){
    Order order = userMapper.queryOrderWithUserAndOrderDetailByOrderNumber("20140921002");
    System.out.println("order = " + order);
}

(3)一对多+一对一查询:查询订单,查询出下单人信息并且查询出订单详情中的商品数据。
在OrderDetail实体类中添加Item对象

java">@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class OrderDetail {
    private int id;
    private int orderId;
    private int itemId;
    private double totalPrice;
    private int status;

    private Item item;
}

mapper接口,在collection元素中再添加一个association元素

<resultMap id="orderMap3" type="Order" autoMapping="true">
    <id column="id" property="id"/>
    <association property="user" javaType="User" autoMapping="true">
        <id column="user_id" property="id"/>
        <result column="user_name" property="userName"/>
    </association>
    <collection property="orderDetails" javaType="list" ofType="orderDetail" autoMapping="true">
        <id column="detail_id" property="id"/>
        <!--在collection元素中再添加一个association元素-->
        <association property="item" javaType="Item" autoMapping="true">
            <id column="item_id" property="id"/>
        </association>
    </collection>
</resultMap>
<select id="queryOrderWithUserAndOrderDetailAndItemByOrderNumber" resultMap="orderMap3">
    SELECT*,d.id AS detail_id
    FROM
        tb_order AS o
            LEFT JOIN tb_user AS u ON o.user_id = u.id
            LEFT JOIN tb_orderdetail AS d ON  d.order_id= o.id
            LEFT JOIN tb_item AS i ON i.id = d.item_id
    WHERE
        o.order_number = #{orderNumber};
</select>

测试

java">@Test
public void queryOrderWithUserAndOrderDetailAndItemByOrderNumber(){
    Order order = userMapper.queryOrderWithUserAndOrderDetailAndItemByOrderNumber("20140921001");
    System.out.println("order = " + order);
    //可以单独输出order对象中的子对象和集合
    User user = order.getUser();
    System.out.println("user = " + user);
    List<OrderDetail> orderDetails = order.getOrderDetails();
    for (OrderDetail orderDetail:orderDetails) {
        Item item = orderDetail.getItem();
        System.out.println("item = " + item);
    }
}

(4)resultMap的继承,使用extends属性,值为继承的resultMap的id,可以重写继承的resultMap的子标签。

<resultMap id="orderMap2" type="Order" autoMapping="true">
    <id column="id" property="id"/>
    <!-- association:完成子对象的映射,property :表示子对象的属性名
    javaType :指定对象的数据类型,autoMapping="true"完成子对象的属性的自动映射-->
    <association property="user" javaType="User" autoMapping="true">
        <!--association中的元素参考resultMap的子标签-->
        <id column="user_id" property="id"/>
        <result column="user_name" property="userName"/>
    </association>
    <!--collection完成集合的映射,property :表示集合的变量名
    javaType:集合类型,ofType:集合中保存对象的数据类型-->
    <collection property="orderDetails" javaType="list" ofType="orderDetail" autoMapping="true">
        <id column="detail_id" property="id"/>
    </collection>
</resultMap>
<resultMap id="orderMap3" type="Order" autoMapping="true" extends="orderMap2">
    <!--collection完成集合的映射,property :表示集合的变量名
    javaType:集合类型,ofType:集合中保存对象的数据类型-->
    <collection property="orderDetails" javaType="list" ofType="orderDetail" autoMapping="true">
        <id column="detail_id" property="id"/>
        <association property="item" javaType="Item" autoMapping="true">
            <id column="item_id" property="id"/>
        </association>
    </collection>
</resultMap>

1、分页插件

(1)Mybatis提供了plugin机制,允许我们在Mybatis的原有处理流程上加入自己逻辑,所有我们就可以使用这种逻辑加上我们的分页逻辑,也就是实现拦截器。
Mybatis支持的拦截的接口有4个,Executor 、 ParameterHandler 、ResultSetHandler、StatementHandler。

PageHelper实现了通用的分页查询,其支持的数据有,mysql、 Oracle、DB2、PostgreSQL等主流的数据库。该插件托管于github: https://github.com/pagehelper/Mybatis-PageHelper

在pom.xml导入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>3.7.5</version>
</dependency>
<dependency>
    <groupId>com.github.jsqlparser</groupId>
    <artifactId>jsqlparser</artifactId>
    <version>0.9.1</version>
</dependency>

mybatis-config.xml文件配置插件

<!--配置插件,这个拦截器插件放在配置环境的上面-->
<plugins>
    <!--引入PageHelper类-->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <!--数据库方言-->
        <property name="dialect" value="mysql"/>
        <!--设置为true时,使用rowBounds分页会进行count查询,会查询出总数-->
        <property name="rowBoundsWithCount" value="true"/>
    </plugin>
</plugins>

mapper接口

java">List<User> queryAllUsers();

mapper.xml

<select id="queryAllUsers" resultType="User">
    select * from tb_user
</select>

测试,在执行查询时设置分页参数

java">@Test
public void queryAllUsers(){
    //执行查询时设置分页参数,startPage(第一个参数:第几页,第二个参数:显示多少条数据);
    PageHelper.startPage(2,3);
    List<User> users = userMapper.queryAllUsers();
    users.forEach(System.out::println);//具体信息
    System.out.println("users = " + users);//分页的所有信息

    //PageInfo获取分页的信息
    PageInfo<User> pageInfo = new PageInfo<User>(users);
    System.out.println("当前页:" + pageInfo.getPageNum());
    System.out.println("当前页显示多少条数据:" + pageInfo.getPageSize());
    System.out.println("分页的所有信息:" + pageInfo.getList());//pageInfo.getList()与users集合相同
    System.out.println("总条数:" + pageInfo.getTotal());
    System.out.println("总页数:" + pageInfo.getPages());
    System.out.println("具体信息:");
    pageInfo.getList().forEach(System.out::println);
}

3、Mybatis使用注解

(1)如果使用注解,mapper.xml映射文件可以不用创建
mapper接口

java">public interface ItemMapper {
    @Select("select * from tb_item")
    List<Item> queryAllItem();

    @Insert("insert into tb_item(id,item_name,item_price,item_detail) values(null,#{itemName},#{itemPrice},#{itemDetail})")
    void addItem(Item item);

    @Delete("delete from tb_item where id = #{id}")
    void delete(int id);

    @Update("update tb_item set item_name = #{itemName}, item_price = #{itemPrice}, item_detail = #{itemDetail} where id = #{id}")
    void updateItem(Item item);
}

测试

java">public class ItemMapperTest {
    private SqlSession sqlSession;
    private ItemMapper itemMapper;

    @Before
    public void setUp() throws Exception {
        //获取mybatis配置文件
        String resource = "mybatis-config.xml";
        //将配置文件读取为输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //打开sqlSession,通过sqlSession进行增删改查
        sqlSession = sqlSessionFactory.openSession();
        //userMapper = new UserMapperImpl(sqlSession);
        //使用动态代理得到实现类对象
        itemMapper = sqlSession.getMapper(ItemMapper.class);
    }

    @Test
    public void queryAllItem() {
        List<Item> items = itemMapper.queryAllItem();
        items.forEach(System.out::println);
    }

    @Test
    public void addItem(){
        Item item = new Item(3,"iPhone X",8888,"新产品");
        itemMapper.addItem(item);
        sqlSession.commit();
    }

    @Test
    public void delete(){
        itemMapper.delete(3);
        sqlSession.commit();
    }

    @Test
    public void updateItem(){
        Item item = new Item(4,"华为",1888,"支持国产");
        itemMapper.updateItem(item);
        sqlSession.commit();
    }
}

(2)一些其它的注解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


http://www.niftyadmin.cn/n/1459890.html

相关文章

用python画爱心写一句话_python中用turtle画爱心表白

python中用turtle画爱心表白python 运行后的效果图&#xff1a;ide下面的代码是在python3.7写的&#xff0c;代码有点长&#xff0c;但却语法简单易懂动画 代码以下&#xff1a;orm import turtle str input(请输入表白语&#xff1a;) turtle.speed(10)#画笔速度 turtle.setu…

学习日志day57(2021-09-28)(1、mybatis和spring整合 2、搭建ssm框架)

学习内容&#xff1a;学习MyBatis框架&#xff08;Day57&#xff09; 1、mybatis和spring整合 2、搭建ssm框架 1、mybatis和spring整合 &#xff08;1&#xff09;创建spring的配置文件applicationContext.xml <?xml version"1.0" encoding"UTF-8"?…

vbox 中ubuntu20.04和宿主机共享文件_嵌入式杂谈之文件系统

文件系统可以说是嵌入式中的一大块&#xff0c;也是绕不过的一部分。之前我对文件系统认知一直停留在在U盘格式的理解上&#xff0c;直到接触了嵌入式Linux才发现这里面大有文章&#xff0c;以Linux启动挂载根文件系统为例&#xff0c;这个文件系统可以是真正的存储设备上的文件…

anaconda新建环境_Jupyter Notebook中切换conda虚拟环境

Jupyter Notebook本身是默认使用一种Anaconda中root目录下的Python环境的&#xff0c;如果想使用其它的虚拟环境&#xff0c;还需要通过插件来实现&#xff0c;也就是nb_conda插件。一、安装插件通过下面命令安装插件&#xff1a;conda 安装完成后&#xff0c;jupyter notebook…

学习日志day58(2021-10-09)(1、SVN 2、Git)

学习内容&#xff1a;学习版本控制系统SVN和Git&#xff08;Day58&#xff09; 1、SVN 2、Git 1、SVN &#xff08;1&#xff09;SVN全名Subversion&#xff0c;即版本控制系统。SVN与CVS一样&#xff0c;是一个跨平台的软件&#xff0c;支持大多数常见的操作系统。 作为一个…

Vue CLI vue-router ->(个人学习记录笔记)

文章目录Vue1. vue-vli脚手架1.1 介绍与安装1.2 项目初始化2. 回顾箭头函数2.1 基本使用2.2 参数和返回值2.3 this指向3. 路由3.1 vue-router安装与配置3.2 vue-router基本使用基本使用router-linkrouter-view重定向修改路由模式hash->history不用router-link3.3 vue-router…

学习日志day59(2021-10-11)(1、添加远程仓库 2、分支管理)

学习内容&#xff1a;学习版本控制系统Git&#xff08;Day59&#xff09; 1、添加远程仓库 2、分支管理 1、添加远程仓库 &#xff08;1&#xff09;添加远程库 如果想让其他人来协作开发&#xff0c;就可以把本地仓库同步到远程仓库&#xff0c;同时还增加了本地仓库的一个备…

python输入数组的方法_Python 数组

Python 数组 在本文中&#xff0c;您将学习Python数组&#xff0c;数组和列表之间的区别&#xff0c;以及如何以及何时使用示例来使用它们。 在编程中&#xff0c;数组是相同类型的元素的集合。 数组在Java&#xff0c;C / C &#xff0c;JavaScript等大多数编程语言中都很流行…