栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis特殊操作、优化配置、动态SQL、关联查询

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis特殊操作、优化配置、动态SQL、关联查询

1.特殊操作 1.1模糊查询

需求:查询name中包含"精"的数据.并且按照年龄降序排列

@Test
    public void test9(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
        Map map=new HashMap<>();
        map.put("name","精");
        map.put("column","age");
        List demoUsers=mapper.like(map);
        System.out.println(demoUsers);
    }

①$方式


        select * from demo_user where name like '%${name}%' order by ${column} desc ;
    

②%需要引号包裹


        select * from demo_user where id=#{id}
    

注意:核心配置文件的顺序 

The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
方式二:使用别名包

一个个编辑别名标签也很麻烦,别名标签只对某个类有效,所以可以在配置文件中配置package标签,配置包路径

 
        

        
        

    

原理是动态拼接:包路径+.类名

方式三:使用注解

@Alias("类的别名")  不常用

2.2简化sql标签 sql标签用法
    
        select * from demo_user
    

    
        where id=#{id}
    
sql标签的利弊

利:                                            弊:

1.节省xml文件的大小                 1.sql只能抽取公共的sql语句,局限性大

2.代码结构相对简单                   2.如果大量使用sql标签,可读性太差

3.MyBatis动态sql 3.1 IF-WHERe标签

规则:where与if标签通常一起使用,where标签可以去除多余的and和or,if的test属性为判断条件

           判断对象中不为空的属性当作where条件

情景:用户并不是上传所有字段属性值,可能只有name,只有age


        select * from demo_user
        where
        
            name=#{name}
            sex=#{sex}
        
    

解释:

choose代表分支结构,只有一个条件有效

when:和if类似

otherwise:上述的条件无效时,此处条件生效

3.4 ResuletType与ResultMap
建表→编辑Dept pojo类→mapper接口→映射文件→配置核心配置文件中的mapper
注意pojo类要实现序列化接口

resultType注意,结果集中的字段名称与属性名称一致时,才会实现自动的数据封装

resultMap,结果集中的字段名称与属性名称不一致时,也可以实现自定义的数据封装

resultMap标签用来自定义映射关系

 建表(dept)

 

pojo类

package com.jt.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Dept implements Serializable {
    private Integer deptId;
    private String deptName;
}

mapper接口

public interface DeptMapper {

    List findAll(Dept dept);
}

 映射文件

 
        select * from emp
    

结果:

[Emp(id=1, name=妲己, age=18, dept=null), Emp(id=2, name=貂蝉, age=19, dept=null), Emp(id=3, name=八戒, age=99, dept=null)]

 会发现员工的部门为空

思路:将两张表建立连接,最好使用连接left join 

sql语句实现两表联查:SELECT * FROM emp LEFT JOIN dept ON emp.dept_id=dept.dept_id;

问题:有重名字段 

解决方案:不要查询*全部  查询字段

实现方式一:关联查询实现一对一封装

规则:Mybatis要求实现数据封装时,要求字段唯一

           resultMap标签最好保留主键字段信息

           使用标签association封装单个对象

          遇到关联封装时,要全部配置映射关系,但是太麻烦,如果字段与属性名相同,可以使用autoMapping


映射文件代码


        select e.id,e.name,e.age,d.dept_id,d.dept_name
        from emp e , dept d
        where e.dept_id=d.dept_id
    
    
        
        
            
            
        
    
实现方式二:子查询实现一对一封装

子查询sql简单,封装复杂;关联查询sql复杂,封装简单

实现代码:

 
        select * from dept where dept_id=#{dept_id}
    
    
        
        
    
4.3一对多

关系:一个部门对应多个员工

连接查询实现一对多封装

 思路→实现多表联查

SELECT d.dept_id,d.dept_name,e.id,e.name,e.age 
FROM emp e LEFT JOIN dept d ON e.dept_id=d.dept_id 

实现代码:

@Test
    public void test4(){
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept dept=new Dept();
        List list=mapper.findAll2(dept);
        System.out.println(list);
        sqlSession.close();
    }

        select d.dept_id,d.dept_name,e.id,e.name,e.age
        from emp e left join dept d on e.dept_id=d.dept_id
    
    
        
        
        
            
        
    

 与一对一区分开,一对一使用association标签,内部使用JavaType属性,一对多使用collection标签,内部使用ofType属性其余结构相同

4.4驼峰规则映射

在核心配置文件内配置settings

实现代码:

 
    
        
    
 
        

        
            
        
    

注意:要使用autoMapping属性+最好保留属性

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号