动态sql,关联查询

1、动态sql

1.2.1 sql标签

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

select count(*)

使用代码片段


1.2.2 if标签

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


	SQL语句

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

1.2.3 where标签

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

select * from xx

    
    	SQL语句
    

1.2.4 set标签

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

update xx 

    
    列 = 值,
    
    
    列 = 值,
    
	...

where 条件

1.2.5 trim标签

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


	...

用trim代替set


	..

1.2.6 foreach标签

用于循环拼接SQL


	#{变量名}
 
List selectByIds(List ids);
--->
select * from employee where id in (1,2,3,4)


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 books;
  ..
 }

2) 书籍类型Mapper接口

public interface IBookTypeDAO {

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

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

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

4) BookType的映射文件


    
    
    
    
    



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

连接查询方式


    
    
    
        
            
            
            
            
            
            
            
            
        



    select d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id



2.3.2 查询单个对象

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

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

    ...

    /书籍类型
    private BookType bookType;

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


    
    
    
    
    
    
    
    
    
    
    
    



连接查询

    








        
        


        
    

    
    
        -- select * from employee
        select d.*,e.* from department d join employee e on d.dept_id = e.emp_dept_id
    

你可能感兴趣的:(java,动态sql,关联查询,sql,java,动态sql,collection,association)