java连接数据库自动生成bean

一、引言

在用过hibernate自动生成后,对于不断写pojo类比较厌烦,但现在许多用的框架并没有带自动生成功能,于是试着写了一个自动生成POJO的工具。

二、步骤

1、建立工程,要求jdk的版本必须在1.7以上。工程结构如下、

   2、首先连接数据库,这毋庸置言的,博主用的数据库是sqlserver2008。下面是properties的配置:

jdbc.properties:

</pre><pre name="code" class="plain">driverclass=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcUrl=jdbc:sqlserver://localhost:1433;DatabaseName=
databasename=test
user=sa
password=erry

</pre><span style="white-space:pre"></span>     <span style="font-size:18px">3、建立数据库的连接DbCreatePOJO.java</span><p></p><p><span style="font-size:18px"><span style="white-space:pre"></span></span></p><pre name="code" class="java">static {
		PropertiesReader pr = new PropertiesReader("jdbc.properties", "utf-8");
		DATABASENAME = (String) pr.getProperties().get("databasename");
		URL = (String) pr.getProperties().get("jdbcUrl")+DATABASENAME;
		JDBC_DRIVER =(String) pr.getProperties().get("driverclass");
		USER_NAME = (String) pr.getProperties().get("user");
		PASSWORD = (String) pr.getProperties().get("password");
		PACKAGENAME = "com.admin.bean";
	}
	
	/**
	 * 获得连接
	 * @return
	 */
	public static Connection getConnection() {
		try {
			Class.forName(JDBC_DRIVER);
			conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

  4、连接成功后,我们获取数据库中的表名和各个表中列的名称和属性,注意的是mysql和oracle、sqlserver对表名的查询方法都不同。

<span style="white-space:pre">	</span>String sql = "SELECT Name FROM test..SysObjects Where XType='U' ORDER BY Name";//sqlserver查询表名
<span style="white-space:pre">	</span>String sql = "select table_name from user_tables";//oracle 查询用户表(没有系统表)
<span style="white-space:pre">	</span>String sql = "select column_name,data_type from information_schema.columns where table_name = 表名";
<span style="white-space:pre">	select column_name,data_type  from user_tab_columns where table_name='</span>表名<span style="white-space:pre">'</span>;//oracle

  5、获取到表名和列名,然后建立名称规则MyStringUtils.java:

/**
	 * 类名定义
	 * @return
	 */
	public static String StringToCamleCaseClassName(String str){
		StringBuffer stringbf = new StringBuffer();
		Matcher m = Pattern
				.compile("([a-z])([a-z]*)", Pattern.CASE_INSENSITIVE).matcher(
						str);
		while (m.find()) {
			m.appendReplacement(stringbf, m.group(1).toUpperCase()
					+ m.group(2).toLowerCase());
		}
		
		return m.appendTail(stringbf).toString().replace("_","").replace(" ","");
	}
	/**
	 * 类属性定
	 * @param str
	 * @return
	 */
	public static String StringToCamleCaseClassProte(String str){
		StringBuffer stringbf = new StringBuffer();
		Matcher m = Pattern
				.compile("([a-z])([a-z]*)", Pattern.CASE_INSENSITIVE).matcher(
						str);
		while (m.find()) {
			m.appendReplacement(stringbf, m.group(1).toUpperCase()
					+ m.group(2).toLowerCase());
		}
		String result =  m.appendTail(stringbf).toString().replace("_","").replace(" ","");
		return	result.replaceFirst(result.substring(0,1),result.substring(0,1).toLowerCase());
	}
	
	public static String DatabasetypeConver(String type){
		switch (type) {
		case "int":;
		case "bit":;
		case "smallint":;
		case "tinyint":
			return "Integer";
		case "Float":;
		case "real":;
			return "float";
		case "numeric":;
			return "Double";
		case "datetime":;
		case "smalldatetime":;
		return "Date";
		default:
			return "String";
		}
	}
6、这是开始进行文件的生成 DbCreatePOJO.java

public static void CreatePojo(){
		try {
			getConnection();
			List<String> tables = getAllTables();
			for (int i = 0; i < tables.size(); i++) {
				String path = System.getProperty("user.dir")+"/src/"+PACKAGENAME.replace(".", "/");
				System.out.println(path);
				File createFolder = new File(path);
				//路径不存在,生成文件夹
				if (!createFolder.exists()) {
					createFolder.mkdirs();
				}
				String entityString = CreateEntityString(tables.get(i).trim());
				File entity = new File(createFolder.getAbsolutePath()+"/"+MyStringUtil.StringToCaml<span style="white-space:pre">				</span>eCaseClassName(tables.get(i))+".java");
				if (!entity.exists())
				{
					//写入文件 
					BufferedWriter out = new BufferedWriter(new FileWriter(entity, true));
					out.write(entityString);
		            out.close();
		            out = null;
		            entity = null;
				}
			}
			closeConnection();
			System.out.println("生成成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
/**
	 * 生成字段 声明
	 * @param connection
	 * @param tableName
	 * @return
	 */
	private static String CreateEntityString(String tableName){
		String tableConverName = MyStringUtil.StringToCamleCaseClassName(tableName);
		StringBuffer result  = new StringBuffer();
		StringBuffer tostring = new StringBuffer("\n	public String toString(){\n		return \"");
		result.append( "public class "+tableConverName+" implements java.io.Serializable{\n\n");
		result.append( "    private static final long serialVersionUID = 1L;\n");
		result.append( "    /**表名**/ \n");
		result.append( "    public static String TABLE = \""+tableConverName+"\";" );
		tostring.append(tableConverName+" [");
		String sql = "select column_name,data_type from information_schema.columns where table_name = '"+ta<span style="white-space:pre">		</span>bleName+"';";
		try {
			Statement statement = conn.createStatement();
			ResultSet resultSet =  statement.executeQuery(sql);
			while (resultSet.next()) {
				if (resultSet.getString(1)!=null&&!resultSet.getString(1).isEmpty()) {
					String datatype = MyStringUtil.DatabasetypeConver(resultSet.getString(2));
					if(datatype.equals("Date"))result.insert(0,"import java.util.Date;\n");
					String rowname1 = MyStringUtil.StringToCamleCaseClassProte(resultSet.getStr<span style="white-space:pre">					</span>ing(1));
					String rowname2 = MyStringUtil.StringToCamleCaseClassName(resultSet.getStri<span style="white-space:pre">					</span>ng(1));
					String row = "    private "+datatype+" "+rowname1+";";
					String getAndSet = "	public "+datatype+" get"+rowname2+"(){\n		<span style="white-space:pre">				</span>return this."+rowname1+";\n	}\n\n"
										+"	public void set"+rowname2+"<span style="white-space:pre">				</span>("+datatype+" "+rowname1+"){\n 		this."+rowname1+" = "+rowname1+"; \n	}";
 					String note = "	/****property****/";
 					tostring.append(rowname1+" =\"  +"+ rowname1 +"+\n		\", ");
					result.append("\n"+note + "\n" +row + "\n" + getAndSet);
				}
			}
			resultSet.close();
			statement.close();
			tostring.append(" toString ]\";\n	}");
			result.append("\n"+tostring.toString()+"\n");
			result.append("\n }");
			result.insert(0,"package "+PACKAGENAME+";\n\n");
			return result.toString();
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}


 
<pre name="code" class="java">/**
	 * 获得连接
	 * @return
	 */
	public static Connection getConnection() {
		try {
			Class.forName(JDBC_DRIVER);
			conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}


 
     6、贴上porperties读取文件PropertiesReader.java 
 

InputStream inputStream = null;
	private Properties properties;
	public PropertiesReader(String fileName, String encoding) {
		try {
			inputStream = Thread.currentThread().getContextClassLoader()
					.getResourceAsStream(fileName); 
			if (inputStream == null)
				throw new IllegalArgumentException(
						"Properties file not found in classpath: " + fileName);
			properties = new Properties();
			properties.load(new InputStreamReader(inputStream, encoding));
		} catch (IOException e) {
			throw new RuntimeException("Error loading properties file.", e);
		} finally {
			if (inputStream != null)
				try {
					inputStream.close();
				} catch (IOException e) {
					System.out.println("流关闭异常!\n" + e.getMessage());
				}
		}
	}
	
	public  Properties getProperties() {
		return properties;
	}
	public void setProperties(Properties properties) {
		this.properties = properties;
	}
    7、最后刷新工程,一看,bean包下已经生成了文件。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来根据数据库结构自动生成JavaBean、自动生成MyBaits的Mapper映射配置文件、自动生成数据库设计文档都是一件让人很头痛的事情,既浪费时间又很繁琐,看着几十上百个的成千上万个字段,真是一件让人痛苦的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,于是就自己用Swing写了一个基于数据库的自动化生成工具,支持MySQL、Oracle、SQLServce、PostgreSQL四种数据库,支持Window、Linux、MacBook等多个作系统,完美支持JPA注解,可以同时生成Entity和DTO等,可以自动去除前缀,支持单个和批量生成JavaBean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有注释了。更重要的是还能自动生成数据库设计文档和MyBaits的Mapper映射配置文件,如果有多个数据源还能批量生成,使用非常方便。 所有的配置都保存在本地,只要配置过一次,下次使用的时候完全可以秒生成JavaBean、MyBaits的Mapper映射配置文件和数据库设计文档,并且还集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆! TableGo v5.8.0版更新震撼发布,此次版本更新如下: 1、新增自定义文件功能,可以自己编写模板生成任意代码的文件。 2、新增数据源配置自动生成功能,项目分库分不用愁,一次搞定所有数据源。 3、公共参数界面新增别名和是否目录直通的配置。 4、生成Bean界面新增是否生成字段注释和重写equals,hashCode,toString方法的配置。 5、MyBatis配置界面新增根据所有字段条件查询数据的选项。 6、新增TableGo使用说明书。 7、更新数据库驱动版本,新版的驱动可能不支持JDK8以下的版本。 8、修复了大量的Bug并进行了一些优化。
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除前缀,并支持去除多个前缀,支持精确指定只生成哪几个Bean,也支持模糊查找生成哪几个Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆! 第12版更新震撼发布,此次版本更新如下: 1、新增参数配置管理功能,可以为不同的项目配置不同的参数。 2、新增快速新增参数配置功能,快速为项目添加参数配置。 3、新增选择实体注解功能,生成实体的时候自动为实体添加额外的注解。 4、弹出对话框界面大小调整。 5、新增数据源添加默认设置。 6、精确匹配在点更多时,已选中的会在弹出的列中被勾选中。 7、修复模糊匹配找不到的Bug。 8、其他一些小Bug的修改和代码优化调整。
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库转换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除前缀,并支持去除多个前缀,支持精确指定只生成哪几个Bean,也支持模糊查找生成哪几个Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的名和字段名的支持,例如名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选功能,在文本框中已选中的在打开选对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值