浅析ORM框架原理

Java是一门编程语言,控制程序逻辑
产生的数据,需要用另外程序来处理和保存(数据库、SQL专门用来操作数据的)

通信:标准 :java出了一套自己的标准 JDBC(Java DataBase Connection)  java和数据库连接的标准
跟数据库通信的规则:数据库桥接协议 jdbc:

第一步:要建立连接
第二步:要登陆数据库 用户名和密码
第三步:要通过Java程序来发送SQL命令给数据库,执行Java发过来的这些SQL(SQL语句,字符串)
第四步:要通过Java程序能够接收到数据所返回的结果。(包装)


ORM框架:
MyBatis  Hibernate  SpringJDBC  JPA


下面主要介绍如何把数据库中的表数据转化为java的对象

package com.lecheng.test;


import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.lecheng.bean.Member;

public class JdbcTest {

    public static void main(String[] args) {
        // 基本信息
        String driverClassName = "com.mysql.jdbc.Driver";

        // jdbc: java标准,jdbc连接协议标准
        // mysql,引入mysql-connector-java-5.x
        // 127.0.0.1:3306 哪台机器哪个端口
        // gupaoedu_demo数据库的名字


        String url = "jdbc:mysql://127.0.0.1:3306/gupaoedu_demo?characterEncoding=utf8";
        // 用户名和密码
        String username = "root";
        String password = "123456";
        // 1.加载驱动类,通过java的反射机制来加载驱动类
        try {
            Class.forName(driverClassName);
            // 2.建立连接,jdbc标准,DriverManager驱动管理类
            // Connection 对象里面包含了跟数据库建立连接以后的所有的信息,是这些信息的一个封装

            // 意味着我们可以利用Java这种编程语言跟数据库进行对话了
            Connection conn = DriverManager.getConnection(url, username, password);
            // 3.创建语句集,通过java程序来给数据库发SQL命令
            // 创建一个Statement对象,来对这些SQL语句进行封装
            // 检查你给的字符串是否满足SQL语法标准

            Statement stmt = conn.createStatement();
            // 这里给的字符串只能是满足SQL标准的字符串
            String sql = "select * from t_member";
            // 4.执行语句集
            // 执行完这条SQL语句以后,必然会得到一个结果
            // 这个结果在数据库中是数据库表中的某一条或者多条表格行记录
            // 用ResultSet对象,来封装数据库返回的这个表中的数据
            // ResultSet里面不仅只是包含了数据记录,而且还包含了这个表的整个结构


            ResultSet rs = stmt.executeQuery(sql);
            // 真正的值要游标才能取出来
            // rs提供了一个getMetaData的方法,可以用来获取表结构的信息

            
            
            Map<String, Integer> meta = new HashMap<String, Integer>();
            
            ResultSetMetaData metaData = rs.getMetaData();
            int count = metaData.getColumnCount();
            for (int i = 1; i <= count; i++) {
                String columnName = metaData.getColumnName(i);
//                String columnClassName = metaData.getColumnClassName(i);
//                String columnType = metaData.getColumnTypeName(i);

                System.out.print(
                         "" + columnName + "\t" );
                meta.put(columnName, i);
            }
            
            
            //利用反射机制自动获取Java类中定义的字段
            Class memberClass = Member.class;
            Field[] fields = memberClass.getDeclaredFields();
            
            //保存所有的ORM以后的对象
            List<Object> result = new ArrayList<Object>();
            
            while (rs.next()) {
                System.out.print("\n------------------------------------------------");
                System.out.print("\n");
                System.out.print(rs.getInt(1)+"\t");
                System.out.print(rs.getString(2)+"\t");
                System.out.print(rs.getString(3)+"\t");
                System.out.print(rs.getInt(4)+"\t");
                System.out.print(rs.getString(5)+"\t");
                //通常的开发过程中,我们都需要把这个结果处理成普通的Java对象用来传输,作为数据载体而存在
                //出现了各种各样的ORM框架
                //就相当于对ResultSet进行了二次封装
                //一般的框架会这样约定
                //一个java数据载体(model entity)表示数据库中的一行数据
                //Model所对应的类,就表示数据库表的表结构
                //相当于new Member()对象

                Object instance = memberClass.newInstance();
                
                for (Field field : fields) {
                    field.setAccessible(true);
                    
                    Object value = rs.getObject(meta.get(field.getName()));
                    
                    field.set(instance, value);
                }
                result.add(instance);
            }
            System.out.println(JSON.toJSONString(result, true));
            //5.关闭结果集
            rs.close();
            stmt.close();
            conn.close();
            
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

}

浅析ORM框架原理