动态sql,关联查询

这篇具有很好参考价值的文章主要介绍了动态sql,关联查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、动态sql

1.2.1 sql标签

可以通过sql标签提高sql代码的复用性
定义代码片段

<sql id="sql_count">select count(*)</sql>

使用代码片段

<select id="selectUserCount" resultType="String">
	<include refid="sql_count"/> from t_user
</select>

1.2.2 if标签

进行条件判断,判断成功会把if内部SQL拼接到外部SQL中,否则不拼接

<if test="条件">
	SQL语句
</if>

问题:直接使用if会出现多余的where和and、or等关键词

1.2.3 where标签

用于配置条件,会去掉多余的where、and、or关键词

select * from xx
<where>
    <if test="条件">
    	SQL语句
    </if>
</where>

1.2.4 set标签

用于配置update语句,用于去掉多余的,

update xx 
<set>
    <if test="条件">
    列 = 值,
    </if>
    <if test="条件">
    列 = 值,
    </if>
	...
</set>
where 条件

1.2.5 trim标签

可以删除或添加前缀和后缀,用来拼接SQL

<trim prefix="添加前缀" suffix="添加后缀" prefixOverride="删除后缀" suffixOverride="删除后缀">
	<if>...</if>
</trim>

用trim代替set

<trim prefix="set" suffixOverride=",">
	..
</trim>

1.2.6 foreach标签

用于循环拼接SQL

<foreach collection="集合参数名称" item="变量名" open="开始符号" close="结束符号" seprator="分割符" index="下标">
	#{变量名}
</foreach> 
List<Employee> selectByIds(List<Long> ids);
--->
select * from employee where id in (1,2,3,4)

<select id="selectByIds" resultType="Employee">
    <include refid="mySelect"></include>
    where emp_id in
    <foreach collection="ids" item="id" separator="," open="(" close=")" index="i">
    	#{id}
    </foreach>
</select>

2、关联查询

2.1 关联关系的分类

表之间有几种关联关系:

  1. 一对一 如:一个人有一个身份证
  2. 一对多 如:一个部门有多个员工
  3. 多对一 如:多个员工属于一个部门
  4. 多对多 如:一个学生可以选择多门课程,一门课程也有多个学生

2.2 MyBatis实现关联

在进行数据库查询时,会遇到多张表相互关联的情况,下面以书籍和类型为例,配置最常见的一对多关系。

2.3 关联配置

MyBatis映射文件中,在ResultMap里可以配置关联关系

主要有两种标签来映射关联属性:

  • collection 配置集合类型的属性

  • association 配置单独对象的属性

collection和association的相关参数:

  • property 属性的名称
  • select 查询方法
  • javaType 属性的类型
  • ofType 如果属性是集合,集合中对象的类型
  • column 外键字段名

2.3.1 查询集合

配置一的一方,查询书籍类型时,能同时查询到该类型的所有书籍

1) 给类型添加书籍集合,这里需要使用collection

public class BookType {

  private long id;
  private String type;
  //书籍的集合
  private List<Book> books;
  ..
 }

2) 书籍类型Mapper接口

public interface IBookTypeDAO {

    /**
     * 按id查书籍类型
     * @param typeId
     * @return
     */
    BookType selectBookTypeById(int typeId);
}

3) 在Book映射接口中定义方法

    /**
     * 根据类型id查询所有书籍
     * @param typeId
     * @return
     */
    List<Book> selectBooksByTypeId(int typeId);

4) BookType的映射文件

<resultMap id="bookTypeMap" type="BookType" >
    <id property="id" column="id"></id>
    <result property="type" column="type"></result>
    <!--配置集合 property是集合属性 select是查询方法 javaType是集合类型
    ofType是集合的数据类型 column外建列作为参数传入查询方法-->
    <collection property="books" select="com.blb.bookms.dao.IBookDAO.selectBooksByTypeId"
              javaType="java.util.List"   ofType="Book" column="id">
    </collection>
</resultMap>

<select id="selectBookTypeById" resultMap="bookTypeMap" parameterType="java.lang.Integer">
        select * from tb_book_type where id = #{typeId}
</select>

这里使用的是子查询的机制,在查询书籍类型后,将每个类型id作为参数,调用书籍接口的selectBooksByTypeId方法查询书籍集合。

连接查询方式

<resultMap id="deptMap" type="Department">
    <id property="deptId" column="dept_id"></id>
    <result property="deptName" column="dept_name"></result>
    <!--
     员工集合的配置 property属性名 column子查询使用的字段
     javaType集合类型 ofType集合的对象类型
     select是子查询的方法
     -->
        <collection property="employees"
                    javaType="java.util.List" ofType="Employee">
            <id property="empId" column="emp_id"></id>
            <result property="empNo" column="emp_no"></result>
            <result property="empName" column="emp_name"></result>
            <result property="empAge" column="emp_age"></result>
            <result property="empGender" column="emp_gender"></result>
            <result property="empInfo" column="emp_info"></result>
            <result property="empAddress" column="emp_address"></result>
            <result property="empDeptId" column="emp_dept_id"></result>
        </collection>
</resultMap>

<sql id="deptSelect">
    select d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id
</sql>

<select id="selectAll" resultMap="deptMap">
    <include refid="deptSelect"></include>
</select>

2.3.2 查询单个对象

配置多的一方,通过书籍查询到它所属的类型

  1. 给Book添加BookType属性
/**
 * 书籍
 */
public class Book {

    ...

    /书籍类型
    private BookType bookType;

2)书籍映射文件中,使用association配置bookType属性

<resultMap id="bookMap" type="Book">
    <id property="id" column="id"></id>
    <result property="bookName" column="book_name"></result>
    <result property="price" column="price"></result>
    <result property="typeId" column="type_id"></result>
    <result property="author" column="author"></result>
    <result property="publishOrg" column="publish_org"></result>
    <result property="publishTime" column="publish_time"></result>
    <result property="state" column="state"></result>
    <result property="bookImage" column="book_image"></result>
    <!--映射一对一 类型-->
    <association property="bookType" javaType="BookType"
                 select="com.blb.bookms.dao.IBookTypeDAO.selectBookTypeById" column="type_id">
    </association>
</resultMap>

<select id="selectBookById" parameterType="java.lang.Integer" resultMap="bookMap">
    select * from tb_book where id = #{id}
</select>

连接查询文章来源地址https://www.toymoban.com/news/detail-806914.html

    <resultMap id="empMap" type="Employee" autoMapping="true">
<!--        <id property="empId" column="emp_id"></id>-->
<!--        <result property="empNo" column="emp_no"></result>-->
<!--        <result property="empName" column="emp_name"></result>-->
<!--        <result property="empAge" column="emp_age"></result>-->
<!--        <result property="empGender" column="emp_gender"></result>-->
<!--        <result property="empInfo" column="emp_info"></result>-->
<!--        <result property="empAddress" column="emp_address"></result>-->
<!--        <result property="empDeptId" column="emp_dept_id"></result>-->
        <!--单独对象映射-->
        <association property="department" javaType="Department" autoMapping="true">
<!--            <id property="deptId" column="dept_id"></id>-->
<!--            <result property="deptName" column="dept_name"></result>-->
        </association>
    </resultMap>

    <!--sql语句重用-->
    <sql id="mySelect">
        -- select * from employee
        select d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id
    </sql>

到了这里,关于动态sql,关联查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL两表/多表关联查询--JOIN语句

    一、基础概念 SQL中的关联是通过JOIN实现的,JOIN有几种类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等。 二、INNER JOIN详解 INNER JOIN是最常用的关联方式之一,它 返回 两个表中共同存在的数据行 。 其语法格式如下: 下面是一个实际的例子: 以上代码可以

    2024年01月18日
    浏览(52)
  • Data Mining数据挖掘—5. Association Analysis关联分析

    Given a set of records each of which contains some number of items from a given collection. Produce dependency rules that will predict the occurrence of an item based on occurrences of other items. Application area: Marketing and Sales Promotion, Content-based recommendation, Customer loyalty programs Initially used for Market Basket Analysis to find how ite

    2024年02月05日
    浏览(47)
  • 若依框架的startPage( )函数怎么自动关联查询SQL语句?

    使用JAVA语言的若依框架的时候,发现只要使用了startPage()函数, 并不需要前端传递分页的数据,也不需要注解,就能完成分页功能。预判他应该是使用类似拦截器的机制,但还是感觉很神奇,感觉知道个大概不过瘾,还是要更细致的了解才能满足,就想研究一下并记录下来。

    2024年02月08日
    浏览(37)
  • 数据挖掘——关联规则(Association Rule)Apriori算法和python代码实现

    关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性,是数据挖掘的一个重要技术,用于从大量数据中挖掘出有价值的数据项之间的相关关系。 用一些例子来说明一下: 当我们在超市进行购物时,超市中有琳琅满目的商品,在每一次购物结束之后,

    2024年02月04日
    浏览(49)
  • MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询

    MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 MyBatis-Plus不写任何resultMap和SQL执行一对一、一对多、多对多关联查询 com.github.dreamyoung mprelation 0.0.3.2-RELEASE 注解工具使用优缺点: 优点: 使用简单,通过在实体类上添加@OneToOne / @OneToMany / @ManyToOne / @ManyToM

    2024年01月20日
    浏览(49)
  • 5.2Java EE——基于注解的关联查询

    一、一对一查询         接下来,以4.2节中使用的tb_idcard和tb_person数据表为例,详细讲解基于注解@One实现 tb_idcard和tb_person数据表之间的一对一关联查询,具体步骤如下。 1、创建持久化类: 本案例使用4.2节中的IdCard类和Person类作为持久类。 2、编写接口方法:       

    2024年02月15日
    浏览(34)
  • 基于图的数据关联论文《CLIPPER: A Graph-Theoretic Framework for Robust Data Association》学习

    基本思想是将数据关联问题转换为图,计算最稠密的全连接子图,具体描述有点拗口: 假设有两组数据setA和setB,setA有a,b,c,d,e这几个点,setB里面有i,j,k,l这个几个点。 如果认为setA中的某个点a和setB中的某个点j能匹配,setA中的另一个点c和setB中的另一个点l能匹配,那么a-c的相

    2024年02月12日
    浏览(39)
  • ES7 and or 关联条件查询JAVA

    @ES7 and or 关联条件查询JAVA 实现条件( platform=‘xxx’ and (home_path=‘xxx’ or nick_name=‘xxx’ )) kibana

    2024年02月08日
    浏览(51)
  • mybatis xml多表查询,子查询,连接查询,动态sql

    student_type 表 student 表 Student 类 一个学生只有一个年级 Type 类 一个年级有多个学生,所以用 list 下列代码中: 1 resultMap 里面property对应实体类属性,column对应数据库字段名 2 主键用 id 标签 其他用result 3 关联查询(子查询和连接查询) 连接查询查一次 4 一个年级多个学生,所以

    2024年01月21日
    浏览(57)
  • MyBatis多表查询+动态sql

    在全局配置文件中中设置MyBatis执行日志 假设有一个用户表和文章表,实体类中一个关联关系。 用户实体类 文章实体类 如果想查询的结果包含UserInfo的信息就需要使用,⼀对⼀映射要使⽤ association 标签,因为一篇文章只能对应一个作者。 Controller控制器代码 Service服务层代码

    2023年04月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包