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

Mybatis高级用法

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

Mybatis高级用法

1,Mybatis优化设置

关于Mybatis核心配置文件的顺序

The content of element type "configuration" must match

"(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,

reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".

mybatis简化—别名包

业务说明:

在mybatis xml映射文件中需要写POJO实体对象的路径. 如果每次编辑 都写全路径,则开发相对繁琐. 所以mybatis引入别名包的规则

实现别名配置:

在mybatis的核心配置文件中 定义别名

使用别名映射:

说明: 以后可以使用别名 代替类型的全路径

使用别名包:

需求: 如果项目中有多个POJO实体类,如果一个一个编辑别名标签,则更为繁琐. 所以 Mybatis提供了别名包的功能.

例子:

com.jt.pojo.User,

com.jt.pojo.Dept,

com.jt.pojo.Order

原理说明: 可以设定公共的包路径 com.jt.pojo,如果设定了包路径.以后自动拼接类的全 路径.

xml核心文件配置:

xml映射文件配置:

别名的注解定义:

 

2,Mybatis简化—SQL标签

业务说明:

mybatis的xml映射文件中会有大量的Sql语句. 随着业务的增加,Sql

语句的数量也会增加. 其中有部分**"Sql片段"则可能重复. 如果想简

化Sql语句,则可以使用Sql标签**简化操作.

例子:

1. select id,name,age,sex from demo_user where id = 1
	2. select id,name,age,sex from demo_user where name = xxx

    
        select id,name,age,sex from demo_user
    

    
    
        
    

关于SQL标签的说明:

优势:
1.使用Sql标签可以节省xml的文件大小.
2.代码的结构相对简单.
弊端:
1.Sql只能抽取公共的Sql语句,局限性稍大.
2.如果大量的使用Sql标签,则代码的可读性差

3,Mybatis—动态SQL

IF-WHERe用法:

业务需求:

根据user对象查询数据.要求根据对象中不为null的属性充当where 条件.实现动态的查询.

案例: 实际业务中经常出现多个查询条件 如图:

4,动态SQL-choose when otherwise

业务需求:

根据条件实现数据的查询. 如果存在name则按照name查询,否则按照sex查询.
补充说明:

条件: name = “张三” , sex=“男”
select * from demo_user where name = #{name}

5,ResultMap用法

项目构建:

创建表:

创建dept表 int dept_id 主键自增, varchar类型(40) dept_name

编辑Dept POJO对象:

6,resultType与resultMap用法:

标签说明:

resultType说明:
当结果集中的字段名称,如果与属性的名称一致时,才会实现自动的数 据封装
resultMap说明:
当结果集中的字段名称,与对象中的属性不一致时,可以使用resultMap

实现自定义的封装.

7,关联关系:

常见的关联关系:

一对一 例子: 1.人和身份证号 2. 老公和老婆 3. 员工和部门

一对多 例子: 一个部门对应多个员工.

多对多 老师和学生
一个老师对应多个学生.
一个学生对应多个老师.
核心: 考虑问题从一头出发.

一对一:

创建表:

表名: emp 员工表
字段: id,name,age,dept_id

表数据说明:

构建代码结构:

  1. 创建POJO
  2. 创建EmpMapper接口
  3. 创建EmpMapper.xml映射文件
  4. Mybatis加载xml映射文件

说明: 编辑mybatis-config.xml文件,添加映射文件.

一对一业务封装:

规则: 如果对一 则使用对象封装.
如果对多 则使用List集合封装

总结:

  1. 作业: 模糊查询的用法 “%”#{xxxx}"%", setName("%xxxx%")
  2. 如果遇到多值传参,一般封装Map集合
  3. mybatis-config.xml 文件的配置是有顺序的. 不能随意
  4. 别名写法 1.别名标签 2. 别名包 3. 注解
  5. Sql标签 将公共的sql进行抽取 通过sql标签进行定义.
  6. 动态Sql where-if / set / choose when
  7. resultMap用法: 解决字段与属性名称不一致的问题.
  8. resultType: 单表查询时/属性与字段一样时,
  9. 关联关系的用法 一对一 一对多

8,Mybatis高级用法—SpringBoot整合

关联查询和子查询的说明:

  1. 关联查询: 通过大量的sql语句 实现数据的关联查询. 其中Sql语句相对复杂. 但是数据封装简单.
  2. 子查询: 可以通过子查询的方式实现复杂的数据封装. 其中Sql几乎都是单表查询,Sql简单, 但是数据封装复杂.

子查询的调用逻辑图:

一对多:

业务逻辑:

业务说明: 一个部门对应多个员工.

驼峰规则映射:

说明: 在mybatis映射数据时,经常出现字段名称与属性名称不一致的现象. 但是其中一部分可以采用驼峰规则的方式完成自动映射. 所以有如下的配置.

编辑:mybatis-config.xml

官网API:

 

 配置信息写在configuration 配置标签之下.

代码目录:

创建mapper接口:

1,DemoUserMapper:
package com.jt.springboot_demo2_mybatis.mapper;

import com.jt.springboot_demo2_mybatis.pojo.DemoUser;
import com.jt.springboot_demo2_mybatis.pojo.Dept;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;


public interface DemoUserMapper {
    //1,查询所有的表数据

    List select01(Map map);

    List findWhere(DemoUser demoUser);

    void updateSet(DemoUser user);

    List selectChoose(DemoUser user);


    List findAll();
}

2,DeptMapper

package com.jt.springboot_demo2_mybatis.mapper;

import com.jt.springboot_demo2_mybatis.pojo.Dept;

import java.util.List;

public interface DeptMapper {

    List findAll();

    List findDept();
}

 3,EmpMapper

package com.jt.springboot_demo2_mybatis.mapper;

import com.jt.springboot_demo2_mybatis.pojo.DemoUser;
import com.jt.springboot_demo2_mybatis.pojo.Emp;

import java.util.List;

public interface EmpMapper {
    List findAll();

    List findAllWhere();
}

创建pojo类:

1,DemoUser

package com.jt.springboot_demo2_mybatis.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.apache.ibatis.type.Alias;

import java.util.List;
import java.util.Map;

@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
@Alias("DemoUser")  //改别名
public class DemoUser {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
}

2,Dept

package com.jt.springboot_demo2_mybatis.pojo;

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

import java.io.Serializable;
import java.util.List;

@Data
    @Accessors(chain = true)
    @NoArgsConstructor
    @AllArgsConstructor
    public class Dept implements Serializable{
    //驼峰命名规则
        private Integer deptId;
        private String deptName;
        private List emps;
    }

3,Emp

package com.jt.springboot_demo2_mybatis.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 Emp implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
//    private Integer deptId;
    private Dept dept;  //一对一封装
}

编辑xml映射文件

1,编辑 demoUserMapper.xml映射文件






    
    
        select id,name,age,sex from demo_user
        
            name = #{name}
            and age=#{age}
            and sex=#{sex}
        
    
    
    
        update demo_user
        
            name = #{name},
            age = #{age},
            sex = #{sex}
        
        where
        id = #{id}
    
    
    
            select * from dept
        
    
        
            
            
        
    
        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
    
    
    
        
        
        
            
            
        
    
    
    
        select * from dept where dept_id = #{dept_id}
    
    
        
        
    

编辑mybatis-config.xml文件,添加映射文件.





    
    
        
        
    
    
    
        
        

        
        
    

    
    

        
        
            
            
            
            
                
                
                
                
                
            
        
    

    
    
        
        
        
    

编辑测试方法:

package com.jt.springboot_demo2_mybatis;

import com.jt.springboot_demo2_mybatis.mapper.DemoUserMapper;
import com.jt.springboot_demo2_mybatis.mapper.DeptMapper;
import com.jt.springboot_demo2_mybatis.mapper.EmpMapper;
import com.jt.springboot_demo2_mybatis.pojo.DemoUser;
import com.jt.springboot_demo2_mybatis.pojo.Dept;
import com.jt.springboot_demo2_mybatis.pojo.Emp;
import org.apache.catalina.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import sun.management.Agent;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestMybatis {
    private SqlSessionFactory sqlSessionFactory;

    
    @BeforeEach
    public void init() throws IOException {
        //1,指定资源文件
        //指定配置文件地址
        String resource = "mybaits\mybaits.config.xml";
        //通过IO流 加载指定的配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //动态生成SqlSessionFactory
        sqlSessionFactory =
                new SqlSessionFactoryBuilder().build(inputStream);
    }

    
    @Test
    public void testFindWhere() {
        //获取SQLSession 类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取Mapper接口
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser demoUser = new DemoUser();
        demoUser.setAge(3000);
        List list = demoUserMapper.findWhere(demoUser);
        System.out.println(list);
        sqlSession.close();
    }

    
    @Test
    public void testUpdateSet() {
        //获取SQLSession 类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获取Mapper接口
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser user = new DemoUser();
        user.setId(1).setName("守山大使").setAge(4000).setSex("男");
        demoUserMapper.updateSet(user);
        sqlSession.close();
    }

    
    @Test
    public void testSelectChoose() {
        //获取SQLSession 类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取Mapper接口
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        DemoUser user = new DemoUser();
        user.setSex("男");
        List list = demoUserMapper.selectChoose(user);
        System.out.println(list);
        sqlSession.close();
    }
    @Test
    public void testFindDept(){
        //获取SQLSession 类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取Mapper接口
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List list = deptMapper.findAll();
        System.out.println(list);
        sqlSession.close();
    }

    
    @Test
    public void testoneToOne(){
        //获取SQLSession 类比 数据库链接
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        //获取Mapper接口
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        List list = empMapper.findAll();
        System.out.println(list);
        sqlSession.close();
    }
    
    @Test
    public void testOneToOne2(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        List list = empMapper.findAllWhere();
        System.out.println(list);
        sqlSession.close();
    }
    
    @Test
    public void testoneToMore(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        List list = deptMapper.findDept();
        System.out.println(list);
        sqlSession.close();
    }
    
    @Test
    public void cache1(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        List list1 = demoUserMapper.findAll();
        List list2 =demoUserMapper.findAll();
        List list3 =demoUserMapper.findAll();
        System.out.println(list1 == list2);
        sqlSession.close();
    }
    
    @Test
    public void cache2(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
        demoUserMapper.findAll();
        //关闭一级缓存
        sqlSession.close();

        SqlSession sqlSession2 = sqlSessionFactory.openSession();
        DemoUserMapper demoUserMapper2 = sqlSession2.getMapper(DemoUserMapper.class);
        demoUserMapper2.findAll();
        sqlSession2.close();
    }
}

                                        9, Mybatis补充知识:

参数取值特殊说明:

    

代理对象说明:

常见动态代理:

JDK动态代理
特点:
1.要求被代理者必须实现(有)接口.
2.JDK代理是jdk默认提供的.

CGLIB动态代理
特点:
1.不管被代理者是否有接口,都可以为其创建代理对象. 代理对象是目标对象的子类.
2.cglib需要手动导入jar包
3.spring为了创建代理对象方便,自身自动添加cglib依赖项.
Mapper接口说明:

 
    @Test
    public void testFindDeptById(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
        System.out.println(deptMapper.getClass());
        int id = 100;
        Dept dept = deptMapper.findDeptById(id);
        System.out.println(dept);
        sqlSession.close();
    }

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

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

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