Java 阶段三 Day11 SQL语句重用和多表联查

一、SQL语句重用

说明

SQL语句重用是指在数据库应用程序中,多次执行相同或类似的SQL语句时,通过重用这些语句来提高
性能,减少系统消耗的资源。

实现

使用 <sql></sql> <include></include> 标签组合实现
<sql><sql> 标签中存放重复的SQL语句,使用 <include></include> 标签获取重复的SQL

示例

在三种动态删除的SQL语句中,都有重复的SQL语句: DELETE FROM comment WHERE id IN ,可以将
重复的语句抽取出来,来简化SQL。

  1. mappers.CommentMapper.xml 将删除语句重复的SQL抽取出来

    <!-- 1.重复SQL抽取-sql标签 -->
    <sql id="deleteSql">
    	DELETE FROM comment WHERE id in
    </sql>
    <delete id="deleteByIds1">
    <!--2.通过include标签复用-include标签-->
    	<include refid="deleteSql"></include>(
    	<foreach collection="array" item="id" separator=",">
    	#{id}
    	</foreach>
    )
    </delete>
    <delete id="deleteByIds2">
    	<!--2.通过include标签复用-include标签-->
    	<include refid="deleteSql"></include>(
    	<foreach collection="list" item="id" separator=",">
    	#{id}
    	</foreach>
    )
    </delete>
    
  2. 执行对应的测试用例测试

二、多表联查

首页微博列表展示

  • 展示内容

    用户名称
    微博内容

  • 查询内容
    微博id、微博内容、用户昵称

  • 实现

    1. mapper.WeiboMapper
      // 首页微博列表数据
      List<WeiboIndexVO> selectIndex();
      
    2. mappers.WeiboMapper.xml
      <select id="selectIndex" resultType="com.example.weibo.pojo.vo.WeiboIndexVO">
      	SELECT w.id, w.content, u.nickname
      	FROM weibo w JOIN user u ON w.user_id=u.id;
      </select>
      
    3. pojo.vo.WeiboIndexVO
      public class WeiboIndexVO {
              
              
      	// 显示微博的id content , 再显示一个nickname
      	private Integer id;
      	private String content;
      	private String nickname;
      }
      
    4. 测试方法
      @Test
      void weiboIndexTest(){
              
              
      	System.out.println(weiboMapper.selectIndex());
      }
      

微博详情页展示

  • 展示内容

    //用户昵称: 微博内容
    左大凯说:我是国服第一马超
    //发布时间
    发布于:2023年9月16日 14点10分10秒

  • 查询内容
    微博id、微博内容、微博发布时间、用户昵称

  • 实现

    1. mapper.WeiboMapper

      // 微博详情页数据
      WeiboDetailVO selectById(int id);
      
    2. mappers.WeiboMapper.xml

      <select id="selectById" resultType="cn.tedu.weibo.pojo.vo.WeiboDetailVO">
          SELECT w.id, w.content, w.created, u.nickname
          FROM weibo w JOIN user u ON w.user_id=u.id			    WHERE w.id=#{
              
              id}
      </select>
      
    3. pojo.vo.WeiboDetailVO

      public class WeiboDetailVO {
              
              			    
          private Integer id;
          private String content;
          private Date created;
      	private String nickname;
      }
      
    4. 测试方法

      @Test
      void weiboDetialTest(){
              
              
          System.out.println(weiboMapper.selectById(1));
      }
      

微博详情页中评论展示

  • 展示内容

    用户昵称 评论内容 评论时间
    左大凯 你是认真的吗 发布于:1987/10/16 00:00:00
  • 查询内容
    评论id、评论内容、评论发布时间、用户昵称

  • 实现

    1. mapper.WeiboMapper

      // 微博详情页评论数据
      List<CommentVO> selectByWeiboId(int id);
      
    2. mappers.WeiboMapper.xml

      <select id="selectByWeiboId" resultType="cn.tedu.weibo.pojo.vo.CommentVO">
          SELECT c.id,c.content,c.created,u.nickname
          FROM comment c JOIN user u ON c.user_id=u.id
          WHERE weibo_id=#{id}
      </select>
      
    3. pojo.vo.CommentVO

      public class CommentVO {
              
              
      	private Integer id;
      	private String content;
      	private Date created;
      	private String nickname;
      }
      
    4. 测试方法

      @Test
      void selectByWeiboIdTest(){
              
              
          System.out.println(weiboMapper.selectByWeiboId(1));
      }
      

三、ResultMap

resultMap属性是用来定义查询结果和Java对象属性之间的映射关系;
通过resultMap属性可以自定义查询结果与Java对象属性的映射关系。

常用标签及属性说明

  • <resultMap>标签
    • id 属性:唯一标识
    • type 属性:指定映射的JAVA类型
  • <id>标签 :指定映射的主键字段,包含 column属性 和 property属性
    • column属性 :查询语句中的列名(或别名)
    • property属性 :JAVA对象中的属性名
  • <result>标签 :指定映射的非主键字段,包含 column属性 和 property属性
    • column属性 :查询语句中的列名(或别名)
    • property属性 :JAVA对象中的属性名
  • <collection>标签 :映射一对多或多对多关系
    • property属性 :JAVA对象中的属性名
    • ofType属性 :集合中元素的类型

单表

根据微博的id查询该条微博的信息,只显示:微博编号id、内容content、用户编号user_id

第1步:定义接口方法

第2步:创建VO类 WeiboMapVO1

第3步:配置xml

<!--
    resultMap示例
    1.id属性:唯一标识
    2.type属性:指定映射的JAVA类型
    3.<id>标签:映射主键字段
    4.<result>标签:映射非主键字段
    5.column属性:查询语句中的列名(别名)
    6.property属性:java中的属性名
-->
<resultMap id="aaa" type="com.example.pojo.WeiboMapVO1">
    <id column="id" property="id"/>
    <result column="content" property="content"/>
    <result column="user_id" property="userId"/>
</resultMap>

<select id="selectMapById" resultMap="aaa">
    SELECT id,
    content,
    user_id
    FROM weibo
    WHERE id = #{wid}
</select>

第4步:测试及结果

/**resultMap属性:单表查询测试*/
@Test
void selectMapByIdTest(){
    
    
    System.out.println(weiboMapper.selectMapById(200));
}

多表

一对多查询

查询指定的用户发布的所有的 微博信息 ,要求将 微博信息 放到一个集合中

要求显示:用户的id、用户昵称、List<Weibo>集合

第1步:定义接口方法 selectMapByUserId

第2步:创建VO类 WeiboMapVO2

public class WeiboMapVO2 {
    
    
    private Integer id;
    private String nickname;
    // 指定用户发的所有微博信息
    private List<Weibo> weibos;
    // 省略setter() getter() toString()方法
}

第3步:配置XML

<!--
    查询指定的用户发布的所有的 **微博信息** ,要求将 **微博信息** 放到一个集合中
    要求显示:用户的id、用户昵称、`List<Weibo>集合`
    resultMap示例
    1.id属性:唯一标识
    2.type属性:指定映射的JAVA类型
    3.<id>标签:映射主键字段
    4.<result>标签:映射非主键字段
    5.column属性:查询语句中的列名(别名)
    6.property属性:java中的属性名
    7.<collection>标签:映射一对多或多对多关系
    8.ofType属性:集合中元素的类型
-->
<resultMap id="ccc" type="com.example.pojo.WeiboMapVO2">
    <id column="id" property="id"/>
    <result column="nickname" property="nickname"/>
    <collection property="weibos" ofType="com.example.pojo.Weibo">
        <id column="wid" property="id"/>
        <result column="content" property="content"/>
        <result column="created" property="created"/>
        <result column="user_id" property="userId"/>
    </collection>
</resultMap>

<select id="selectMapByUserId" resultMap="ccc">
    SELECT u.id,
    u.nickname,
    w.id wid,
    w.content,
    w.created,
    w.user_id
    FROM user u
    JOIN weibo w ON w.user_id = u.id
    WHERE u.id = #{uid}
</select>

第4步:测试及结果

@Test
void selectMapByUserIdTest(){
    
    
	System.out.println(weiboMapper.selectMapByUserId(100));
}

何时使用 ResultMap

在实际应用中,使用 ResultMap 主要针对复杂的查询场景,例如:多表关联查询、一对多、多对多查询等;
此时,使用 ResultMap 可以将查询结果中的数据转化为对象,方便后续的业务处理。

猜你喜欢

转载自blog.csdn.net/weixin_44693429/article/details/132918354