`

Mybatis Generator生成Mapper读写分离工具

    博客分类:
  • java
 
阅读更多

通过Mybatis Generator生成Mapper java类和xml配置文件后,执行我的工具即可实现读写分离。

package org.rwsplit.main;

import java.io.Closeable;
import java.io.IOException;

public class Base {
	protected static void close(Closeable... closeAbles){
        if (closeAbles == null || closeAbles.length <= 0) {
            return;
        }
        for (Closeable closeAble : closeAbles) {
            if (closeAble != null) {
                try {
                    closeAble.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

package org.rwsplit.main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import org.rwsplit.util.FileUtil;


public class RwSplit extends Base{
	static Properties ENVPRO = new Properties();
	static String FILENAME = "rwsplit.properties";
	static String JAVA_READ_HOME = "java.home";
	static String XML_READ_HOME = "xml.home";
	static String JAVA_EXT = "Mapper.java";
	static String XML_EXT = "Mapper.xml";
	
	public static void main(String[] args) {
		InputStreamReader envFr = null;
        FileInputStream fis = null;
        try {
        	fis = new FileInputStream(FILENAME);
            envFr = new InputStreamReader(fis,"UTF-8");
            ENVPRO.load(envFr);
            String javaHome = ENVPRO.getProperty(JAVA_READ_HOME);
            reJava(javaHome);
            String xmlHome = ENVPRO.getProperty(XML_READ_HOME);
            reXml(xmlHome);
        } catch (IOException e) {
        	e.printStackTrace();
        } finally {
            close(envFr,fis);
        }
	}
	
	private static void reJava(String javaHome) throws IOException {
		File file = new File(javaHome);
		File[] javaFile = file.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(JAVA_EXT) && !name.contains("Read") && !name.contains("Write");
			}
		});
		for(File java : javaFile){
			int index = java.getName().lastIndexOf(JAVA_EXT);
			File writeJava = new File(java.getParentFile(),"write/"+java.getName().substring(0, index)+"Write"+JAVA_EXT);
			FileUtil.copyFile(java, writeJava);
			replaceJavaContent(writeJava);
			File readJava = new File(java.getParentFile(),"read/"+java.getName().substring(0, index)+"Read"+JAVA_EXT);
			FileUtil.copyFile(java, readJava);
			replaceJavaContent(readJava);
			java.delete();
		}
	}
	
	private static void reXml(String xmlHome) throws IOException {
		File file = new File(xmlHome);
		File[] xmlFile = file.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				return name.endsWith(XML_EXT) && !name.contains("Read") && !name.contains("Write");
			}
		});
		for(File xml : xmlFile){
			int index = xml.getName().lastIndexOf(XML_EXT);
			File writeXml = new File(xml.getParentFile(),"write/"+xml.getName().substring(0, index)+"Write"+XML_EXT);
			FileUtil.copyFile(xml, writeXml);
			replaceNamespace(writeXml,"Write");
			File readXml = new File(xml.getParentFile(),"read/"+xml.getName().substring(0, index)+"Read"+XML_EXT);
			FileUtil.copyFile(xml, readXml);
			replaceNamespace(readXml,"Read");
			xml.delete();
		}
	}
	
	public static void replaceJavaContent(File java) throws IOException {
		String content = FileUtil.readTxtByNIO(30*1024, java);
		content = content.replaceFirst("(package .*?);", "$1."+(java.getName().contains("Read")?"read":"write")+";");
		String c2 = content.replaceFirst("public interface \\w+", "public interface "+java.getName().substring(0,java.getName().lastIndexOf(".")));
		FileUtil.writeFile(java, c2);
	}

	public static void replaceNamespace(File xml, String type) throws IOException {
		String content = FileUtil.readTxtByNIO(30*1024, xml);
		String c2 = content.replaceFirst("namespace=\"(.*?)\\.(\\w+)Mapper\"", "namespace=\"$1."+type.toLowerCase()+".$2"+type+"Mapper\"");
		FileUtil.writeFile(xml, c2);
	}


}

 

package org.rwsplit.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class FileUtil {

	public static void copyFile(File src, File dest) throws IOException {
		FileInputStream in = new FileInputStream(src);
		if (!dest.exists()){
			dest.getParentFile().mkdirs();
			dest.createNewFile();
		}
		FileOutputStream out = new FileOutputStream(dest);
		int c;
		byte buffer[] = new byte[1024];
		while ((c = in.read(buffer)) != -1) {
			for (int i = 0; i < c; i++)
				out.write(buffer[i]);
		}
		in.close();
		out.close();
	}

	public static void writeFile(File file,String content) throws IOException {
		file.delete();
		if (!file.exists()){
			file.getParentFile().mkdirs();
			file.createNewFile();
		}
		FileOutputStream out = new FileOutputStream(file, true);
		out.write(content.getBytes("utf-8"));
		out.close();
	}
	
	/**
	 * NIO读取文件
	 * 
	 * @param fin
	 * @return String
	 */
	public static String readTxtByNIO(int bufSize, File file){
		return readTxtByNIO(bufSize, file, "UTF-8");
	}
	
	/**
	 * NIO读取文件
	 * 
	 * @param fin
	 * @return String
	 */
	public static String readTxtByNIO(int bufSize, File file, String charset) {
		RandomAccessFile randomAccessFile = null;
		FileChannel fcin = null;
		StringBuilder strBuf = new StringBuilder();
		ByteBuffer rBuffer = ByteBuffer.allocate(bufSize);
		byte[] bs = new byte[bufSize];
		try {
			randomAccessFile = new RandomAccessFile(file, "r");
			fcin = randomAccessFile.getChannel();
			while (fcin.read(rBuffer) != -1) {
				int rSize = rBuffer.position();
				rBuffer.rewind();
				rBuffer.get(bs);
				rBuffer.clear();
				String tempString = new String(bs, 0, rSize, charset);
				strBuf.append(tempString);
			}
		}  catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fcin.close();
				randomAccessFile.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return strBuf.toString();
	}

}

 

java.home=C:/workspace2/apus/trunks/1.0/apus-web/src/main/java/com/odianyun/swift/apus/mapper
xml.home=C:/workspace2/apus/trunks/1.0/apus-web/src/main/resources/mapper

 

分享到:
评论

相关推荐

    MyBatis-Generator辅助XML生成,dao,bean配置XML生成

    MyBatis-Generator是一款强大的工具,它可以帮助开发者自动化地生成MyBatis相关的XML配置文件,以及对应的Java Bean和DAO类。这个工具极大地提高了开发效率,减少了手动编写这些基础代码的时间,使得开发者能够更加...

    mybatis_generator.zip

    MyBatis Generator(MBG)是一个强大的工具,用于自动生成MyBatis的SQL映射文件、Java POJO类以及DAO接口和实现类。这个工具极大地简化了开发过程,特别是当处理大量的数据库表时,可以避免手动编写重复的代码。...

    mybatis.generator

    MyBatis Generator(MBG)是一个强大的工具,用于自动生成MyBatis的Mapper XML文件、Java POJO(Plain Old Java Object)实体类以及相关的getter和setter方法。它极大地简化了开发工作,使得开发者无需手动编写这些...

    AOP实现一主多从数据库读写分离

    资源中整合了SSM,并实现了数据库读写分离。使用mybatis-generator动态生成mapper、dao、po,封装了常用的工具类,后期还继续维护,加上分布式缓存等等。

    Mybatis-generator

    Mybatis-Generator是一款强大的自动化工具,专为Mybatis框架设计,极大地简化了开发过程中对实体类、DAO接口和Mapper XML文件的手动编写工作。通过配置,它可以自动生成这些代码,帮助开发者快速构建项目,提高开发...

    Mybatis逆向工程jar包

    Mybatis逆向工程jar包是针对Mybatis框架的一种工具性资源,主要用于简化数据库表结构到Mybatis的Mapper接口、XML配置文件以及实体类的生成过程。这个压缩包包含四个jar文件,它们各自承担不同的功能,使得开发者能够...

    spring+struts2+mybatis整合。

    Mybatis Generator是一款自动化工具,能够根据数据库表结构自动生成Java实体类、Mapper接口和XML配置文件,大大减少了手动编写这些代码的工作量。只需配置好Generator的规则,就能一键生成符合需求的代码。 整合这...

    分库分表demo.zip

    MyBatis Generator是MyBatis框架的一个辅助工具,它可以自动生成MyBatis的Mapper接口、XML配置文件以及对应的实体类,极大地减少了手动编写这些代码的工作量。在分库分表场景下,MyBatis Generator可以生成针对每个...

    ShardingJDBC5.1.1按月分库分表、读写分离、自动创表完整demo

    它不依赖任何特定的ORM框架,可以与JDBC、MyBatis、Hibernate等无缝集成,支持水平扩展,实现分库分表、读写分离等高级功能。 二、环境配置 在本示例中,我们采用SpringBoot作为基础开发框架,Mybatis-Plus作为...

    (硅谷)通用Mapper源码例子.zip

    `Pro02MapperMBG`涉及到了MyBatis Generator(MBG),这是一个强大的代码生成工具。MBG可以自动生成MyBatis的Mapper接口、XML映射文件以及对应的实体类,大大减少了手动编写这些代码的时间。在本示例中,我们可能...

    redis+ssm+代码自动生成(dao,service,mapper)

    通过自动化工具,如MyBatis的Generator,可以根据数据库表结构自动生成这些层的模板代码,大大减少了重复劳动。 集成Redis到SSM中,需要在Spring配置文件中添加Redis的相关配置,包括连接池、序列化方式等。然后,...

    barter.zip

    3. **Mybatis Generator**:Mybatis Generator是一款代码生成工具,它可以基于数据库表自动生成Mybatis的Mapper接口、XML配置文件和Model类。在本项目中,使用"Mybatis-generator-config"配置文件,开发者可以定制化...

    json转java包

    1. **mybatis-generator1.3.2**:MyBatis Generator是一个强大的工具,它可以生成MyBatis的SQL映射文件、Java模型类和Java DAO接口。通过配置XML文件,用户可以指定数据库表,Generator会自动生成相应的Java代码,这...

    generator.rar

    本话题将深入探讨如何利用工具,如"generator.rar",从Mysql数据库表自动生成Mybatis的XML映射文件和Bean类,从而实现快速开发和提高效率。 首先,我们来理解一下核心概念: 1. **Mybatis**:这是一个基于Java的...

    代码生成工具

    "renren-generator"这个工具就是这样的一个例子,它的核心功能是基于数据库中的表结构,自动生成对应的Java代码,包括POJO(Plain Old Java Object)、DAO(Data Access Object)、Service以及Mapper文件。...

    基于springboot+mybatis开发的合同管理系统源码.zip

    4. MyBatis Generator:自动生成Model、Mapper接口及XML配置文件,减少手动编写代码。 5. 事务管理:与Spring集成,支持声明式和编程式事务管理。 在合同管理系统中,我们可以看到以下几个主要模块: 1. 用户管理:...

    分布式家庭记账本项目源码

    5. 自动化代码生成:描述中提到的“自动生成代码插件”可能指的是使用工具如MyBatis Generator或Lombok,这些工具能够自动根据数据库模型生成Java实体类、DAO层代码以及Mapper XML文件,提高开发效率,减少手动编码...

    Ibatis例子

    1. **安装与配置**:在MyEclipse中安装Ibatis支持的插件,如MyBatis Generator,它能自动生成SQL映射文件、模型类和DAO接口。同时,需要在项目的`pom.xml`或`build.gradle`文件中添加Ibatis的依赖库。 2. **创建...

    基于Dubbo实现的SOA分布式(没有实现分布式事务)-SpringBoot整合各种组件的JavaWeb脚手架+源代码+文档

    - MySQL主从复制,读写分离 - Spring Async - Spring Cache - Swagger - Spring Test - MockMvc - HTTPS - Spring DevTools - Spring Actuator - Logback+Slf4j多环境日志 - i18n - Maven Multi-Module - WebSocket ...

Global site tag (gtag.js) - Google Analytics