浅析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();
}
}
}