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

MyBatis嵌套查询、懒加载实现优化、逆向工程的实现

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

MyBatis嵌套查询、懒加载实现优化、逆向工程的实现

1、嵌套查询         嵌套查询其实算是个知识的扩充点把,就是不用写比较复杂的sql进行多表联查,而是通过xml文件把他们关联起来,当查询一个表的时候,也把另一个表查了 但是因为嵌套查询需要执行俩次sql语句,因此执行的效率会比执行一次的效率低  1.1 实体类 首先我们先查看数据库两张表的结构

可以看到两张表的关系是第一张表的id对应第二张表的dept_id

(1)导入依赖


    4.0.0

    com.qianwz
    mybatis02
    1.0-SNAPSHOT
    jar

    
        
            junit
            junit
            4.13
        
        
            com.alibaba
            druid
            1.0.9
        
        
            mysql
            mysql-connector-java
            8.0.26
        
        
            org.mybatis
            mybatis
            3.5.7
        
        
            org.projectlombok
            lombok
            1.18.20
        
        
            log4j
            log4j
            1.2.17
        
    

 (2)根据ROM创建实体类
package com.qianwz.entity;

import lombok.Data;
@Data
public class Department {
    private Integer id;
    private String name;
    private String location;
    
}
package com.qianwz.entity;


import lombok.Data;

@Data
public class Employee {
    private Integer id;
    private String name;
    private String salary;

    private Department departments;
}

(3)创建接口
package com.qianwz.dao;

import com.qianwz.entity.Department;


public interface DepartmentDao {
    Department findById(Integer id);
}
package com.qianwz.dao;
import com.qianwz.entity.Employee;

public interface EmployeeDao {
    Employee findById(Integer id);
}
(4)创建工具类
package com.qianwz.util;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;

public class DruidDataSourceFactory extends PooledDataSourceFactory {
    public DruidDataSourceFactory(){
        this.dataSource = new DruidDataSource();//替换数据源
    }
}
(5) 1、log4j.properties 的文件 方便我们之后查看懒加载
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2、db.properties 文件
db.driverClassName = com.mysql.cj.jdbc.Driver
db.url = jdbc:mysql://localhost:3306/javacoffee?serverTimezone=Asia/Shanghai&characterEncoding=UTF8
db.username=root
db.password=1234
(6)mybatis-config.xml 文件




    
    






    

        
    
    
        
            
            
                
                
                
                
            
        
    
    
        
    
(7)EmployeeDao.xml 与 DepartmentDao.xml   mapper文件





    
    
        
        
        
        
       

       
    
    
          select d.id,d.name,d.location
          from t_department d
          where d.id = #{id}
    

(8)测试代码
  @org.junit.Test
    public void test2() throws IOException {
        String resourrce = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resourrce);
        SqlSessionFactory build = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = build.openSession();
        EmployeeDao mapper = sqlSession.getMapper(EmployeeDao.class);
        Employee dById = mapper.findById(1);
        System.out.println(dById);
        sqlSession.close();
        inputStream.close();
    }

结果如下,可以看到执行的sql语句连接到一起了,并且查出来的结果和联合查询的结果差不多

2、懒加载         懒加载对于程序的优化很重要,这里就只是一个简单的小入门,便于大家了解懒加载这个是什么,就拿上面的代码举个栗子         首先我们把懒加载打开,把之前注释的代码取消注释一下

        当我们开启懒加载之前,我们控制台打印出来的日志文件如下,会看到执行了两次 sql语句,那么懒加载是什么?我的理解就是开启懒加载之后,程序就只会用什么加载 什么,也可以当成单例模式的懒汉式

 下面是开启懒加载之后,控制台打印出来的

可以看到现在只是执行了一半的sql语句,另一半没有执行,可能有的朋友发现他们用 了控制台打印这个对象,最后还是两条,我的理解是当你打印的时候,调用了他们的 toString方法,自然也就会执行两次sql了,懒加载这种思想,也就是用什么调什么方 法,大大节省了系统的开销,对于程序的优化很有用,在面试的时候也是很经常问的,

 3、IDEA逆向工程         逆向工程这名字听起来高大上,实际上可以理解为通过数据库表,生成一系列 mapper.xml 实体类等等的文件,就不用咱们按着数据库来一个一个苦逼的建实体类和 xml文件了,对于我们来说十分方便,同时生成的mapper文件中的方法也还挺重要 的,下面就简单介绍一下逆向工程的使用,其实生产逆向工程需要我们自己写的东西不 超过十行,完全cv大法

首先这是我的文件及结构

pom.xml文件导入依赖


    4.0.0

    com.coffee
    abs
    1.0-SNAPSHOT
    
        
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.6
            
        
    
    
        
            log4j
            log4j
            1.2.17
        
        
            org.mybatis
            mybatis
            3.5.7
        
        
            mysql
            mysql-connector-java
            8.0.26
        
        
            org.mybatis.generator
            mybatis-generator-core
            1.3.6

        

    

log4j的配置文件

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
generationConfig,xml文件




    
        
            
            
        
        
        
        

        
        
            
        

        
        
            
            
            
            
        
        
        
            
            
        
        
        
            
            
        
        
        

最后是工具类

package test;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class Generator {
    public void generator() throws Exception{
        List warnings = new ArrayList();
        boolean overwrite = true;
        
        File configFile = new File("D:\javast\java_ssm\abs\src\main\resources\generationConfig.xml");
        ConfigurationParser parser = new ConfigurationParser(warnings);
        Configuration config = parser.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,
                callback, warnings);
        myBatisGenerator.generate(null);
    }
    public static void main(String[] args) throws Exception {
        try {
            Generator generatorSqlmap = new Generator();
            generatorSqlmap.generator();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
注意!!! 我在写的时候也磕磕绊绊出现了很多问题 (1)报找不到文件的错误,当时我困惑了很久,因为我当时用的相对路径,怎么也找 不出路径上的错误,甚至都放到一个文件夹中也还是找不到,后来上网上找了找办法, 看了挺多的,因为我建的是Module文件而不是project文件,所以路径上可能有点不一 样,解决办法就是我把路径改为绝对路径,就可以找到了。

(2)log4j的日志文件不显示,我是先导入依赖再复制的properties文件,导致我的日 志文件打印不出来,后来先导入配置文件,再导入log4j依赖,就解决了

(3)控制台不报错,但是出不来文件,按照正确的来说当程序跑完之后,相应的一些 列文件就该出来了,可我还是不出来,我也试了刷新重启什么的,还是无效,后来也是 想到既然刚开始报找不到文件的错误,是不是导出文件的路径也有点问题,于是我也把 导出的pojo、mapper什么的路径都改为绝对路径,完美解决。

最后控制台输出的内容

 再看一下生成的文件,就可以使用啦!!!

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

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

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