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。
-
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>
-
执行对应的测试用例测试
二、多表联查
首页微博列表展示
-
展示内容
用户名称
微博内容
… -
查询内容
微博id、微博内容、用户昵称 -
实现
- mapper.WeiboMapper
// 首页微博列表数据 List<WeiboIndexVO> selectIndex();
- 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>
- pojo.vo.WeiboIndexVO
public class WeiboIndexVO { // 显示微博的id content , 再显示一个nickname private Integer id; private String content; private String nickname; }
- 测试方法
@Test void weiboIndexTest(){ System.out.println(weiboMapper.selectIndex()); }
- mapper.WeiboMapper
微博详情页展示
-
展示内容
//用户昵称: 微博内容
左大凯说:我是国服第一马超
//发布时间
发布于:2023年9月16日 14点10分10秒 -
查询内容
微博id、微博内容、微博发布时间、用户昵称 -
实现
-
mapper.WeiboMapper
// 微博详情页数据 WeiboDetailVO selectById(int id);
-
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>
-
pojo.vo.WeiboDetailVO
public class WeiboDetailVO { private Integer id; private String content; private Date created; private String nickname; }
-
测试方法
@Test void weiboDetialTest(){ System.out.println(weiboMapper.selectById(1)); }
-
微博详情页中评论展示
-
展示内容
用户昵称 评论内容 评论时间 左大凯 你是认真的吗 发布于:1987/10/16 00:00:00 -
查询内容
评论id、评论内容、评论发布时间、用户昵称 -
实现
-
mapper.WeiboMapper
// 微博详情页评论数据 List<CommentVO> selectByWeiboId(int id);
-
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>
-
pojo.vo.CommentVO
public class CommentVO { private Integer id; private String content; private Date created; private String nickname; }
-
测试方法
@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 可以将查询结果中的数据转化为对象,方便后续的业务处理。