ORM(Object Relation Mapping,对象关系映射)

表结构<–>类 表中字段 <–>类的属性 表中记录<–>对象

简单完成从数据库到对象的映射

定义javabean类

①TableInfo
存储表的结构和相关信息
②ColumnInfo
存储表中字段相关信息
③configuration
读相关配置信息
④FiledSetGet
存储一个字段转换的属性和set、get方法

进行数据库的连接

使用configuraction对象中的driver、url、user、pwd建立Connection对象

conn = DriverManager.getConnection(conf.getUrl(),conf.getUser(),conf.getPwd());

提取数据库的信息

使用Connection对象来获取到DatabaseMetaData对象
然后通过DatabaseMetaData对象可以获得表信息和字段信息
此时可使用TableInfo和ColumnInfo对获取到的信息进行存储

 public static Map<String, TableInfo> tables = new HashMap<String, TableInfo>();Connection conn = DBManager.getConn();DatabaseMetaData dbmd = conn.getMetaData();//获取库中所有的表(数据库名、表架构、表名、类型(TABLE、VIEW))//需指定库,否则会输出所有表ResultSet tableRet = dbmd.getTables(DBManager.getConfiguration().getUsingDB(), "%", "%", new String[] {"TABLE"});//对表中信息进行遍历while(tableRet.next()) {String tableName = (String)tableRet.getObject("TABLE_NAME");//初始化表对象TableInfo tInfo = new TableInfo(tableName,new HashMap<String,ColumnInfo>(),newArrayList<ColumnInfo>());tables.put(tableName, tInfo);//获取列对象,对其字段信息进行存储ResultSet set = dbmd.getColumns(null, "%", tableName, "%");while(set.next()) {ColumnInfo cInfo = new ColumnInfo(set.getString("COLUMN_NAME"),set.getString("TYPE_NAME"),0);tInfo.getColumns().put(set.getString("COLUMN_NAME"),cInfo);}    //获取主键相关信息ResultSet setPri = dbmd.getPrimaryKeys(null, "%", tableName);while(setPri.next()) {ColumnInfo cInfoPri = (ColumnInfo)tInfo.getColumns().get(setPri.getString("COLUMN_NAME"));cInfoPri.setKeyType(1);tInfo.getPriKeys().add(cInfoPri);}
}

建立数据类型转换函数

由于MySQL中的数据类型和Java中类型是不一样的,但每种类型都有相对应的类型
所以需要建立一个函数来将MySQL中的数据类型转换为Java中的数据类型

//进行主要数据类型的转换
public String databaseType2JavaType(String columnType) {//使用包装类型,方便转换if("varchar".equalsIgnoreCase(columnType)||"char".equalsIgnoreCase(columnType)) {return "String";}else if("int".equalsIgnoreCase(columnType)|| "smallint".equalsIgnoreCase(columnType)|| "integer".equalsIgnoreCase(columnType)) {return "Integer";}else if("BIT".equalsIgnoreCase(columnType)) {return "Byte";}else if("bigint".equalsIgnoreCase(columnType)) {return "Long";}else if("double".equalsIgnoreCase(columnType)|| "float".equalsIgnoreCase(columnType)) {return "Double";}else if("clob".equalsIgnoreCase(columnType)) {return "java.sql.Clob";}else if("blob".equalsIgnoreCase(columnType)) {return "java.sql.Blob";else if("date".equalsIgnoreCase(columnType)) {return "java.sql.Date";}else if("time".equalsIgnoreCase(columnType)) {return "java.sql.Time";}else if("timestamp".equalsIgnoreCase(columnType)) {return "java.sql.Timestamp";}return null; }

将ColumnInfo信息转换为java属性和方法

在ColumnInfo中存储着数据库中字段的名字、数据类型
我们可以借助这些内容将其转换为Java中一个属性和其set、get方法
借用StringBuilder来拼接字符串,评出属性、方法
PS:此处需要注意的是在表中提取到的字段名是小写,在拼接出set和get方法时,需要将其首字母转换为大写

/*** 根据字段信息生成java属性信息(Field、get()、set())* @param columnInfo    字段信息* @param convertor     类型转换器* @return   生成的源码*/public static JavaFieldGetSet createFieldGetSetSrc(ColumnInfo columnInfo, TypeConvertor convertor) {FieldGetSet jfgSet = new FieldGetSet();//依据字段类型获取java类型String FieldType = convertor.databaseType2JavaType(columnInfo.getDataType());//属性jfgSet.setFieldInfo(new StringBuilder().append("\tprivate ").append(javaFieldType+" ").append(columnInfo.getName()+";").append(CRLF).toString());//set方法jfgSet.setSetInfo(new StringBuilder().append("\tpublic void set"+StringUtils.firstChar2UpperCase(columnInfo.getName())+"("+javaFieldType+" "+columnInfo.getName()+"){").append(CRLF+"\t\tthis."+columnInfo.getName()+" = "+columnInfo.getName()+";").append(CRLF+"\t}"+CRLF).toString());//get方法jfgSet.setGetInfo(new StringBuilder().append("\tpublic "+javaFieldType+" get"+StringUtils.firstChar2UpperCase(columnInfo.getName())+"(){").append(CRLF+"\t\treturn this."+columnInfo.getName()+";").append(CRLF+"\t}"+CRLF).toString());  return jfgSet; }

将TableInfo信转换为一个完整的java类

由于TableInfo中存储着ColumnInfo对象,因此可遍历TableInfo中的字段信息
借助前一阶段所得到的属性和set、get方法,和一些必要的头文件来组成一篇完整的Java文件

/*** 根据表信息生成java类的源码* @param tableInfo* @param convertor* @return    源码的string类型*/public static String CreateJavaSrc(TableInfo tableInfo, TypeConvertor convertor) {StringBuilder sBuilder = new StringBuilder();Map<String, ColumnInfo> myColumn = tableInfo.getColumns();List<FieldGetSet> myOrign = new ArrayList<FieldGetSet>();//将字段信息,转化为源码for(ColumnInfo cInfo : myColumn.values()) {myOrign.add(createFieldGetSetSrc(cInfo, convertor));}//包名sBuilder.append("package  "+DBManager.getConfiguration().getPoPackage()+";"+CRLF);sBuilder.append(CRLF);//导入包sBuilder.append("import java.sql.*;"+CRLF);sBuilder.append("import java.util.*;"+CRLF);sBuilder.append(CRLF);//类声明sBuilder.append("@SuppressWarnings(\"all\")"+CRLF);sBuilder.append("public class "+StringUtils.firstChar2UpperCase(tableInfo.getName())+"{"+CRLF);//属性for(FieldGetSet jfgSet : myOrign) {sBuilder.append(jfgSet.getFieldInfo());}sBuilder.append(CRLF);//set、get方法for(JavaFieldGetSet jfgSet : myOrign) {sBuilder.append(jfgSet.getSetInfo());sBuilder.append(jfgSet.getGetInfo());}//结束sBuilder.append(CRLF+"}");return sBuilder.toString();}

将java类写入到项目的包中

借用配置文件中的srcPath和poPackage来拼接出java文件所在的路径
借助BufferedWriter来将拼接好的字符串写入java文件

/*** 将获取到的源码写入文件* @param tableInfo 表结构* @param convertor*/public static void JavaSrc2Package( TypeConvertor convertor) {StringBuilder path = new StringBuilder(DBManager.getConfiguration().getSrcPath());String dpath = DBManager.getConfiguration().getPoPackage().replace(".", "/");path.append(dpath).append("/");File dirFile = new File(path.toString());//若文件不存在,则创建  if(!dirFile.isDirectory()) {dirFile.mkdirs();}try {Map<String, TableInfo> myMap = TableContext.tables;for(TableInfo tInfo : myMap.values()) {BufferedWriter bWriter = new BufferedWriter(new FileWriter(new File(path.toString()+""+StringUtils.firstChar2UpperCase(tInfo.getName())+".java")));bWriter.write(CreateJavaSrc(tInfo, convertor));bWriter.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}   }
然后就完成了映射,从数据库表映射到一个java类,就可以将java对象和表中记录相对应

ORM(手写简单ORM)相关推荐

  1. 手写MyBatis ORM框架

    手写MyBatis ORM框架 目标: 实现: 思路: 一.前期准备 1.加入依赖 2.自定义插入注解 3.自定义删除注解 4.自定义更新注解 5.自定义查询注解 6.自定义参数注解 7.定义和数据库 ...

  2. Java之手写实现ORM框架

    借鉴Mybatis框架手写一个ORM框架.mybatis整体架构中的整体思路是,首先解析一下配置文件,一个是框架的全局配置文件,一个是mapper配置文件,定义格式如下 <configurati ...

  3. 手写简单的HashMap(jdk1.7)

    手写简单的HashMap(jdk1.7) public class MyHashMap<K, V> { //创建一个节点数组 private Entry1<K, V>[] ta ...

  4. 使用代理模式手写简单的数据库连接池

    使用代理模式手写简单的数据库连接池 JDBC直连数据库 思考 改造 ConnectionProxy ConnectionPool ProxyMain 运行结果 代理模式 与装饰器的区别 JDBC直连数 ...

  5. Dubbo——手写简单版Dubbo框架

    摘要 本博文将详细的介绍的一个手写简单版本的dubbo的实现. 项目架构原理图 项目源码实现 https://github.com/2462612540/DubboPrinciple/tree/mas ...

  6. 理解 call、apply、bind 原理,手写简单的 call、apply、bind 方法

    理解 call.apply.bind 原理,手写简单的 call.apply.bind 方法 call 原理及实现 MDN定义:call()方法使用给定的 this 值和单独提供的参数调用函数. 用自 ...

  7. 手写简单版 Promise

    Promise作为ES6新增的函数,帮助我们解决了回调地狱的难题,让我们的异步代码可以更加清晰简洁,作为一名前端程序员,手写简单版Promise应该是必备的技能.接下来不多说,直接上代码了. clas ...

  8. 数字识别实例两种实现方式(tensorflow2.x):1.调用高级API 2.手写简单神经网络 3.手写深度神经网络(DNN)

    MNIST手写数字数据库的训练集为60,000个示例,而测试集为10,000个示例. 一共4个文件,训练集.训练集标签.测试集.测试集标签,这些数据直接可以用mnist = tf.keras.data ...

  9. 手写简单的双向数据绑定

    github.com/logictuLuoq- 简单介绍一下MVVM MVVM是Model-View-ViewModel的简写 MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI ...

最新文章

  1. java slfj教程_SLF4J入门程序
  2. Boost:扩展分配器的测试程序
  3. 向量值函数在计算机工程与应用,拟Newton法在高阶矩阵中的应用-计算机工程与应用.PDF...
  4. 现有系统如何集成Consul服务发现
  5. 【图神经网络】向往的GAT(图注意力模型)
  6. android的opencv调试,Android opencv 2.3.1 调试及应用(第一篇)
  7. php安装mamcache扩展时报错
  8. extremecomponents
  9. [AI-Steering编程]九.路径跟随
  10. Office 针式打印机如何插入色带
  11. 软件系统设计-1-软件设计原则
  12. 使用python开发多人一对一聊天系统(文字聊天,视频通讯,文件传输)
  13. 网络营销试卷(参考答案及评分标准)
  14. 房产行业php_phpwind房产系统打响社区垂直行业应用
  15. 牛逼,手机居然可以无线投屏到笔记本电脑!
  16. CSP-M4补题 B_ZJM要抵御宇宙射线
  17. 利用opencv带你玩转人脸识别-上篇(读取图片,灰度转换,尺寸修改,绘制矩形快速入门)
  18. mt4查看虚拟服务器,mt4 如何查看服务器地址
  19. g团最多的服务器,艾泽拉斯服务器 5人BWL G团赏析(二)
  20. offictab,word ,excel多窗口插件

热门文章

  1. 分布式面试 - zookeeper 都有哪些使用场景?
  2. MySQL集群:高可用性DBMS
  3. SQL实用技巧:如何将表中某一列的部分数据合并到一行中
  4. 通过Android反编译技术研究国内陌生人社交即时通讯的技术方案
  5. Android Kotlin之kotlin-android-extensions使用
  6. 拒绝做思想的巨人,行动上的矮子
  7. gatsby_使用TinaCMS + Gatsby编辑Markdown的3种方法
  8. gatsby_如何在Gatsby.js中使用本地状态保持页面之间的状态
  9. pythonutf-8是不是二进制_python学习笔记8-9(字符编码与二进制)
  10. 常见的排序算法(面试经常碰到)